FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Duda con inicialización de variables
Hola Estimados.
Mucho tiempo que no posteaba, ahora retomando un proyecto en delphi me sale la duda con una variable pública que tengo en un formulario. Este es el código donde seteo esa variable.
Como ven hasta acá todo perfecto. Pero mi duda es al momento que el formulario donde utilizaré esta variable no se inicializa mediante el evento onshow.
La variable f_id_Ajuste que es de tipo integer y publica del formulario llega en 0, sin embargo en el evento onpaint llega con valor. Qué evento más podría usar, el onpaint no me sirve mucho, lo ideal era el onshow, pero por lo visto no se inicializan en ese momento dicha variables públicas. Gracias.. Saludos .-
__________________
No todo es como parece ser... |
#2
|
||||
|
||||
Hola lucasart.
Si te interpreto bién y la varible f_id_Ajuste es pública al segundo Form, deberías tener el valor en el Evento OnShow del Form2 ya séa declarada como variable global o en la sección public de Form2. Hice una prueba simple y obtengo el valor sin problemas. Fijate si el código te orienta en algo. Form1:
Form2:
Si no malentendí tu planteo, me animaría a decir que el problema está en el procedimiento LimpiarCampos... Saludos. Última edición por ecfisa fecha: 31-10-2010 a las 00:34:18. |
#3
|
||||
|
||||
Gracias ecfisa por tu respuesta.
El procedimiento LimpiarCampos solo vacia unos par de texbox, creo haber descubierto cual es el problema o mejor dicho cuando sucede. Olvidé comentarte que ese código funcionaba ok hasta que cambie la propiedad del formulario FormStyle = fsMDIForm. Cuando hice este cambio comenzó a fallar. Lo más extraño es que si dejo tal cual estaba la propiedad FormStyle = fsNormal sigue no funcionando correctamente el evento onShow. y para terminar la curiosidad esta, resulta si vuelvo a crear el evento onShow de nuevo y la propiedad FormStyle = fsNormal el problema ya no aparece. Amigo ecfisa, tu podrías hacer las pruebas cambiando dicha propiedad a FormStyle = fsMDIForm y ver si te resulta. Amigo, intenta sin showmodal al momento de llamar al formulario ya que así lo estoy haciendo en este momento, disculpa si el código inicial estaba incorporado. Gracias...
__________________
No todo es como parece ser... |
#4
|
||||
|
||||
Hola lucasart.
Si, tenés razón. Al cambiar de SDI a MDI, el segundo form en el evento OnShow, pareciera que no tiene aún el valor asignado ... Es un comportamiento que yo también desconocía... lo voy a investigar. Pero hasta que averiguemos alguna manera más elegante de hacerlo, a ver si esto te sirve: MDIForm:
MDIChild:
Saludos. Última edición por ecfisa fecha: 01-11-2010 a las 21:05:28. |
#5
|
||||
|
||||
Hola de nuevo.
Probando con Trace Into a ver por qué OnShow se disparaba en diferente órden que en los Forms SDI, se me ocurrió otra forma de hacerlo: MDIForm:
MDIChild:
Me gusta un poco más que la anterior. Aunque no estoy seguro que sea la mejor forma... Saludos. Última edición por ecfisa fecha: 01-11-2010 a las 22:37:27. |
#6
|
||||
|
||||
Gracias amigo, tu última solución creo que es lo mejor.
Para ver si entiendo con el código OnShow:= nil; haces que el evento OnShow se omita, para luego lanzarlo con FormShow(nil). porque todo al parecer resulta que al momento del onshow las variables no se encuentran disponibles cuando el formulario es de tipo fsMDIChild. Pero me quedan las dudas, será un bug del delphi ?? o quizás lo erroneo es lo que estaba haciendo, pero siguiendo una lógica si uno ya tiene instanciada la clase (create(nil)) esta ya se encuentra totalmente accesible, lo raro es que el evento onshow no se entere de estos valores ni por si acaso. Gracias estimado, por ahora me parece una solución fantastica, aunque igual que a ti, el por qué de tal comportamiento no me lo explico ya que el evento onpaint si tiene conocimientos de estos valores. Saludos .-
__________________
No todo es como parece ser... |
#7
|
||||
|
||||
Hola lucasart.
Si correcto, lo de OnShow:= nil, es por que cuando realiza el OnCreate inmediatamente dispara el OnShow y no está el valor aún. Pero como te dije antes, lo averigué probando. Y al igual que vos no tengo idea del por que de este comportamiento. Deberíamos consultarlo en un nuevo hilo, quizá algún compañero tenga el dato... La property no es para embrollar la cosa... , me quedó de una prueba... Saludos. Última edición por ecfisa fecha: 02-11-2010 a las 02:09:42. |
#8
|
||||
|
||||
Estimado.
Segun la ayuda de delphi. Código:
Use OnCreate to perform special processing when the form is created and is invoked by TCustomForm’s constructor. Either implement this event or override the constructor of the form; do not do both. Any objects created in the OnCreate event should be freed by the OnDestroy event. When a form is being created and its Visible property is true, the following events occur in the order listed: 1. OnCreate 2. OnShow 3. OnActivate 4. OnPaint Saludos .-
__________________
No todo es como parece ser... |
#9
|
||||
|
||||
Amigo... ¡¡¡ Felicitaciones, diste justo en el clavo !!!
Saludos. |
#10
|
||||
|
||||
Hola de nuevo lucasart.
Me parece que me apuré a alegrarme, quedaba tan sencillo ajustando la propiedad Visible... Despues de tanta prueba olvidé poner como MDIChild a Form2, fué por eso que no me dío error. Pero no se puede ocultar un Form MDIChild. Esto no funciona:
La solución hasta el momento, sigue siendo:
Si encontrás alguna otra solución, agradecido si la pones. Un saludo. Última edición por ecfisa fecha: 02-11-2010 a las 21:15:23. |
#11
|
||||
|
||||
Estimado.
No he encontrado otra manera de hacerlo, bueno también está la opción de sobreescribir el constructor del formulario y pasarle un parametro adicional para utilizar (solución propuesta a mí en el mismo club hace unos par de años). Mientras tanto para pantallas MDIChild estoy usando tu solución. Saludos .-
__________________
No todo es como parece ser... |
#12
|
|||
|
|||
No se si entendi mal, pero igual va mi solucion.
Si f_id_Ajuste es una variable publica se puede asignar valor en cualquier momento. Por lo tanto antes de crear el formulario MDI, se le puede dar un valor {1}. En este ejemplo incluso la sentencia Show, se puede obviar e igualmente se mostrara el formulario.
Saludos |
#13
|
||||
|
||||
Hola cloayza.
Si declaras la variable f_id_Ajuste como global en Unit2, tenés toda la razón. Pero si está declarada en una sección de la clase, no es posible hacerlo como arriba. Ya que la instancia de TForm2, y por tanto f_id_Ajuste, todavía no están creados. Cita:
Saludos. Última edición por ecfisa fecha: 04-11-2010 a las 16:41:13. |
#14
|
|||
|
|||
ecfisa, ni siquiera es necesario dejarlo en auto create.
Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Duda en declaracion de variables | Paulao | Varios | 7 | 24-09-2010 10:25:51 |
Inicialización de variables booleanas | noob | Varios | 7 | 16-12-2008 14:34:30 |
Duda con el ámbito de variables | cardomjar | Varios | 6 | 16-03-2005 12:45:52 |
Inicializacion de variables | xerkan | OOP | 3 | 24-05-2004 16:21:48 |
Frames y inicialización de variables | __cadetill | OOP | 6 | 25-11-2003 18:22:54 |
|