• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

sergiofer

Troca de informação entre form's

23 mensagens neste tópico

Olá a todos

Tenho o seguinte problema: Um programa en VB.net com 2 form's, e preciso de escrever na form2 um valor da form1, assim que o escrevo na form1.

Estou a utilizar a seguinte instrução:

            LerResultado.Text = ValorLido

            'Escrever resultados na janela de teste

            Form2.LerResultado.Text = ValorLido

mas não acontece nada na form2, apesar de na form1 aparecer o valor pretendido

Obrigado desde já pela ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Form2.TextBox1.Text = Me.TextBox1.Text

Ainda que isto não seja boa prática.

Forms são classes e como tal deverás ter uma instância do Form2 no Form1, e trabalhar com propriedades.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas. Não percebi muito bem a tua pergunta, mas ainda assim vou tentar resolver o teu problema...

Adiciona um Module ao teu projecto e faz o seguinte...

'Module1

Public ValorLido As String

'Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Adiciona o valor ao ValorLido contido no Module
        ValorLido += LerResultado.Text

        Form2.Show()
        Me.Hide()

    End Sub

'Form2

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Label1.Text = ValorLido

    End Sub

Espero que isto seja o que tu queres  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês estão a fazer um "filme" para uma coisa tão simples.

Vou-te dar um exemplo simples..vamos supor que queres fazer um Login e passar o que escreveste na Textbox1 (Pode ser o teu Nome) do Form1 (Form Login) para o Form 2 (Form Menu)

Adicionas um modulo e declaras lá:

Public Nome as String

No Form1 (Form Login), no botão "OK", por exemplo, escreves lá o seguinte:

Nome = TextBox1.Text
Form2.Show()

Agora no Form2 (Form Menu), adicionas lá duas Labels com o seguinte texto:

Label1.Text = "Bem vindo"

Label2.Text = ""  (Não contém nada, pois é aqui que vai aparecer o teu Nome que inseriste no Form1 (Form Login) na Textbox1)

Pronto no Form Load do Form2 (Form Menu) escreves a seguinte linha de código:

Label2.Text = Nome

Acho que era isto que querias, eu dei-te um exemplo, apartir daqui podes ir mais além.

Cumprimentos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês estão a fazer um "filme" para uma coisa tão simples.

Vou-te dar um exemplo simples..vamos supor que queres fazer um Login e passar o que escreveste na Textbox1 (Pode ser o teu Nome) do Form1 (Form Login) para o Form 2 (Form Menu)

Adicionas um modulo e declaras lá:

Public Nome as String

No Form1 (Form Login), no botão "OK", por exemplo, escreves lá o seguinte:

Nome = TextBox1.Text
Form2.Show()

Agora no Form2 (Form Menu), adicionas lá duas Labels com o seguinte texto:

Label1.Text = "Bem vindo"

Label2.Text = ""  (Não contém nada, pois é aqui que vai aparecer o teu Nome que inseriste no Form1 (Form Login) na Textbox1)

Pronto no Form Load do Form2 (Form Menu) escreves a seguinte linha de código:

Label2.Text = Nome

Acho que era isto que querias, eu dei-te um exemplo, apartir daqui podes ir mais além.

Cumprimentos.

Tudo o que tu disses-te eu citei mais a cima...

Não percebi essa resposta  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês estão a fazer um "filme" para uma coisa tão simples.

Vou-te dar um exemplo simples..vamos supor que queres fazer um Login e passar o que escreveste na Textbox1 (Pode ser o teu Nome) do Form1 (Form Login) para o Form 2 (Form Menu)

Adicionas um modulo e declaras lá:

Public Nome as String

No Form1 (Form Login), no botão "OK", por exemplo, escreves lá o seguinte:

Nome = TextBox1.Text
Form2.Show()

Agora no Form2 (Form Menu), adicionas lá duas Labels com o seguinte texto:

Label1.Text = "Bem vindo"

Label2.Text = ""  (Não contém nada, pois é aqui que vai aparecer o teu Nome que inseriste no Form1 (Form Login) na Textbox1)

Pronto no Form Load do Form2 (Form Menu) escreves a seguinte linha de código:

Label2.Text = Nome

Acho que era isto que querias, eu dei-te um exemplo, apartir daqui podes ir mais além.

Cumprimentos.

Sim, isto eu consegui fazer, mas o que eu tenho são dois forms abertos ao mesmo tempo, e o que pretendo fazer é atraves do form 1 enviar informação para o form 2, mas este não mostra nada. O que esta a ser feito no exemplo acima, é o inverso, ir buscar informação ao form1, atraves do form2.

