Sugerencia
Posted: Fri May 11, 2012 11:02 am
Hola a todos.
Se trata de unas pequeñas sugerencias que a lo mejor le vienen bien a algún compañero programador.
Hay veces que queremos que se ejecute alguna acción nada más comenzar nuestra aplicación con la pantalla principal a la vista, como por ejemplo presentar una clave de acceso, una petición de datos iniciales, etc.
Normalment utilizo el CodBlock bStart de TDIALOG, pero tiene el inconveniente de que está situado antes de evaluar el bPainted con lo que nuestra pantalla principal, si tenía dibujado algo con el bPainted, no se mostraría completa, o totalmente pintada. Por eso en mi proipia clase TDIALOG, para no cambiar ese CodeBlock de sitio he añadido bPostPaint que se ejecuta en el metodo Display() tras la llamada a Paint(), de forma que esa acción se puede ejecutar una vez la pantalla esté totalmente dibujada y a la vista.
También he añadido la variable: (DATA) lInitiate, porque hay veces que Paint() se ejecuta dos veces seguidas al iicar un dialogo y así puedo controlar que el bPostPaint se ejecute la segunda vez.
Por ultimo, también hay veces que el bPainted provoca un molesto parpadeo de la pantalla durante el primer pintado, por lo que he añadido un segundo DATA: lIniPaint, iniciado en .T. por defecto para que se ejecute de manera normal, pero que pongo en .F. al programar la pantalla cuando me aparece ese parpadeo.
El resultado sería algo así:
Importante: si queremos que bPostPaint sólo se ejecute una vez no olvide anularlo al inicio de la acción. De lo contrario el programa podría entrar en una recursión y quedar bloqueado nada más empezar. Por ejemplo:
Espero le se util a alguien.
Saludos
Se trata de unas pequeñas sugerencias que a lo mejor le vienen bien a algún compañero programador.
Hay veces que queremos que se ejecute alguna acción nada más comenzar nuestra aplicación con la pantalla principal a la vista, como por ejemplo presentar una clave de acceso, una petición de datos iniciales, etc.
Normalment utilizo el CodBlock bStart de TDIALOG, pero tiene el inconveniente de que está situado antes de evaluar el bPainted con lo que nuestra pantalla principal, si tenía dibujado algo con el bPainted, no se mostraría completa, o totalmente pintada. Por eso en mi proipia clase TDIALOG, para no cambiar ese CodeBlock de sitio he añadido bPostPaint que se ejecuta en el metodo Display() tras la llamada a Paint(), de forma que esa acción se puede ejecutar una vez la pantalla esté totalmente dibujada y a la vista.
También he añadido la variable: (DATA) lInitiate, porque hay veces que Paint() se ejecuta dos veces seguidas al iicar un dialogo y así puedo controlar que el bPostPaint se ejecute la segunda vez.
Por ultimo, también hay veces que el bPainted provoca un molesto parpadeo de la pantalla durante el primer pintado, por lo que he añadido un segundo DATA: lIniPaint, iniciado en .T. por defecto para que se ejecute de manera normal, pero que pongo en .F. al programar la pantalla cuando me aparece ese parpadeo.
El resultado sería algo así:
Code: Select all
DATA lInitiate AS LOGICAL INIT .F.
DATA lIniPaint AS LOGICAL INIT .T.
...
...
METHOD Display() CLASS TDialog
::BeginPaint()
::Paint()
::EndPaint()
::lIniPaint := .T. // PARA EVITAR QUE ALGUNAS PANTALLAS Layered PARPADEEN EN NEGRO POR CULPA DEL ::bPainted,
* EN LA APLICACION INICIAR EL DIALOGO CON lIniPaint := .F.
IF ::bPostPaint # NIL
EVAL(::bPostPaint)
ENDIF
*
::lInitiate := .T.
return nil
*
METHOD Paint() CLASS TdIalog
LOCAL xRet
...
...
IF ::lInitiate .AND. ::bStart # NIL
Eval( ::bStart, ::hDC, Self )
ENDIF
IF::bPainted # NIL .AND. ::lIniPaint
xRet = Eval( ::bPainted, ::hDC, ::cPS, Self )
ENDIF
RETURN xRet
Code: Select all
oWMain:bPostPaint := { || oWMain:bPaostPaint := NIL, MiFuncion(Var1,Var2,...) }
Saludos