Page 1 of 1

Sugerencia

Posted: Fri May 11, 2012 11:02 am
by antolin
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í:

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

 
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:

Code: Select all

oWMain:bPostPaint := { || oWMain:bPaostPaint := NIL, MiFuncion(Var1,Var2,...) }
Espero le se util a alguien.

Saludos

Re: Sugerencia

Posted: Wed May 16, 2012 2:54 am
by carloslmm
Antolin

Muy Buena sugerencia, para mi todo las aportacion son muy buenas ya que son muchos los compañeros que se echan un clavado a revisar las clases y mejorarlas, gracias a gente como tu se han reslisado cambios gigantes en fivewin

Sigue adelante compañero y aqui andamos a la orden

Saludos

Calos I. De La Rosa.
carloslmm@hotmail.com