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

#1 gilberto.najera
22/12/2005 - 00:33 | Informe spam
La mejor opción, a mi forma de ver, es utilizar propiedades (variables
públicas) en el lanzador y pasarle los valores desde el lanzado, ya sea con
lanzador.ActiveForm

en lanzado.deactivate
lanzador.ActiveForm.propiedad=prop

o bien con una copia de lanzador en lanzado:

En lanzador:
lanzado.lanz=me
lanzado.show

En lanzado.deactivate:
lanz.propiedad=prop

Espero te sea útil.

"Novato" escribió en el mensaje
news:%
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





Saludos,

Gilberto Nájera Gtz.
Respuesta Responder a este mensaje
#2 yodelmis
22/12/2005 - 05:50 | Informe spam
Saludos :

La variante que yo utilizo (desde los tiempos del vb6) es con la
utilizacion de eventos personalizados
Ej: sean 2 formularios forma1 y forma2. donde forma1 es el llamador

forma2

public event Cerrar(parametro1 as integer,parametro2 as string)
public par1 as integer '- esto no debe utilizarse de esta forma.Lo
recomendado seria crear una propiedad.

sub Form_Close()
raiseevent Cerrar(valor1,valor2)
end sub

forma1

Public WithEvents f As forma2
private par1 as integer
priavte par2 as string
sub form_load()
set f = new forma2
f.par1=2
f.showdialog
end sub

sub f_Cerrar(parametro1 as integer,parametro2 as string)
par1=parametro1
par2=parametro2
end sub


NOTA:

aun cuando en vb.net podriamos utilizar los delegate para la definicion de
eventos, como te decia al inicio esta es la variante que siempre e utilizado
y me va bien para estos fines.
Respuesta Responder a este mensaje
#3 Mario Vázquez
22/12/2005 - 10:31 | Informe spam
Puedes acceder a los miembros de un formulario aun después de que éste se
haya cerrado, por lo que no creo que sean necesarias muchas maniobras.

Yo hago lo siguiente:

En el formulario que tiene que devolver valores, escribo propiedades
(property) de sólo lectura para devolver estos valores en el tipo correcto
(me refiero que si tienes que devolver un entero obtenido desde la propiedad
Text de un TexBox, declaro la propiedad como entero, y en el código de ésta
hago la conversión y validación correspondientes).
Desde el formulario llamador, simplemente accedo a las propiedades ReadOnly
del formyulario llamado.

Saludos,
Mario Vázquez


"Novato" escribió en el mensaje
news:%
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


Respuesta Responder a este mensaje
#4 Cid
22/12/2005 - 19:26 | Informe spam
Mario me ayudaria si me puedes enviar un ejemplo, gracias.




"Mario Vázquez" escribió en el mensaje
news:
Puedes acceder a los miembros de un formulario aun después de que éste se
haya cerrado, por lo que no creo que sean necesarias muchas maniobras.

Yo hago lo siguiente:

En el formulario que tiene que devolver valores, escribo propiedades
(property) de sólo lectura para devolver estos valores en el tipo correcto
(me refiero que si tienes que devolver un entero obtenido desde la
propiedad Text de un TexBox, declaro la propiedad como entero, y en el
código de ésta hago la conversión y validación correspondientes).
Desde el formulario llamador, simplemente accedo a las propiedades
ReadOnly del formyulario llamado.

Saludos,
Mario Vázquez


"Novato" escribió en el mensaje
news:%
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






Respuesta Responder a este mensaje
#5 Leonardo Azpurua [mvp vb]
22/12/2005 - 21:05 | Informe spam
"gilberto.najera" escribió en el mensaje
news:%
La mejor opción, a mi forma de ver, es utilizar propiedades (variables
públicas) en el lanzador y pasarle los valores desde el lanzado, ya sea
con lanzador.ActiveForm

en lanzado.deactivate
lanzador.ActiveForm.propiedad=prop

o bien con una copia de lanzador en lanzado:

En lanzador:
lanzado.lanz=me
lanzado.show

En lanzado.deactivate:
lanz.propiedad=prop

Espero te sea útil.



Hola, Gilberto:

Los axiomas básicos de la OO indican que el objeto llamado (servidor) no
debe asumir nada con respecto a lo que sabe o no sabe quien lo llama (su
cliente). Claro que lo que tu sugieres es un protocolo establecido, es
decir:

"Para llamar a una forma X, debo declarar tales propiedades publicas con
acceso de escritura, y debo pasarle a X una referencia a Me".

No esta mal, pero es complicado.

Una forma más elegante es implementar en la misma forma X una función que
abre la forma (lo mas facil es mediante ShowDialog, lo mas sucio, pero
tambien funciona, es abrirla de manera no modal -i.e. solo Show- y luego
iterar llamando a Application.DoEvents mientras este visible) y al cerrarse
toma los valores a devolver y los coloca en una estructura que es el valor
de retorno de la función. Antes de salir, llama a Dispose (para dejar todo
limpio).

Por ejemplo:

Public Structure ParametrosRetorno
Codigo As String
Descripcion As String
Precio As Decimal
End Structure

Public Function GetValores() As ParametrosRetorno
Dim retP as ParametrosRetorno
If Me.ShowDialog = DialogResult.OK Then
retP.Codigo = txCodigo.Text
retP.Descripcion = txDescripcion.Text
retP.Precio = numPrecio.Value
Else
retP.Codigo = "NULL"
End If
Dispose
Return retP
End If

Desde el cliente, lo unico que tienes que hacer es:

Dim xForm As New FormaX
Dim resultado As FormaX.ParametrosRetorno = FormaX.GetValores()
If resultado.Codigo <> "NULL" Then
...
End If

Lo que me gusta de este metodo es que las formas se convierten, desde el
punto de vista del diseño, en objetos como todos los demas: el hecho de que
interactúen con el usuario es sólo una incidencia que no nos interesa en el
punto donde estamos.

Salud!
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida