Cargar - descargar formularios.

04/09/2006 - 15:11 por Roberto | Informe spam
Tengo un formulario en el que, en el form.load relleno los textos de una
serie de labels y botones. Este formulario lo abro como modal llamándolo
desde otro formulario no MDI.
Lo que me ocurre es que, una vez acabo con el formulario modal, si lo cierro
con el método .close la siguiente vez que lo cargo no se rellenan los .text y
.tag de los controles, aunque pasa normalmente por el form.load. La solución
es dejarlo cargado pero oculto. Aunque se use bastante a menudo, preferiría
descargarlo por completo mientras no me haga falta porque voy a seguir
añadiendo formularios a la aplicación y no querría tener que dejarlos todos
cargados.

Preguntas similare

Leer las respuestas

#1 SoftJaén
04/09/2006 - 15:39 | Informe spam
"Roberto" escribió:

Tengo un formulario en el que, en el form.load relleno los textos de una
serie de labels y botones. Este formulario lo abro como modal llamándolo
desde otro formulario no MDI.
Lo que me ocurre es que, una vez acabo con el formulario modal, si lo
cierro
con el método .close la siguiente vez que lo cargo no se rellenan los
.text y
.tag de los controles, aunque pasa normalmente por el form.load.



Hola, Roberto:

Quiero reproducir lo que nos comentas, y no soy capaz de conseguirlo, porque
por más veces que cierre el formulario modal con que el método «Close», al
llamarlo posteriormente, siempre se rellenan en el evento «Form_Load», con
los valores que le indico. Ignoro el motivo que a tí no te funcione.

Por curiosidad, ¿con qué versión del marco de trabajo de .net estás
trabajando?

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#2 Jesús López
04/09/2006 - 16:05 | Informe spam
Ver el código nos sería de gran ayuda. Sin él va a ser imposible saber qué
pasa.

Saludos:

Jesús López





"Roberto" escribió en el mensaje
news:
Tengo un formulario en el que, en el form.load relleno los textos de una
serie de labels y botones. Este formulario lo abro como modal llamándolo
desde otro formulario no MDI.
Lo que me ocurre es que, una vez acabo con el formulario modal, si lo
cierro
con el método .close la siguiente vez que lo cargo no se rellenan los
.text y
.tag de los controles, aunque pasa normalmente por el form.load. La
solución
es dejarlo cargado pero oculto. Aunque se use bastante a menudo,
preferiría
descargarlo por completo mientras no me haga falta porque voy a seguir
añadiendo formularios a la aplicación y no querría tener que dejarlos
todos
cargados.


Respuesta Responder a este mensaje
#3 Roberto
05/09/2006 - 08:56 | Informe spam
Perdonarme que me surgió otra cosa y cerré el post a medio escribir.

Estuve haciendo pruebas y he encontrado la secuencia que falla pero no
entiendo por qué. Es vb2005.

Los botones del formulario los tengo en declarados en unos arrays en un
módulo.
Public ArrayBotones1 As Button {frmMenus.btn1,frmMenus.btn2,frmMenus.btn3...}
Public ArrayBotones2 As Button {frmMenus.btn11,frmMenus.btn12,...}

'Le paso un código en el tag del formuario. Esto lanza el evento load,
básicamente cambia los textos de los botones con un bucle de los arrays.
frmMenus.tag = Codigo

Private Sub frmMenus_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim MiArray As Array
Select Case Grupo
Case 1
MiArray = ArrayBotones1
Case 2
MiArray = ArrayBotones2
...
End Select
For i = 0 To MiArray.Length - 1
MiArray(i).Tag = i
MiArray(i).Text = i
MiArray(i).BackColor = Color.LightGray
Next
End Sub

'Muestro el formulario.
frmMenus.ShowDialog

'Después de trabajar con el lo ocultaba porque pensé en leer el tag para
confirmar que todo hubiese sido correcto.
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAceptar.Click
Me.Hide()
End Sub

'Después lo cerraba desde el formulario de origen.
frmMenus.Close

La siguiente vez que lo cargase, aun pasando por el Form.Load y haciendo los
bucles del array no se rellenan los textos ni tags.

Como lo de leer el tag una vez terminado no me hacía falta lo cambié para
que el mismo formulario frmMenus se cierre en lugar de ocultarse (Me.Close) y
así funciona bien.


"Jesús López" wrote:

Ver el código nos sería de gran ayuda. Sin él va a ser imposible saber qué
pasa.

Saludos:

Jesús López





"Roberto" escribió en el mensaje
news:
> Tengo un formulario en el que, en el form.load relleno los textos de una
> serie de labels y botones. Este formulario lo abro como modal llamándolo
> desde otro formulario no MDI.
> Lo que me ocurre es que, una vez acabo con el formulario modal, si lo
> cierro
> con el método .close la siguiente vez que lo cargo no se rellenan los
> .text y
> .tag de los controles, aunque pasa normalmente por el form.load. La
> solución
> es dejarlo cargado pero oculto. Aunque se use bastante a menudo,
> preferiría
> descargarlo por completo mientras no me haga falta porque voy a seguir
> añadiendo formularios a la aplicación y no querría tener que dejarlos
> todos
> cargados.
>
>



Respuesta Responder a este mensaje
#4 Jesús López
05/09/2006 - 16:55 | Informe spam
Roberto,

En este caso hay una explicación, no se trata de un expediente X ;-)

