Pregunta básica

21/12/2005 - 23:28 por Novato | Informe spam
Hola, perdonad por la pregunta pero es que nunca encuentro cómo puedo hacer
algo.

Si tengo un formulario, que lanza otro (.showdialog) y necesito que cuando
se cierre el formulario lanzado, recoger una serie de valores del mismo
formulario... ¿cómo puedo hacer eso?

- ¿Con propiedades en el formulario lanzado y controlando desde el
formulario lanzador el evento closing del otro formulario?
- ¿Hay alguna otra forma de hacerlo?

Muchas gracias

Preguntas similare

Leer las respuestas

#6 Mario Vázquez
23/12/2005 - 09:18 | Informe spam
Supongamos que un Form1 debe abrir un Form2 y que cuando éste se cierre,
Form1 debe de poder acceder a algún valor obtenido desde Form2.
En Form1 tendríamos un código como:

Public Sub Test()

Dim frm As Form2
Dim Valor As Decimal

frm = new Form2
if frm.ShowDialog() = DialogResult.OK Then
Valor = frm.Valor
End if
End Sub

Este ejemplo abre el 2º formulario modalmente, lo cual facilita las cosas.
Supongamos que en Form2 tenemos que obtener un valor de un TextBox, que es
el que necesita Form1.
Una posibilidad es hacer ese TextBox público para ser accedido desde Form1.
De entrada, en Form2 tenemos un TextBox, mientras que en Form1 necesitamos
un Decimal. VB nos permite cosas tan feas como hacre esto desde Form1: Valor
= frm.TextBox1.Text
Esto no es nada recomendable. A parte de vulnerar el principio de
encapsulación, podemos encontrarnos con muchas sorpresas. Por ejemplo, ¿qué
pasa si frm.TextBox1.Text = ""? ¿o si frm.TextBox1.Text = "A"?. A parte la
gestión de TextBox1 debería ser un asunto privado de Form2, desde dónde
deberíamos asegurarnos de que nadie pudiera manipular ese objeto
erroneamente.

Yo haría lo siguiente en Form2:

Private TextBox1 As TextBox ' El diseñador de VB declara los objetos
Friend.


Public ReadOnly Property Valor As Decimal
Get
if Me.TextBox1.Text.Trim() = "" OrElse Not IsNumeric(
Me.TextBox1.Text ) Then
Return 0
Else
Return CDec( Me.TextBox1.Text )
End Get
End Property

La misión de la propiedad es "publicar" de forma segura el valor que
necesitamos externamente. Por un lado evitamos que nadie puede manipular el
TextBox de Form2, y por otro devolvemos el tipo esperado (Decimal) de forma
segura y elegante.
Si un día Form2 se complica y el valor que debemos devolver se obtiene de un
ListBox, sólo deberemos tocar el código de la propiedad. Form1 seguirá
recibiendo su valor Decimal


Si desde Form1 necesitáramos establecer el valor de TextBox1, deberíamos
ampliar la propiedad de Form2:

Public Property Valor As Decimal ' Ahora sin ReadOnly
Get
if Me.TextBox1.Text.Trim() = "" OrElse Not IsNumeric(
Me.TextBox1.Text ) Then
Return 0
Else
Return CDec( Me.TextBox1.Text )
End Get
Set( value As Decimal )
Me.TextBox1.Text = CStr( value )
End Set
End Property

En este caso el bloque Set nos sirve también para convertir adecuadamente el
valor de entrada (Decimal) al control que lo va a gestionar (TextBox,
ListBox o lo que sea).

He explicado un ejemplo abriendo Form2 como formulario modal. Si lo abrimos
con Show(), puede que necesitemos un mecanismo para saber desde Form1 cuándo
la propiedad de Form2 ha cambiado. Una forma para conseguir esto sería
creando un evento en Form2 que pueda ser recogido por Form1:

' En las declaraciones
Public Event ValorCambiado( sender As object, valorAntiguo As Decimal,
valorNuevo As Decimal )

' En el boque set de la propiedad Valor
'...
Set( value As Decimal )
RaiseEvent ValorCambiado( Me, Me.Valor, value )
Me.TextBox1.Text = CStr( value )
End Set

Espero que te ayude en algo.
Saludos,
Mario Vázquez



"Cid" escribió en el mensaje
news:
Mostrar la cita
#7 Cid
23/12/2005 - 12:31 | Informe spam
Y si tambien se necesita pasar parametros al reves? En 2003 yo sabia hacerlo
trabajando sobre el constructor pero en 2005 no me sale...


"Leonardo Azpurua [mvp vb]" <l e o n a r d o (arroba) m v p s (punto) o r g>
escribió en el mensaje news:%
Mostrar la cita
#8 Leonardo Azpurua [mvp vb]
26/12/2005 - 15:32 | Informe spam
"Cid" escribió en el mensaje
news:
Mostrar la cita
Hola.

Los constructores parametrizados funcionan en VB2005 igual que en las
versiones anteriores.

La unica diferencia es que en VB2005 puedes utilizar la "instancia por
default" de los formularios (es decir, puedes escribir directamente
"Form1.ShowDialog()", que sigue siendo tan poco recomendable como lo era con
VB5). Lo único que debes tener presente es agregar una llamada a
"InitializeComponent()" en los cosntructores que tu mismo agregues.

Aunque siempre tienes la opción de pasar los argumentos en la llamada a la
función.

Salud!
#9 Cid
26/12/2005 - 19:40 | Informe spam
Ok gracias

"Leonardo Azpurua [mvp vb]" <l e o n a r d o (arroba) m v p s (punto) o r g>
escribió en el mensaje news:
Mostrar la cita
#10 Cid
26/12/2005 - 19:40 | Informe spam
Ok gracias

"Leonardo Azpurua [mvp vb]" <l e o n a r d o (arroba) m v p s (punto) o r g>
escribió en el mensaje news:
Mostrar la cita
Ads by Google
Search Busqueda sugerida