O meu projecto é ter uma form (form1) que esta constantemente a ler informações da porta série, e a processar essa informação, e depois a form2 deve mostrar informação de um ficheiro, consoante o valor que a form1 disponibiliza. Neste momento eu tenho isso a funcionar comum temporizador na form2, que vai ler o valor a form 1, o que eu pretendo, e atraves de um evento da form1 alterar a mensagem que a form2 disponibiliza. Não sei se isto é possivel.

Obrigado pelas ajudas todas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tudo o que tu disses-te eu citei mais a cima...

Não percebi essa resposta  :hmm:

Desculpa não reparei no teu post.

Sim, isto eu consegui fazer, mas o que eu tenho são dois forms abertos ao mesmo tempo, e o que pretendo fazer é atraves do form 1 enviar informação para o form 2, mas este não mostra nada. O que esta a ser feito no exemplo acima, é o inverso, ir buscar informação ao form1, atraves do form2.

O meu projecto é ter uma form (form1) que esta constantemente a ler informações da porta série, e a processar essa informação, e depois a form2 deve mostrar informação de um ficheiro, consoante o valor que a form1 disponibiliza. Neste momento eu tenho isso a funcionar comum temporizador na form2, que vai ler o valor a form 1, o que eu pretendo, e atraves de um evento da form1 alterar a mensagem que a form2 disponibiliza. Não sei se isto é possivel.

Obrigado pelas ajudas todas

Ahh, ou seja queres uma actualização constante sempre que haja "movimento" nos Forms em questão correcto?

Eu não te sei dizer ao certo se é ou não possível, mas creio que na programação tudo é possivel..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ahh, ou seja queres uma actualização constante sempre que haja "movimento" nos Forms em questão correcto?

Eu não te sei dizer ao certo se é ou não possível, mas creio que na programação tudo é possivel..

Se for isso que é pretendido penso que é fácil com o nosso "amigo" timer  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ahh, ou seja queres uma actualização constante sempre que haja "movimento" nos Forms em questão correcto?

Eu não te sei dizer ao certo se é ou não possível, mas creio que na programação tudo é possivel..

Sim o que pretendo é exactamente isso, e neste momento estou a fazer isso com um timer, que me provoca alguns problemas quando estou a ler dados da porta serie, porque interrompe theads em execução. O que eu pretendia era atraves do evento que a porta serie provoca na form1, actualizar os dados da form2. Alguem tem ideias como fazer isso sem ser com o temporizador.

Obrigado pelas respostas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim o que pretendo é exactamente isso, e neste momento estou a fazer isso com um timer, que me provoca alguns problemas quando estou a ler dados da porta serie, porque interrompe theads em execução. O que eu pretendia era atraves do evento que a porta serie provoca na form1, actualizar os dados da form2. Alguem tem ideias como fazer isso sem ser com o temporizador.

Obrigado pelas respostas

Para actualizares os dados automaticamente sem estar a carregar constantemente num botão precisas sempre do timer.

Penso que não à outra saída para além do timer para fazeres actualizações constantes automaticamente...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Interrompe threads em execucao!? Como assim, podes explicar melhor? Se isso e devido a existir sobreposicao podes sempre parar o timer e inicialo novamente.

Qualquer coisa deste genero:

Public Sub Init()
            mtimer = New Timer(5000)
            AddHandler mtimer.Elapsed, AddressOf TrabalhoACada5Segundos
            With mtimer
                .AutoReset = True
                .Enabled = True
                .Start()
            End With
end Sub

Public Sub TrabalhoACada5Segundos()
            mtimer.Stop()

            ' codigo que queres que seja executado

            mtimer.Start()
end Sub

Outra questão, o que é que o Form1 tem a ver com os dados que estás a ler na porta serie e a enviar para o Form2?

A meu ver, os forms sao classes que a unica coisa que devem ter é inputs/outputs.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu pensei no Timer, contudo contém alguns problemas.

Ora imagina, eu escrevo na Textbox1 do Form1 "Ola" e quero que apareça no Form2 "Ola" ..terei que esperar 5 segundos para actualizar..

Depois pensei em actualizar a cada 1 segundo, mas não terá crashs a aplicação?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso, e ignorando a forma correcta de se fazer como ja foi referido.

Cria um novo projecto com dois forms

Em cada um dos forms coloca uma caixa de texto.

