none
Classes e WinForm RRS feed

  • Pergunta

  • Olá, eu tenho varias classes e 1 WinForm, mas aqui vou dar o exemplo com 2 classes e 1 WinForm.

    1 class: essa classe tem um método que poderia ser chamado através da outra e com a função de imprimir uma mensagem no Winorm(em um richTextBox, textBox, etc..)

    2 class: essa é a classe onde deveria ser chamado a função da classe 1, e com isso aparecer a mensagem no WinForm
    --------

    Bem, eu tenho utilizado o seguinte código na CLASSE 1:
    public static void WriteRich(RichTextBox rtbx, string texto)
    {
    rtbx.AppendText(texto);
    }

    na CLASSE 2 eu uso ela:
    Form1 form = new Form1();
    WriteRich(form.richTextBox1, "Texto que deveria aparecer no WinForm");

    --------

    e no Form a mensagem que deveria aparecer no rich, não aparece.. eu utilizei esse método através de um button no form mesmo, e assim funciono..

    private void button1_Click(object sender, EventArgs e)
    {
    WriteRich(form.richTextBox1, "Texto que deveria aparecer no WinForm");
    }

    -------
    o que eu preciso fazer para que eu possa usar este método através de qualquer classe e aparecer no richTextBox.

    Obrigado.
    segunda-feira, 31 de outubro de 2011 16:31

Respostas

  • berTrito,

    O ponto é esse - se você cria um outro objeto dentro da sua classe 2, você não vai ter a referencia do form em exibição, é outro objeto, outra coisa, não é o que você está vendo na tela. Faz assim: coloca no construtor da classe 2 uma referencia para o form e no escopo da Classe 2, mantém um campo como referencia:

    private Form1 oForm;

    public Class2(Form1 meuForm)
    {
         this.oForm = meuForm;
    }

    .... agora, quando for chamar o método dentro da classe 2, você faz isso:

    WriteRich(this.oForm.seuRichTextBox, "seu texto");

    ... e você precisa da instancia do Form que você quer exibir o texto, então no Form1, quando instanciar a Classe 2, você passa ele como referencia:

    Classe2 c2 = new Classe2(this);

    ... agora esse objeto tem uma referencia válida de um form em exibição e vai conseguir manipulá-lo.

    Abraços,

    Francisco

    • Marcado como Resposta berTrito segunda-feira, 31 de outubro de 2011 18:16
    segunda-feira, 31 de outubro de 2011 17:43
    Moderador
  • Boa tarde berTrito,

    aparentemente a solução para o seu problema é a atualização do formulário, utilize o código abaixo para forçar um Refresh no controle.

    public static void WriteRich(RichTextBox rtbx, string texto)
    {
         rtbx.AppendText(texto);
         rtbx.Refresh();
    }
    
    Abraços,


    Daniel Cheida de Oliveira
    • Sugerido como Resposta Daniel Cheida segunda-feira, 31 de outubro de 2011 17:52
    • Marcado como Resposta berTrito segunda-feira, 31 de outubro de 2011 18:35
    segunda-feira, 31 de outubro de 2011 17:51

Todas as Respostas

  • berTrito,

    O lance é a referencia do seu form. Por exemplo, se você está dentro de um form e quer que o controle daquele form seja preenchido, você tem que passar a referencia do controle do seu form para o método, não instanciar outro form e passá-lo como parametro. Então o evento Click do seu botão seria isso:

    WriteRich(this.richTextBox1, "Alguma Coisa");

    No seu código da Classe 2, você instanciou o form, passou ele como parametro, mas não chamou a exibição dele:

    Form1 form = new Form1();
    WriteRich(form.richTextBox1, "Texto que deveria aparecer no WinForm");
    form.Show();

    Abraços,

    Francisco

    segunda-feira, 31 de outubro de 2011 16:42
    Moderador
  • Eu estava dizendo que pelo botão já estava funcionando, sem precisar do "this", ele funciona normalmente usado por algum button do form, o problema é que ele não funciona através de uma classe, não aparece no richtextbox a mensagem escrita dentro da classe, e o Form não precisa do .Show, porque ele já está visivel na verdade.
    segunda-feira, 31 de outubro de 2011 17:01
  • berTrito,

    O ponto é esse - se você cria um outro objeto dentro da sua classe 2, você não vai ter a referencia do form em exibição, é outro objeto, outra coisa, não é o que você está vendo na tela. Faz assim: coloca no construtor da classe 2 uma referencia para o form e no escopo da Classe 2, mantém um campo como referencia:

    private Form1 oForm;

    public Class2(Form1 meuForm)
    {
         this.oForm = meuForm;
    }

    .... agora, quando for chamar o método dentro da classe 2, você faz isso:

    WriteRich(this.oForm.seuRichTextBox, "seu texto");

    ... e você precisa da instancia do Form que você quer exibir o texto, então no Form1, quando instanciar a Classe 2, você passa ele como referencia:

    Classe2 c2 = new Classe2(this);

    ... agora esse objeto tem uma referencia válida de um form em exibição e vai conseguir manipulá-lo.

    Abraços,

    Francisco

    • Marcado como Resposta berTrito segunda-feira, 31 de outubro de 2011 18:16
    segunda-feira, 31 de outubro de 2011 17:43
    Moderador
  • Boa tarde berTrito,

    aparentemente a solução para o seu problema é a atualização do formulário, utilize o código abaixo para forçar um Refresh no controle.

    public static void WriteRich(RichTextBox rtbx, string texto)
    {
         rtbx.AppendText(texto);
         rtbx.Refresh();
    }
    
    Abraços,


    Daniel Cheida de Oliveira
    • Sugerido como Resposta Daniel Cheida segunda-feira, 31 de outubro de 2011 17:52
    • Marcado como Resposta berTrito segunda-feira, 31 de outubro de 2011 18:35
    segunda-feira, 31 de outubro de 2011 17:51
  • cara, eu tentei não funciono, desisto..
    segunda-feira, 31 de outubro de 2011 18:46
  • já tinha tentado isso, mas obrigado por tentar ajudar..
    segunda-feira, 31 de outubro de 2011 18:47