Page 1 of 3
ON INIT
Posted: Fri Jan 18, 2008 8:53 am
by thefull
Antonio, una de las cosas que más 'rabia' que me da en Fivewin, es la que tener que realizar la INICIALIZACION de alguna cosa en el method ON INIT del correspondiente Dialogo/Ventana.
Creo que seria MUY INTERESANTE dotar una VARIABLE a la clase TCONTROL bINIT.
Asi, todos los controles pueden tener la clausula ON INIT que será lanzado en el method Initiate de la clase Dialog y/o en las que sean.
Entonces METHOD INITIATE() CLASS DIALOG,
simplemente debe de recorrer el ::aControls, evaluando los controles;
Code: Select all
Aeval( ::aControls,{|o|if( o:bInit != NIL , Eval( o:bInit, o ), ) }
Asi, podemos hacer MUCHO mas legible el codigo;
Code: Select all
DEFINE BUTTON oBtn ;
ON INIT oBtn:Hide
¿ Que piensas sobre esta implementación ? La verdad es que llevaba la _ detrás de la oreja sobre el como evitar tener que escribir 200 lineas en el ON INIT del Dialogo , y la verdad es que no me gustaba nada.
Posted: Mon Jan 21, 2008 7:17 am
by Antonio Linares
Rafa,
Es una propuesta interesante, vamos a revisarla. Gracias!
Posted: Mon Jan 21, 2008 7:21 am
by Antonio Linares
De momento solo se me ocurre una pega:
¿ Cómo saber si los demás controles están inicializados ? Es decir, desde el ON INIT de un control no tendriamos la certeza de que los demás controles están inicializados, salvo que el orden de creación, marcase el orden de evaluación de cada bInit.
Desde un control B, no se podría acceder al control C (que no estaría inicializado), pero sí al A (que si lo estaría).
No se si se me entiende...
Posted: Mon Jan 21, 2008 8:50 am
by thefull
Antonio Linares wrote:De momento solo se me ocurre una pega:
¿ Cómo saber si los demás controles están inicializados ? Es decir, desde el ON INIT de un control no tendriamos la certeza de que los demás controles están inicializados, salvo que el orden de creación, marcase el orden de evaluación de cada bInit.
Desde un control B, no se podría acceder al control C (que no estaría inicializado), pero sí al A (que si lo estaría).
No se si se me entiende...
Antonio, si, te entiendo ...
Creo que no debería haber ningún tipo de problema si la evaluacion se lleva a cabo en la creacion del Dialogo/Ventana, TAL Y COMO OCURRE actualmente.
Ahora , si supones que puedo evaluar bInit en otro punto, no he contemplado esa posibilidad.
Se supone que en ese punto, TODOS LOS CONTROLES ya estan inicializados, o no ?
Posted: Mon Jan 21, 2008 9:02 pm
by Antonio Linares
Rafa,
Bien, se podría hacer como dices: después de que todos los controles se hayan inicializado y antes ó después (?) del ON INIT del diálogo ?
Re:
Posted: Mon Jan 21, 2008 10:09 pm
by thefull
Antonio Linares wrote:Rafa,
Bien, se podría hacer como dices: después de que todos los controles se hayan inicializado y antes ó después (?) del ON INIT del diálogo ?
Yo creo que debería ser ANTES, y que el ON INIT del diálogo/ventana sea lo último que deba de evaluarse, pero para gustos, los colores
Si mal no recuerdo, ahora no tengo acceso al fuente, la evaluacion del ON INT del dialogo se realizaba alguna cosa, pues que siga como hasta ahora.
De esta manera no se creará NINGUNA incompatibilidad con el código anterior a ningún usuario.
Asi, todo el que esta usando ON INIT, lo seguirá usando sin problemas, y puede añadir el código nuevo, sin ningún problema.
Vamos, tendremos lo mejor de los 2 mundos
Pero , es mi opinión Maestro, yo solo soy un humilde aprendiz
Posted: Mon Jan 28, 2008 10:27 am
by Antonio Linares
Rafa,
Como te comenté por teléfono, habrá que hacer pruebas para ver en que order exacto deberían evaluarse los bInit para que no surgiesen incompatibilidades con el código actual (ya que la claúsula ON INIT se usa mucho)
Posted: Sun Feb 03, 2008 11:05 am
by antolin
En mi modesta opinión, es preferible inicializar el contenedor antes que el contenido. Dependiendo del tipo de window/dialogo los controles miden o se comportan de forma algo diferente. Por ejemplo, al final del metodo INITIATE del dialogo, no estaría mal.
Posted: Thu Feb 14, 2008 4:03 pm
by thefull
antolin wrote:En mi modesta opinión, es preferible inicializar el contenedor antes que el contenido. Dependiendo del tipo de window/dialogo los controles miden o se comportan de forma algo diferente. Por ejemplo, al final del metodo INITIATE del dialogo, no estaría mal.
Pero es que el contenedor ya es inicializado!
Se trata de QUITAR del ON INIT del dialogo y ponerlo en el lugar que le corresponder, pero el problema que comenta Antonio es si tiene que evaluarse antes o despues.
Un ejemplo para entenderlo ;
Code: Select all
// Actualmente;
@1,1 SAY oSay PROMPT "OCULTO" OF oDlg
ACTIVATE DIALOG oDlg ON INIT ( oSay:Hide, Eval( bPepe ) )
Internamente, la evaluacion del ON INIT , oDlg:bInit, se produce en el method Initiate(),;
Code: Select all
if ::bInit != nil
lResult = Eval( ::bInit, Self )
if ValType( lResult ) == "L" .and. ! lResult
lFocus = .f.
endif
endif
Asi, la propuesta es que cada control tenga su ON INIT, independiente del ON INIT del dialogo, que lógicamente, se evaluará en el method Initiate() del dialogo;
Ejemplo;
Code: Select all
// Actualmente;
@1,1 SAY oSay PROMPT "OCULTO" OF oDlg ;
ON INIT oSay:HIde
ACTIVATE DIALOG oDlg ON INIT Eval( bPepe )
Internamente, la evaluacion del ON INIT , oDlg:bInit, se produce en el method Initiate(), igualmente como hasta ahora y mi propuesta es
que se ejecute ANTES que el ON INIT del dialogo, que es lo más lógico,
y lógicamente, puedes seguir usandolo como hasta ahora.
Code: Select all
Aeval( ::aControls,{|o|if( o:bInit != NIL , Eval( o:bInit, o ), ) }
if ::bInit != nil
lResult = Eval( ::bInit, Self )
if ValType( lResult ) == "L" .and. ! lResult
lFocus = .f.
endif
endif
Yo creo que con esto se gana una legibilidad del codigo fuente MUY pero que MUY GRANDE, evitando MUCHOS errores en la codificación.
¿ Se entiende mejor ahora ?
Posted: Thu Feb 14, 2008 7:52 pm
by antolin
Te he entendido, sólo que dijistes: "Yo creo que debería ser ANTES, y que el ON INIT del diálogo/ventana sea lo último que deba de evaluarse" y creo que debería inicializarse primero el dialogo y despues evaluar los distintos binit de los diferentes objetos.
Un saludo.
Posted: Sat Feb 16, 2008 11:01 am
by thefull
antolin wrote:Te he entendido, sólo que dijistes: "Yo creo que debería ser ANTES, y que el ON INIT del diálogo/ventana sea lo último que deba de evaluarse" y creo que debería inicializarse primero el dialogo y despues evaluar los distintos binit de los diferentes objetos.
Un saludo.
Cuando decia ANTES, me referia ANTES de la evaluacion del binit del dialogo,
no ANTES de la creacion del dialogo
, que logicamente, no funcionaría.
Posted: Fri Jun 27, 2008 4:19 pm
by Marcelo Via Giglio
Holas,
en que quedo el tema?? me parece muy util
saludos
Marcelo
Posted: Fri Jun 27, 2008 4:32 pm
by Antonio Linares
Marcelo,
En que habría que probar ambas soluciones (inicialización de controles antes ó despues del diálogo) y ver cual de ambas "rompe" menos código, ó si no llega a causar ningún problema.
Posted: Fri Jun 27, 2008 6:23 pm
by Marcelo Via Giglio
Antonio Linares wrote:Marcelo,
En que habría que probar ambas soluciones (inicialización de controles antes ó despues del diálogo) y ver cual de ambas "rompe" menos código, ó si no llega a causar ningún problema.
Antonio,
para no romper nada como dice Rafa, pienso que la evaluacion de los binit de los controles que lo tengan definido, puede ser antes (junto con) el binit del dialogo, eso seria tan compatible como evaluar todos los binit en el INIT del dialogo, por lo tanto creo yo, que no habria ningun efecto colateral.
saludos
Marcelo
Posted: Fri Jun 27, 2008 9:50 pm
by Antonio Linares
Marcelo,
Hay que probarlo