TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: LABmouse en 17 de Junio de 2011, 22:28:49

Título: Modificar control de Form2 desde Form1 de forma dinámica.[SOLUCIONADO]
Publicado por: LABmouse en 17 de Junio de 2011, 22:28:49
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?

Título: Re: Modificar control de Form2 desde Form1 de forma dinamica.
Publicado por: BrunoF 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.
Título: Re: Modificar control de Form2 desde Form1 de forma dinamica.
Publicado por: LABmouse 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!

Título: Re: Modificar control de Form2 desde Form1 de forma dinámica.[SOLUCIONADO]
Publicado por: BrunoF 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.