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 Expand view
// 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 Expand view
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 Expand view
// 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 Expand view
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 ?