Inquiridor
Abrir outro form - Thread C#

Pergunta
-
Bom dia,
Eu estou desenvolvendo uma solução em WinForms, e preciso abrir dois forms, um deles através de uma outra Thread.
Alguém pode me ajudar?
- Editado Rooh Campos quarta-feira, 9 de julho de 2014 18:14
Todas as Respostas
-
-
Supimpa,
Não ajudou, ele dá um erro e fecha o programa.
- Editado Rooh Campos quarta-feira, 9 de julho de 2014 18:26
-
Segue código completo e testado.
Caso não funcione, poste o código do seu programa.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace Test_form { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } Form2 form2 = new Form2(); public void Open_Form() { if (Application.OpenForms.OfType<Form2>().Count() > 0) { MessageBox.Show("Formulário já está aberto"); } else { form2.Text = "Teste"; form2.Show(); Application.Run(form2); } } private void button1_Click(object sender, EventArgs e) { Thread t = new Thread(Open_Form); t.Start(); Thread.Sleep(500); } } }
- Editado Supimpa quarta-feira, 9 de julho de 2014 22:41
-
Supimpa,
O que eu preciso fazer é um pouco diferente, eu tenho um form e dentro dele preciso abrir outros 2.
O problema é que tenho dois equipamentos e preciso conectá-los em forms diferentes, só que quando abro esses dois forms, eles conectam em um só, e não cada um em um.
Segue o Código
public partial class frmGeral : Form { frmMerenda frmMerenda = new frmMerenda(); public frmGeral() { InitializeComponent(); } private void frmGeral_Load(object sender, EventArgs e) { ChamarFrmAcesso(); Thread t = new Thread(ChamarFrmMerenda); t.Start(); Thread.Sleep(500); } private void frmGeral_FormClosing(object sender, FormClosingEventArgs e) { Dispose(); Application.Exit(); } public void ChamarFrmMerenda() { frmMerenda.Show(); Application.Run(frmMerenda); } private void ChamarFrmAcesso() { frmAcesso frmAcesso = new frmAcesso(); frmAcesso.MdiParent = this; frmAcesso.Show(); } }
-
Ainda não tive este tipo de problema com Forms, mas tente desta forma.
public partial class frmGeral : Form
{Form form_padrao; //Crie um objeto do tipo form.
public void ChamarFrmMerenda() {
//Faça com que toda vez que chamar um formulário, seja criado uma nova instância do objeto.
//para receber o novo Form
form_padrao = new frmMerenda().
form_padrao.Show(); Application.Run(form_padrao); }
Este problema pode estar ocorrêndo por estarem acessando a mesma instância do objeto ou classe.
Caso o modo acima não dê certo, tente criar uma nova instância do Thread.
Thread thread = new Thread(new ThreadStart(ChamarFrmMerenda)); thread.Start();
- Editado Supimpa quinta-feira, 10 de julho de 2014 18:18
-
-
-
-
Daniel,
O meu código está exatamente como postei acima.
Ficaria mais ou menos assim, você vai ter que retirar o Parent de seu form ou vai precisar usar Thread-Safe :
public partial class frmGeral : Form { frmMerenda frmMerenda; public frmGeral() { InitializeComponent(); } private void frmGeral_Load(object sender, EventArgs e) { ChamarFrmAcesso(); Thread t = new Thread(ChamarFrmMerenda); t.Start(); // Thread.Sleep(500); } private void frmGeral_FormClosing(object sender, FormClosingEventArgs e) { Dispose(); Application.Exit(); } public void ChamarFrmMerenda() { frmMerenda = new FrmMerenda(); frmMerenda.Show(); Application.Run(frmMerenda); } private void ChamarFrmAcesso() { frmAcesso frmAcesso = new frmAcesso(); // frmAcesso.MdiParent = this; frmAcesso.Show(); } }
Teste desse modo !
- Editado Daniel Brito br segunda-feira, 14 de julho de 2014 13:13 Comentario retirado.
-
-
Daniel,
Retirando o Parent ele continuou dando erro.
Nesse projeto, eu preciso do Parent, porque como abro mais forms, ele ira abrir varias janelas, ficando desorganizado pro cliente.
-
Daniel,
Retirando o Parent ele continuou dando erro.
Nesse projeto, eu preciso do Parent, porque como abro mais forms, ele ira abrir varias janelas, ficando desorganizado pro cliente.
Mas eu alterei a instância de seu Form também ! Copie e cole o código conforme eu fiz !
Ainda deu o erro, copiei seu código e colei.
-
-
-
Daniel,
O erro ele só gera ao rodar o programa, então não tem como saber a linha.
Eu não sei se pode ser isso, mas em cada form eu uso uma dll para usar biometria, não sei se ele pode estar dando conflito por eu usar a mesma.
Rooh,
não tem jeito só colocando um breakPoint com a tecla F9 e ir vendo passo a passo usando F10 para verificar onde gera o erro faça isso coloque um breakpoint e veja onde gera o erro, sem debug não tem como mesmo saber o que está ocorrendo !
-
-
-
Rooh, você precisa corrigir essas instâncias do formulário.
frmAcesso frmAcesso = new frmAcesso();
Vc não pode usar o nome do Objeto para instânciar em uma variável com o mesmo Nome.
Altere esta linha: frmAcesso frmAcesso = new frmAcesso(); Para: frmAcesso frmacesso = new frmAcesso(); //frmacesso
ou qualquer outro nome que a variável que recebe a instância do formulário fique diferente.
Acho que por isso que está apresentando o erro.
Esta declaração de tipo de variável também não está correta.
frmMerenda frmMerenda;
Vc precisa declarar um variável do tipo objeto ou Form para que possa usa-lá para receber a instância do formulário e não podem ter o mesmo nome.
Poste o código e o nome de cada Form para que possamos te ajudar.
- Editado Supimpa segunda-feira, 14 de julho de 2014 17:32