Sugerencia

Sugerencia

Postby antolin » 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í:
Code: Select all  Expand view  RUN
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  Expand view  RUN
oWMain:bPostPaint := { || oWMain:bPaostPaint := NIL, MiFuncion(Var1,Var2,...) }

Espero le se util a alguien.

Saludos
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55
antolin
 
Posts: 498
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Sugerencia

Postby carloslmm » Wed May 16, 2012 2:54 am

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
carloslmm
 
Posts: 71
Joined: Sat Oct 20, 2007 3:02 pm
Location: Sinaloa Mexico


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 92 guests