none
Duvidas em VS e c# RRS feed

  • Pergunta

  • Pessoal,
    estou fazendo meu programa em C# usando o VS2008.
    Porem estou encontrando algumas dúvidas.
    Em java quando eu queria fechar a janela e abrir a outra bastava fazer nomeDoObjeto.dispose() e se eu queria sair bastava usar o exit.

    em c# eu ja tentei nomeDoObjeto.Close(),, ja tentei nomeDoObjeto.Dispose() mas mesmo assim ele fecha meu aplicativo todo e nao apenas a janela que fechei...

    Outra duvida eh, ao apertar o X de sair no topo da janela, ele nao da um exit mesmo no programa, ele faz o que eu quero acima, da um dispose...ai o programa continua aberto na memoria só que sem tela nenhuma, ai temos que finalizar usando o crtl+alt+del...

    Entao minha pergunta

    1) Como fecho definitivamente uma janela que nao mais usarei sem fechar o aplicativo??
    2) como apenas escondo a janela sem fechar pra quando eu precisar abrir de novo nao criar um novo objeto??
    3) Como fazer o X do aplicativo fechar definitivamente o aplicativo(como se fosse um system.exit)???

    VLW pessoal.
    quarta-feira, 10 de junho de 2009 23:04

Respostas

  • Ah
    Se voce nao quer forçar o foco para um controle fora da ordem, basta voce definir a ordem correta dos controles. Como seu campo CPF é o primeiro do form ele virá naturalmente com o foco nele. Para isso, vá no menu "View -> Tab Order".. Aí é so configurar a ordem dos controles...

    Qto ao fechar.. agora sim ta explicado pq está fechando a aplicacao toda, como vc questionou no inicio. Voce não pode fazer dessa forma que colocou... Assim voce está fechando a janela ANTES de abrir a CriarUsuario, ou seja, nenhuma janela ficará aberta!!!

    Não sei o que está acontecendo no form CriarUsuario, apos criado um usuario com sucesso, o que ele faz? Vai para outra janela??

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta RaphaelSantos quinta-feira, 11 de junho de 2009 04:36
    quinta-feira, 11 de junho de 2009 04:27
  • Nunca usei o Hide, porem se conseguisse esconde-lo, o form ficaria ocupando espaço em memoria durante toda a vida de sua aplicação. Nao é aconselhavel.

    Qto ao redimensionamento, mexa nas opcoes da propriedade FormBorderStyle (uma das primeiras na janela de Propriedades do form).

    Estou saindo. Qualquer coisa é só postar que assim que eu tiver tempo (e conhecimento pra isso) eu respondo.

    []s
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta RaphaelSantos quinta-feira, 11 de junho de 2009 05:17
    quinta-feira, 11 de junho de 2009 05:02

Todas as Respostas

  • Olá Raphael,
    1) Se vc quer via codigo, pode ser o this.Close(); (onde this é o seu form). Mas voce pode fecha-lo pelo "X". Se for um form do tipo Dialog, pode colocar um botao Cancelar e definir a propriedade DialogResult do botão para "Cancel".

    2) propriedade Visible do form (this.Visible = false;) (porem não considero uma boa prática, estará com varias janelas abertas ocupando memória. É melhor fecha-la)

    3) o X do aplicativo fecha definitivamente o aplicativo. Que SO voce usa? (mas apenas respondendo, para fechar via código chame Application.Exit();)

    Qualquer dúvida, é só postar.
    []s

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    quarta-feira, 10 de junho de 2009 23:18
  • Olá Raphael,
    1) Se vc quer via codigo, pode ser o this.Close(); (onde this é o seu form). Mas voce pode fecha-lo pelo "X". Se for um form do tipo Dialog, pode colocar um botao Cancelar e definir a propriedade DialogResult do botão para "Cancel".

    2) propriedade Visible do form (this.Visible = false;) (porem não considero uma boa prática, estará com varias janelas abertas ocupando memória. É melhor fecha-la)

    3) o X do aplicativo fecha definitivamente o aplicativo. Que SO voce usa? (mas apenas respondendo, para fechar via código chame Application.Exit();)

    Qualquer dúvida, é só postar.
    []s

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]

    Olá Robson, obrigado pela resposta.
    Bom vamos la, estou usando o Visual Studio 2008 SP1 e o Windows Seven RC1

    é como eu disse, o this.Close() ta fechando tudo. Ele fecha o aplicativo atual e nao abre o form novo...
    e aqui em casa o X ta apenas escondendo, ele fecha a tela nao da um exit...se no aplicativo main eu apertar o X ele continua na memoria.
    Em java tinha como eu setar o X para da um dispose ou um exit e em C# nao tou achando. Eu posso criar o botao fechar o problema eh q usuario sempre gosta de fechar pelo X.
    Se nao tiver como setar o X para fechar definitivamente, como fazer o botao X ficar desabilitado(assim obrigando a pessoa a usar o botao fechar?)?

    Aproveitando o embalo, no meu form tenho alguns Textfield e MaskedTextfiled alem de TextArea, como faço pra setar o foco inicial em algum deles(o cursor do teclado ja ficar piscando em um field diferente)???
    quarta-feira, 10 de junho de 2009 23:25
  • Quanto ha ainda ficar na memoria, talvez seja algo referente ao Windows Seven.

    Especifique melhor o seu cenário.

    De onde voce está chamando esse this.Close ? Você tem um form pai (MdiContainer=true) como o menu da aplicacao e os demais forms sao abertos dele (como MdiChild) ??

    Qto ao dispose, o Close do form se encarrega disso para voce.

    []s


    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    quarta-feira, 10 de junho de 2009 23:31
  • Quanto ha ainda ficar na memoria, talvez seja algo referente ao Windows Seven.

    Especifique melhor o seu cenário.

    De onde voce está chamando esse this.Close ? Você tem um form pai (MdiContainer=true) como o menu da aplicacao e os demais forms sao abertos dele (como MdiChild) ??

    Qto ao dispose, o Close do form se encarrega disso para voce.

    []s


    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    Olá Robson,
    Nao sei se eh referente ao seven pq no VS quando fechamos o aplicativo, ele volta do estado de debug para o editor.. equando eu aperto o X, a tela some da tela porem o debug na finaliza, ai ou finalizo o .exe pelo gerenciador de tarefas ou eu dou stop no debug...

    Vou copiar assim que ligar o notebook a parte do meu código pra ver se ajuda.

    Quanto ao foco, vc sabe me informar?
    quinta-feira, 11 de junho de 2009 01:00
  • Olá

    Não havia lido a questão do foco! Basta, no evento Load do form, colocar:

    textbox1.Focus();

    ---------------------------

    Qto a desabilitar o botão X do form, não é possível fazer isso "diretamente". Você pode sumir com ele alterando a propriedade do form "ControlBox " para "false". Porém, com isso, voce some com o icone, o minimizar e o maximizar.

    Se voce quiser mesmo desabilitar o X, terá que recorrer à API do Windows. É simples. Abaixo tem um exemplo (porém em VB).

    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/33ace42c-6e47-4047-9eb4-fac282fa8452/

    Dê uma procurada no forum por "desabilitar botão fechar" que voce encontrará outras respostas que podem ser uteis.
    ----------------------------

    Qto à última questão, sobre não finalizar no debug, o normal é que, ao fechar o programa, o VS pare o debug (MESMO FECHANDO NO 'X'). Por isso, acho que pode ter algo a ver com o Windows 7. Se puder, experimente testar no Vista ou XP.

    []s


    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    quinta-feira, 11 de junho de 2009 03:57
  • Olá Robson, vlw pela ajuda de novo.
    Tentei fazer uso do focus() e ficou assim meu codigo
    private void Login_Load(object sender, EventArgs e)
            {
                maskedTextBox2.Focus();
            }
    mas conforme imagem, o focus continua no maskedTextBox3(que eh o campo senha)

    http://img31.imageshack.us/i/foto1r.png/

    Quanto ao código com o fechamento ta assim
    private void ButtonOK(object sender, EventArgs e)
            {
                ConexaoMySQL sql = new ConexaoMySQL();
                md5 = new MD5();
                String cpf = maskedTextBox2.Text;
                cpf = cpf.Replace(',','.');
                String senha = maskedTextBox3.Text;
                
                if (cpf.Equals("") || senha.Equals(""))
                    MessageBox.Show("CPF ou Senha faltantes!!!", "ERRO!", MessageBoxButtons.OK);
                else
                {
                    senha = md5.getMD5(senha);
                    if (sql.verificarUsuario(cpf,senha))
                    {
                        this.Close();
                        banco = new Banco(cpf);
                        banco.ShowDialog();
                    }
                    else
                    {
                        if (sql.verificarUsuario(cpf))
                            MessageBox.Show("Senha incorreta", "ERRO NA SENHA", MessageBoxButtons.OK);
                        else
                        {
                            DialogResult result = MessageBox.Show("USUÁRIO SELECIONADO NÃO EXISTE.\n Deseja criar um usuário??", "CRIAR USUÁRIO", MessageBoxButtons.YesNo);
                            if (result.ToString().Equals("Yes"))
                            {
                                this.Close();
                                criar = new CriarUsuario(cpf);
                                criar.ShowDialog();
                            }
                        }
                    }
                        
                }
            }
    Infelizmente nao tenho outro sistema operacional pra testar e nao to querendo formatar o note pra colocar o vista :(

    Quanto ao botão X vou pesquisar..
    quinta-feira, 11 de junho de 2009 04:17
  • Ah
    Se voce nao quer forçar o foco para um controle fora da ordem, basta voce definir a ordem correta dos controles. Como seu campo CPF é o primeiro do form ele virá naturalmente com o foco nele. Para isso, vá no menu "View -> Tab Order".. Aí é so configurar a ordem dos controles...

    Qto ao fechar.. agora sim ta explicado pq está fechando a aplicacao toda, como vc questionou no inicio. Voce não pode fazer dessa forma que colocou... Assim voce está fechando a janela ANTES de abrir a CriarUsuario, ou seja, nenhuma janela ficará aberta!!!

    Não sei o que está acontecendo no form CriarUsuario, apos criado um usuario com sucesso, o que ele faz? Vai para outra janela??

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta RaphaelSantos quinta-feira, 11 de junho de 2009 04:36
    quinta-feira, 11 de junho de 2009 04:27
  • Ah
    Se voce nao quer forçar o foco para um controle fora da ordem, basta voce definir a ordem correta dos controles. Como seu campo CPF é o primeiro do form ele virá naturalmente com o foco nele. Para isso, vá no menu "View -> Tab Order".. Aí é so configurar a ordem dos controles...

    Qto ao fechar.. agora sim ta explicado pq está fechando a aplicacao toda, como vc questionou no inicio. Voce não pode fazer dessa forma que colocou... Assim voce está fechando a janela ANTES de abrir a CriarUsuario, ou seja, nenhuma janela ficará aberta!!!

    Não sei o que está acontecendo no form CriarUsuario, apos criado um usuario com sucesso, o que ele faz? Vai para outra janela??

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]

    Quando fiz a ordem de tabulaçao ficou como eu queria :D
    mas ai entao o metodo Focus() nunca funciona? pq dp de corrigir tentei setar o focus para o campo de senha somente pra testar e nao foi :(

    quando aperto OK ele verifica se existe usuario. Se existir ele entra ele fecha permanente mente a tela login pois pra se logar de novo tem que entrar de novo no programa, num form do banco onde pode fazer pagamentos de fatura, verificar saldos, etc..
    Se o usuario nao existir ele abre um form para criar um usuario.
    nessa tela tem 2 botoes, OK e CANCELAR..se apertar cancelar ele retorna para a tela de login(por isso quero sumir ela sem fechar nessa situacao), se apertar OK ele cadastra o usuario e abre a tela direto do banco...
    quinta-feira, 11 de junho de 2009 04:36
  • Bom, só pra adiantar. Vou te falar como pode ser feito.

    No botao acima, retire o Close e chame seu form CriarUsuario. Apos criar o usuario, ele retornara para o form de autenticacao, sendo assim ele preenche os dados de acesso e conecta.

    Outra opção seria criar um usuario default (sem precisar chamar um form pra isso), pois da forma que está sempre ficará aberto pro usuario criar "trocentas" contas (nao sei se voce controla isso de alguma forma).

    E, por ultimo, chame o menu principal do programa PRIMEIRO (ele sera a entrada do programa) e a partir dele é que voce chama a tela de login.

    []s

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    quinta-feira, 11 de junho de 2009 04:37
  • Bom, só pra adiantar. Vou te falar como pode ser feito.

    No botao acima, retire o Close e chame seu form CriarUsuario. Apos criar o usuario, ele retornara para o form de autenticacao, sendo assim ele preenche os dados de acesso e conecta.

    Outra opção seria criar um usuario default (sem precisar chamar um form pra isso), pois da forma que está sempre ficará aberto pro usuario criar "trocentas" contas (nao sei se voce controla isso de alguma forma).

    E, por ultimo, chame o menu principal do programa PRIMEIRO (ele sera a entrada do programa) e a partir dele é que voce chama a tela de login.

    []s

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]

    Vou usar sua primeira dica pra modificar =D
    Quanto ao limite de usuario etc eu modificarei isso mais na frente, por enquanto quero facilitar meu trabalho pra nao criar outros form pra isso.

    Só um detalhe, sem querer achei o metodo this.Hide() que aparentemente esconde a tela.. eh aconselhavel o uso dele? eh o que eu tava querendo???


    e se me permite mais uma chatisse, qual a propriedade que nao permite o usuario nao redimensionar o form???
    quinta-feira, 11 de junho de 2009 04:42
  • Nunca usei o Hide, porem se conseguisse esconde-lo, o form ficaria ocupando espaço em memoria durante toda a vida de sua aplicação. Nao é aconselhavel.

    Qto ao redimensionamento, mexa nas opcoes da propriedade FormBorderStyle (uma das primeiras na janela de Propriedades do form).

    Estou saindo. Qualquer coisa é só postar que assim que eu tiver tempo (e conhecimento pra isso) eu respondo.

    []s
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta RaphaelSantos quinta-feira, 11 de junho de 2009 05:17
    quinta-feira, 11 de junho de 2009 05:02
  • Nunca usei o Hide, porem se conseguisse esconde-lo, o form ficaria ocupando espaço em memoria durante toda a vida de sua aplicação. Nao é aconselhavel.

    Qto ao redimensionamento, mexa nas opcoes da propriedade FormBorderStyle (uma das primeiras na janela de Propriedades do form).

    Estou saindo. Qualquer coisa é só postar que assim que eu tiver tempo (e conhecimento pra isso) eu respondo.

    []s
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]

    Obrigado robson, ajudou demais...
    Acho que agora me viro.. qualquer coisa volto a aperriar voces =D
    quinta-feira, 11 de junho de 2009 05:18
  • 1)
    this.Hide();
    form1 f2 = new form2();
    f2.Show();

    Isso irá 'esconder' a o form1 e abrira o form2. Ambas estarão abertas, mas só será visto o form2.

    2)
    Eu resvolvi da mesma forma que a 1° questão.
    Escondi o form2 e abri o form1. Acredito que deva ter soluções mais CORRETAS, mas no momento(como minha aplicação é leve) essa forma resolve esse problema.

    3)
    Selecione o form que deseja e em properties em Events, de um duplo clique em FormClosing e escreva:Application.Exit();

    Espero Ter Ajudado.
    Ps.: Se aceitar essa resposta, marque ponto para mim.

    Atenciosamente, USilvestre - usilvestre@gmail.com -
    quinta-feira, 16 de julho de 2009 12:08
  • olha raphael santos,eu não sou experiente em programação mas pq vc não pôe um "butto" na tela que vc quer e clicar no botão 2x então ela vai pro codigo então vc digita:
                                    
    this.Close();




    Espero ter ajudado.
    segunda-feira, 24 de agosto de 2009 20:14