e coloca este codigo no Form1 e ve o que acontece.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Form2.Show()
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Form2.TextBox1.Text = TextBox1.Text
    End Sub

O timer acho k faz todo o sentido apenas para ler a porta serie de x em x tempo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Interrompe threads em execucao!? Como assim, podes explicar melhor? Se isso e devido a existir sobreposicao podes sempre parar o timer e inicialo novamente.

Qualquer coisa deste genero:

Public Sub Init()
            mtimer = New Timer(5000)
            AddHandler mtimer.Elapsed, AddressOf TrabalhoACada5Segundos
            With mtimer
                .AutoReset = True
                .Enabled = True
                .Start()
            End With
end Sub

Public Sub TrabalhoACada5Segundos()
            mtimer.Stop()

            ' codigo que queres que seja executado

            mtimer.Start()
end Sub

Outra questão, o que é que o Form1 tem a ver com os dados que estás a ler na porta serie e a enviar para o Form2?

A meu ver, os forms sao classes que a unica coisa que devem ter é inputs/outputs.

O que acontece é que por vezes não consigo ler os dados correctamente da porta serie, penso que sera porque a tread de leitura é interrompida pelo timer. Vou tentar parar o timer e depois digo qualquer coisa

Obrigado a todos pela ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso, e ignorando a forma correcta de se fazer como ja foi referido.

Cria um novo projecto com dois forms

Em cada um dos forms coloca uma caixa de texto.

e coloca este codigo no Form1 e ve o que acontece.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Form2.Show()
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Form2.TextBox1.Text = TextBox1.Text
    End Sub

O timer acho k faz todo o sentido apenas para ler a porta serie de x em x tempo.

COm isto na form2 não estou a ter nenhuma actualização da textbox, não sei qual sera o problema, mas se na form2 colocar um botão e fizer algo tipo:

textbox1.text = form1.textbox1.text

Sempre que pressiono o botão a form actualiza o campo

Alguma ideia mais??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse codigo que coloquei ai, actualiza a a textbox1 do form2 ao mesmo tempo que escreves alguma coisa na textbox do form1.

Foi so para dar um exemplo ao bioshock.

Quanto ao teu problema, experimenta parar o timer que em principio tens o problema resolvido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso, e ignorando a forma correcta de se fazer como ja foi referido.

Cria um novo projecto com dois forms

Em cada um dos forms coloca uma caixa de texto.

e coloca este codigo no Form1 e ve o que acontece.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Form2.Show()
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Form2.TextBox1.Text = TextBox1.Text
    End Sub

O timer acho k faz todo o sentido apenas para ler a porta serie de x em x tempo.

Sim mas repara: Tens 500 Textboxs..tás feito ao bife. A não ser que dê para fazer um género de um ciclo ou que, em que a informação digitada nas textbox's do Form 1 vá ser digitada nas textbox's do Form2.

Do género:

Para cada Texto inserido na Textbox(número) do Form1 = Textbox(número) do Form2..

Não sei se me dei a perceber e nem sei se é possivel, mas creio que sim.

Talvez alguém com mais conhecimentos mais te possa dar um exemplo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lol, gostei :)

Deste-te a perceber sim, e foi apenas um exemplo (com ma programacao, da minha parte) .... mas no caso de ter 500 e assumindo que dou o mesmo nome as textbox....


    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _ 
TextBox2.TextChanged
        For Each Control In Form2.Controls
            If TypeOf Control Is TextBox AndAlso CType(Control, TextBox).Name = CType(sender, TextBox).Name Then
                CType(Control, TextBox).Text = CType(sender, TextBox).Text
                Exit For
            End If
        Next
    End Sub

Estou a brincar.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se esse código funciona, mas eu aí não te vejo mencionar o Form1 ou Form2..

Nesse caso, se tivesses mais Textboxs noutros Forms, daria para o torto.

Estou a brincar.....

Em relação ao código? Não percebi :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ao colocares esta sub no Form1 o sender (neste caso) vem com textbox1 ou textBox2.

Ao dizer:

for each control in Form2.controls,

control tem os controlos que se encontram no Form2

Assim ele envia sempre o conteudo das textbox do form1 para as textbox do form2 em que os nomos sao iguais.

O estar a brincar, e que este e um exemplo muito pouco pratico e mais por curiosidade.

O codigo funciona neste exemplo com duas textbox, se quiseres que funcione com mais basta por no handles o nome das textbox com que queres que funcione.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Devia ser por já ser quase 2 da matina que não reparei no "For each control in Form2.Controls"

Understood, obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora