Autor Tema: Modificar control de Form2 desde Form1 de forma dinámica.[SOLUCIONADO]  (Leído 3885 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Hola,

Sucede que debo cambiar de forma dinámica desde un formulario "Padre" las propiedades de un control que esta presente en el formulario "Hijo".  

Los dos están abiertos y mostrando información, por es no me sirve ajustar y luego dar form2.show()...

Estoy en VB.Net y llevo intentos con lo siguiente:

Código: vb.net
  1. form2.textbox1.text="hola";

Solo funciona si el form2 no esta visible, por lo que no me sirve.


En msdn encuentro esto pero la verdad no entiendo como pasar eso a vb, intente crear lo que llaman métodos públicos pero no se realmente como hacerlo.

http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/65df0b32-d870-4791-a77f-d6008694b7b3





En total, lo que quiero es que en un textbox en Form2 pueda ver mensajes de forma dinámica controlados desde Form1.. Si se puede hacer esto?

« Última modificación: 21 de Junio de 2011, 15:24:13 por LABmouse »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Modificar control de Form2 desde Form1 de forma dinamica.
« Respuesta #1 en: 19 de Junio de 2011, 01:49:29 »
Hola Ernesto.

Puede que sea porque se estan ejecutando en threads distintos. VB.NET maneja multithreads en ciertos casos.

De ser asi, podrias hacer un callback para lograr sincronizar entre threads.

En el codigo  del formulario que queres cambiar(form2) pone lo siguiente fuera de toda clase, al inicio del codigo del formulario.

Código: vb.net
  1. Delegate Sub SetTextCallback(ByVal [text] As String)

Y dentro la clase Form2

Código: vb.net
  1. Public Sub ChangeTitle(ByVal [text] As String)
  2.         ' InvokeRequired required compares the thread ID of the
  3.         ' calling thread to the thread ID of the creating thread.
  4.         ' If these threads are different, it returns true.
  5.         If Me.InvokeRequired Then
  6.             Dim d As New SetTextCallback(AddressOf ChangeTitle)
  7.             Invoke(d, New Object() {[text]})
  8.         Else
  9.             Me.Text = text
  10.         End If
  11.     End Sub

Luego, para cambiar el titulo en cualquier momento solo hacer desde el form1:

Código: vb.net
  1. Form2.ChangeTitle("Hola mundo!")

Hay varias formas de hacer esto mismo. Algunas mas sencillas y otras mas potentes. Te recomiendo que leas sobre delegados y callbacks en la ayuda del .NET.

Un abrazo.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Modificar control de Form2 desde Form1 de forma dinamica.
« Respuesta #2 en: 21 de Junio de 2011, 15:20:42 »
Hola amigo bruno,

Después de intentarlo como bien me dices me sigue saliendo un problema con la comunicación entre formularios. Pero con tu ejemplo logre solucionar el problema.

Sucede que esos mensajes debían cambiar por la llegada de unos datos por puerto serial. Averiguando por todos lados, encontré un comentario que me dio una idea de lo que estaba pasando. 

En VB.NET el componentes SerialPort trabaja en un threading diferente al de la aplicación, de esta forma se lograba mayor eficiencia en la gestión del puerto por parte de VB,  es por esta razón que no se puede pretender cambiar los componentes del formulario desde el evento DataReceived del mismo, para ello se debe usar un método para comunicar el threading del SerialPort con el de Form.

Una de las técnicas es la que me explicaste con el ejemplo. Seguí tu ejemplo y me funciona perfecto.

Muchísimas gracias amigo bruno!


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Modificar control de Form2 desde Form1 de forma dinámica.[SOLUCIONADO]
« Respuesta #3 en: 21 de Junio de 2011, 17:48:16 »
Me alegro que haya funcionado. Y efectivamente es así. El SerialPort trabaja en otro thread.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything