Ir ao conteúdo

Posts recomendados

Postado

Senhores, boa noite.

Há alguns anos atrás resolvi aprender programação, como desde os 13 anos sempre fui autodidata em informática achei não seria difícil e realmente no início não foi, começou a ficar quando precisei incrementar minha aplicação e depender dos tutoriais e vídeo-aulas que tem por ai, não estou dizendo que eles não saibam programar, mas daí saber passar esse conhecimento é outros quinhentos.

Na verdade, os caras estão mais preocupados em mostrar que são os bons da programação, do que de fato ensinar um determinado método a alguém;

Como exemplo cito o nosso querido Macorrati, quantas coisas legais aprendi com os tutoriais desse cara, mas as horas que perdi tentando consertar seus exemplos também não foram poucas e quando digo horas isso quer dizer dias, porque achar um erro de programação pra quem é experiente é uma coisa, agora pra quem está aprendendo sozinho, só Deus sabe, a coisa piorou muito nesses últimos dias, pois depois de quase 2 anos sem mexer no Visual Studio resolvi retomar e para piorar de VB.NET resolvi ao mesmo tempo migrar para C#, imaginem?

Algumas coisas são notórias e achei até um site que faz a migração, sendo que como sabemos, nem tudo ele faz perfeitamente, então vamos a minha dúvida;

Até o momento eu não havia precisado usar classes não minha aplicação, quero dizer, uso classes mas dentro do meu FORM, e sei que é possível criar um arquivo com uma determinada classe e chamá-la e instanciá-la no FORM em questão, ainda estou aprendendo sobre o assunto e para começar eu preciso saber o seguinte;

Minha aplicação terá muitas janelas, entre formulário e tabelas auxiliares que estou criando, mas apesar de ser uma coisa super simples eu procurei por toda parte e não encontrei uma forma de criar uma classe que feche meu FROM, é possível?

Ao invés de ter que copiar e colar o código abaixo em 50 Forms, é possível chamar uma classe Fechar_Form por exemplo? Conto com a ajuda dos senhores, segue o que eu faço e como eu queria que fosse se possível;

 

private void btnFechar_Click(object sender, EventArgs e)

 

        if (MessageBox.Show("Deseja realmente fechar este formulário?", "Confirmando Fechamento", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)

 

                Application.Exit();

             }

Queria que fosse assim.

 

private void btnFechar_Click(object sender, EventArgs e)

 

Fechar_Form();

 

Detalhe, leia com atenção antes de responder, pois é inútil a pergunta ser sobre C# e o exemplo ser em java, por favor;

Postado

Também estou aprendendo e cada vez mais me apaixonando por programação!

Você pode usar o método "Close" para fechar um formulário. Fiz esse código rapidinho só pra ilustrar, espero que rode:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//formulário principal (pai)

namespace AbrindoEFechandoForms
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }


        /// <summary>
        /// Abre uma nova instância do filho 1
        /// </summary>
        private void btnFormFilho1_Click(object sender, EventArgs e)
        {
            frm1 frm1OBJ = new frm1();
            frm1OBJ.Show();
        }

        /// <summary>
        /// Abre uma nova instância do filho 2
        /// </summary>
        private void btnFormFilho2_Click(object sender, EventArgs e)
        {
            frm2 frm2OBJ = new frm2();
            frm2OBJ.Show();
        }

        /// <summary>
        /// Pega a coleção de todos os Forms abertos atualmente na aplicação
        /// </summary>
        private void btnFechaTodosOsFilhos_Click(object sender, EventArgs e)
        {
            var formsAbertos =  Application.OpenForms;
            Ajudante.fecharFilhos(formsAbertos);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AbrindoEFechandoForms
{
    public class Ajudante
    {

        /// <summary>
        /// Fecha todos os filhos passados em coleção
        /// </summary>
        /// <param name="frmsAFechar">Coleção de forms a serem fechados</param>
        public static void fecharFilhos(FormCollection frmsAFechar)
        {
            try
            {
                //enquanto a contagem da coleção for maior que 1 (apenas o FrmMain deve continuar rodando)
                while (frmsAFechar.Count > 1)
                {
                    for (int i = 0; i < frmsAFechar.Count; i++)
                    {
                        Form frm = frmsAFechar[i] as Form; //cria um objeto Form a partir do filho posicionado no index "i" atual
                        if (frm.Name != "FrmMain") //caso o nome desse filho não seja "FrmMain", feche-o:
                        {
                            frm.Close(); //aqui
                        }
                    }

                    
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message); // se der qualquer tipo de exceção, mostre para o usuário
            }
        }
    }
}

 

Postado
10 horas atrás, GKuze disse:

Também estou aprendendo e cada vez mais me apaixonando por programação!

Você pode usar o método "Close" para fechar um formulário. Fiz esse código rapidinho só pra ilustrar, espero que rode:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//formulário principal (pai)

namespace AbrindoEFechandoForms
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }


        /// <summary>
        /// Abre uma nova instância do filho 1
        /// </summary>
        private void btnFormFilho1_Click(object sender, EventArgs e)
        {
            frm1 frm1OBJ = new frm1();
            frm1OBJ.Show();
        }

        /// <summary>
        /// Abre uma nova instância do filho 2
        /// </summary>
        private void btnFormFilho2_Click(object sender, EventArgs e)
        {
            frm2 frm2OBJ = new frm2();
            frm2OBJ.Show();
        }

        /// <summary>
        /// Pega a coleção de todos os Forms abertos atualmente na aplicação
        /// </summary>
        private void btnFechaTodosOsFilhos_Click(object sender, EventArgs e)
        {
            var formsAbertos =  Application.OpenForms;
            Ajudante.fecharFilhos(formsAbertos);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AbrindoEFechandoForms
{
    public class Ajudante
    {

        /// <summary>
        /// Fecha todos os filhos passados em coleção
        /// </summary>
        /// <param name="frmsAFechar">Coleção de forms a serem fechados</param>
        public static void fecharFilhos(FormCollection frmsAFechar)
        {
            try
            {
                //enquanto a contagem da coleção for maior que 1 (apenas o FrmMain deve continuar rodando)
                while (frmsAFechar.Count > 1)
                {
                    for (int i = 0; i < frmsAFechar.Count; i++)
                    {
                        Form frm = frmsAFechar[i] as Form; //cria um objeto Form a partir do filho posicionado no index "i" atual
                        if (frm.Name != "FrmMain") //caso o nome desse filho não seja "FrmMain", feche-o:
                        {
                            frm.Close(); //aqui
                        }
                    }

                    
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message); // se der qualquer tipo de exceção, mostre para o usuário
            }
        }
    }
}

 

Gkuze bom dia.

Muito obrigado pelo seu comentário.

É quase isso que estou precisando, queria algo mais simples que fechasse apenas o Form atual, é claro que com o tempo vou usar esse exemplo que você descreveu, inclusive antes da minha pausa na programação eu havia feito algo parecido mas o intuito era de verificar se um determinado Form estava aberto para não abri o mesmo Form, se puder me ajudar, eu quero apenas uma classe tipo Fechar_form que eu possa usar em qualquer formulário, que apresente a mensagem; "Deseja realmente fechar este formulário?" e a resposta sendo SIM ele feche, não quero digitar essa classe no meu Form e sim chamá-lo, entende?

Grato.

Postado

Eu sei, porém além do CLOSE eu quero que apareça uma MessageBox solicitando a confirmação do usuário entre outras coisas que quero acrescentar no futuro, hoje faço assim;

 

private void btnFechar_Click(object sender, EventArgs e)

        if (MessageBox.Show("Deseja realmente fechar este formulário?", "Confirmando Fechamento", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)

 

                Application.Exit(); ou posso usar Close();

             }

O que eu quero saber é; Se eu posso criar uma classe, fora do meu Form e chamá-lo sempre que eu precisar.

Pode parecer sem nexo, mas com isso ganho um código mais limpo e as alterações que eu fizer nessa classe afetará todos os formulários que eu criar, quero que no meu btnFechar_click entre apenas a classe instanciada.

tipo:

private void btnFechar_Click(object sender, EventArgs e)

 

Fechar_form();

 

vou te dar outro exemplo mais claro:

 

Eu tenho uma classe chamada LocalizarCEP que é:

 

private void LocalizarCEP()

        {
            try
            {
                string xmlConsulta = "http://cep.republicavirtual.com.br/web_cep.php?cep=@cep&formato=xml";
                DataSet retornoDS = new DataSet();
                retornoDS.ReadXml(xmlConsulta.Replace("@cep", cepBox.Text));

                string status = retornoDS.Tables[0].Rows[0]["resultado"].ToString();

                if (status == "0")
                {
                    MessageBox.Show("O C.E.P informado não existe, informe um valor válido", "Consulta de C.E.P", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    cepBox.SelectAll();
                }

                else
                {
                    UFBox.Text = retornoDS.Tables[0].Rows[0]["uf"].ToString();
                    cidadeBox.Text = retornoDS.Tables[0].Rows[0]["cidade"].ToString();
                    bairroBox.Text = retornoDS.Tables[0].Rows[0]["bairro"].ToString();
                    logradouroBox.Text = retornoDS.Tables[0].Rows[0]["tipo_logradouro"].ToString();
                    enderecoBox.Text = retornoDS.Tables[0].Rows[0]["logradouro"].ToString();
                    lblMsg.Text = retornoDS.Tables[0].Rows[0]["resultado_txt"].ToString();
                    numeroBox.Focus();
                }

            }
            catch (Exception)
            {

                MessageBox.Show("Erro ao conectar com a base de dados", "Falha na conexão", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                cepBox.Clear();
                cepBox.Focus();
            }

        }

 

No meu cepBox_Keypress eu apenas digito:

 

if ((Keys)e.KeyChar == Keys.Enter)

LocalizarCEP();

 

Está funcionando perfeitamente, a questão é:

 

Eu não queria que essa classe estivesse no meu frmFuncionario, queria que estivesse como na imagem abaixo, ou seja, uma classe separada do FORM;

 

image.png.f4713507b9cbfe307a0baaea981156d1.png

adicionado 15 minutos depois

Pensando bem:

Parece que o que eu quero é usar uma classe dentro de outra classe

Que é a classe CLOSE, dentro da classe que darei o nome de Fechar_Form

É possível?

Postado

@André Luiz Pereira Machado O exemplo que eu dei é uma classe completamente separada do Form. Só está no mesmo arquivo. Se a classe "Ajudante" estivesse em outro arquivo de nome "Ajudante.cs" o efeito seria o mesmo. Tudo depende da utilização do mesmo Namespace. Então basta você criar um método e ao invés de passar um "FormCollection", como no meu Exemplo, passe um "Form".

classe_externa.PNG

classe_externa_codigo.PNG

Postado
3 horas atrás, GKuze disse:

@André Luiz Pereira Machado O exemplo que eu dei é uma classe completamente separada do Form. Só está no mesmo arquivo. Se a classe "Ajudante" estivesse em outro arquivo de nome "Ajudante.cs" o efeito seria o mesmo. Tudo depende da utilização do mesmo Namespace. Então basta você criar um método e ao invés de passar um "FormCollection", como no meu Exemplo, passe um "Form".

classe_externa.PNG

classe_externa_codigo.PNG

OK entendi, agora como chamo essa classe no meu btnfechar_ click?

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...