Lo que estaba ocurriendo es que todas las veces menos la primera, los arrays
de botones del módulo estaban haciendo referencia a unos botones ya
destruidos de una instancia anterior del formulario. Parece mentira pero la
implementación de la instancia predeterminada de un formulario conlleva que
esto pueda ocurrir.

Cuando hacemos lo siguiente por primera vez:

frmMenus.Tag = Algo
frmMenus.ShowDialog()
' frmMenus llama a Me.Hide()
frmMenus.Close()

La llamada a frmMenus.Tag = Algo hace que se cree una instancia de frmMenus
(la instancia predeterminada) y se asigne la propiedad Tag
La llamada a ShowDialog provoca el evento Load del formulario. Aquí se
accede por primera vez al módulo, por tanto es en este momento cuando se
crean y asignan los arrays de botones.
La llamada al método Close después de que el formulario se haya ocultado
provoca que se llame a Dispose del formulario y de todos los controles que
contiene, con lo que la instancia del formulario y sus controles ya no son
válidos, pero los arrays de controles de los módulos siguen haciendo
referencia a esos botones destruidos.

Cuando hacemos los mismo por segunda vez la llamada a:

frmMenus.Tag = Algo

La implementación de la instancia predeterminada se da cuenta de que la
instancia del formulario ya no es válida porque se llamó a Dispose (la
propiedad IsDisposed es True) así que crea una nueva instancia.

Al llamar a

frmMenus.ShowDialog()

vuelve a provocarse el evento Load, pero los arrays de botones de los
módulos ya están creados y asignados y hacen referencia a los botones de la
instancia anterior ya destruida, por lo que no tiene ningún efecto.

Al cambiar el Me.Hide por Me.Close en el formulario frmMenus lo que pasa es
lo siguiente. La primera vez que se ejecuta el código:

frmMenus.Tag = Algo
frmMenus.ShowDialog()
' frmMenus llama a Me.Close()

La llamada a "frmMenus.Tag = Algo" hace que se cree una instancia de
frmMenus (la instancia predeterminada) y se asigne la propiedad Tag
La llamada a ShowDialog provoca el evento Load del formulario y
La llamada al método Close destro del formulario, mientras aún está visible
en forma modal, hace que se cierre el formulario pero no que se destruya,
siendo válida la instancia del formulario para los siguientes accesos.

Las siguientes veces lo que ocurre es:

La llamada a frmMenus.Tag = Algo no provoca la creación de una nueva
instancia puesto que la que ya existe es válida.
frmMenus.ShowDialog vuelve a provocar el evento load y los arrays de botones
hacen referencia a los botones de la instancia predeterminada de frmMenus
que es válida.
'frmMenus llama a Me.Close, se cierra el formulario pero no se destruye.


Es importante tener en cuenta que si en vez de llamar a frmMenus.ShowDialog
llamamos a frmMenus.Show, cuando se cierra el formulario con Close, éste
siempre se destruye a pesar de que la llamada se realize mientras el
formulario está visible.


Saludos:

Jesús López



"Roberto" escribió en el mensaje
news:
Perdonarme que me surgió otra cosa y cerré el post a medio escribir.

Estuve haciendo pruebas y he encontrado la secuencia que falla pero no
entiendo por qué. Es vb2005.

Los botones del formulario los tengo en declarados en unos arrays en un
módulo.
Public ArrayBotones1 As Button
{frmMenus.btn1,frmMenus.btn2,frmMenus.btn3...}
Public ArrayBotones2 As Button {frmMenus.btn11,frmMenus.btn12,...}

'Le paso un código en el tag del formuario. Esto lanza el evento load,
básicamente cambia los textos de los botones con un bucle de los arrays.
frmMenus.tag = Codigo

Private Sub frmMenus_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim MiArray As Array
Select Case Grupo
Case 1
MiArray = ArrayBotones1
Case 2
MiArray = ArrayBotones2
...
End Select
For i = 0 To MiArray.Length - 1
MiArray(i).Tag = i
MiArray(i).Text = i
MiArray(i).BackColor = Color.LightGray
Next
End Sub

'Muestro el formulario.
frmMenus.ShowDialog

'Después de trabajar con el lo ocultaba porque pensé en leer el tag para
confirmar que todo hubiese sido correcto.
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAceptar.Click
Me.Hide()
End Sub

'Después lo cerraba desde el formulario de origen.
frmMenus.Close

La siguiente vez que lo cargase, aun pasando por el Form.Load y haciendo
los
bucles del array no se rellenan los textos ni tags.

Como lo de leer el tag una vez terminado no me hacía falta lo cambié para
que el mismo formulario frmMenus se cierre en lugar de ocultarse
(Me.Close) y
así funciona bien.


"Jesús López" wrote:

Ver el código nos sería de gran ayuda. Sin él va a ser imposible saber
qué
pasa.

Saludos:

Jesús López





"Roberto" escribió en el mensaje
news:
> Tengo un formulario en el que, en el form.load relleno los textos de
> una
> serie de labels y botones. Este formulario lo abro como modal
> llamándolo
> desde otro formulario no MDI.
> Lo que me ocurre es que, una vez acabo con el formulario modal, si lo
> cierro
> con el método .close la siguiente vez que lo cargo no se rellenan los
> .text y
> .tag de los controles, aunque pasa normalmente por el form.load. La
> solución
> es dejarlo cargado pero oculto. Aunque se use bastante a menudo,
> preferiría
> descargarlo por completo mientras no me haga falta porque voy a seguir
> añadiendo formularios a la aplicación y no querría tener que dejarlos
> todos
> cargados.
>
>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida