Page 1 of 1

timer y Folder

Posted: Sun Jul 15, 2007 3:07 am
by goosfancito
Estimados, tengo un dialogo con un folder y necesito refrescar cada cierto tiempo el browser.

Problema.
Solo se lanza la accion del timer cuando cierro el dialogo.

Alguna Idea?

Code: Select all

#include "fivewin.ch"
#include "folder.ch"
#include "tsbrowse.ch"
#include "debug.ch"
#include "colores.ch"

//------------------------------------------------------------------------------

FUNCTION PantallaPrincipal()

   LOCAL oDlg, ;
         oIcono, ;
         oFolder, ;
         oBrw, ;
         oTimer

   LOCAL oQuery

   DEFINE ICON oIcono RESOURCE "ICON_DIPAI"

   oQuery:= GetApp():LeerTabla( { "guia.*" }, , , "idguia" )

   DEFINE DIALOG oDlg RESOURCE "DLG_MENU" TITLE "prueba Direcciones útiles ::. " ICON oIcono

      //----------( Folder )----------

      REDEFINE FOLDER oFolder ID 114 OF oDlg ;
               PROMPTS " &Padrón de datos existentes ", "&Alta, Bajas, Modificaciones",;
                       " Mensaje a otro usuario ", "&Datos del Usuario Actual" ;
               DIALOGS "FLD_BROWSER", "FLD_ABM",;
                       "FLD_MENSAJES", "FLD_USUARIOS";
               UPDATE

      //----------( Browser )----------

      REDEFINE BROWSE oBrw ID 101 OF oFolder:aDialogs[1] FONT GetFont():celda

         // Identificacion
         ADD COLUMN TO oBrw ;
            Header "Nombre o Entidad" ;
            DATA SetearColumna( oQuery, 1 );
            ALIGN DT_CENTER, DT_CENTER WIDTH 200 PIXELS

         ADD COLUMN TO oBrw ;
            Header "Domicilio" ;
            DATA SetearColumna( oQuery, 2 );
            ALIGN DT_CENTER, DT_CENTER WIDTH 200 PIXELS

         ADD COLUMN TO oBrw ;
            Header "Teléfono" ;
            DATA SetearColumna( oQuery, 3 );
            ALIGN DT_CENTER, DT_CENTER WIDTH 200 PIXELS

         MySetBrowse( oBrw, oQuery )

         oBrw:ChangeFont( GetFont():ENCABEZADO, , 2 )

         oBrw:aColumns[1]:lEdit := .F.
         oBrw:aColumns[2]:lEdit := .F.
         oBrw:aColumns[3]:lEdit := .F.

         oBrw:nAdjColumn        := 3
         oBrw:lAutoEdit         := .F.
         oBrw:nHeightHead       += 15
         oBrw:nHeightCell       += 8
         oBrw:lNoHScroll        := .T.
         oBrw:lNovScroll        := .F.

         oBrw:Look3d( .T., , , .T. )
         oBrw:SetColor( { 2, 5, 6, 15, 8 },;
                               { { ||  If( oBrw:nLogicPos() % 2 =  0,CLR_1, CLR_2 ) },;
                                 CLR_WHITE,;
                                 CLR_BLUE ,;
                                 CLR_GRAY ,;
                                 { | | If( oBrw:nLogicPos() % 2 =  0,CLR_1, CLR_2 ) } } )


         oDlg:bStart:= { || Timer( oTimer, oBrw, oQuery, oDlg ) }

   ACTIVATE DIALOG oDlg CENTERED

   RETURN ( NIL )

//------------------------------------------------------------------------------

FUNCTION timer( oTimer, oBrw, oQuery, oDlg )

   DEFINE timer oTimer interval 1000 of oDlg action ( RecargarBrowser( @oBrw, @oQuery ) )
   ACTIVATE timer oTimer

RETURN ( NIL )

//------------------------------------------------------------------------------

// Esta accion solo se ejecuta cuando se cierra el dialogo, mientras
// el dialogo esta en pantalla no pasa nada.

FUNCTION RecargarBrowser( oBrw, oQuery )

   oQuery:= GetApp():LeerTabla( { "guia.*" }, , , "idguia" )
   MySetBrowse( oBrw, oQuery )
   oBrw:refresh()

   ? "paso por aca"


   RETURN ( NIL )

//------------------------------------------------------------------------------



Posted: Mon Jul 16, 2007 3:13 am
by R.F.
Arranca el timer en el ON INIT del dialogo.

Posted: Mon Jul 16, 2007 8:15 am
by goosfancito
RF wrote:Arranca el timer en el ON INIT del dialogo.
En mi caso que hago esto:

Code: Select all

   oDlg:bStart:= { || Timer( oTimer, oBrw, oQuery, oDlg ) }

   ACTIVATE DIALOG oDlg CENTERED 
el bloque bStart no estaría haciendo el on init? o son cosas diferentes el ON INIT y el bStart?

Gracias.

Posted: Mon Jul 16, 2007 9:43 am
by thefull
goosfancito wrote:
RF wrote:Arranca el timer en el ON INIT del dialogo.
En mi caso que hago esto:

Code: Select all

   oDlg:bStart:= { || Timer( oTimer, oBrw, oQuery, oDlg ) }

   ACTIVATE DIALOG oDlg CENTERED 
el bloque bStart no estaría haciendo el on init? o son cosas diferentes el ON INIT y el bStart?

Gracias.
No.
bStart es un codeblock que se lanza cuando el dialogo ya a sido creado, el bInit es ANTES de que se cree.

Posted: Mon Jul 16, 2007 3:47 pm
by R.F.
Son 2 cosas distintas.

Sucede que los timers unicamente pueden utilizarse desde ventanas, y no desde dialogos.

Debes utilizar el evento ON INIT ya que es en este evento en el que el dialogo tiene atributos de ventana y puede aceptar el arranque del timer, y que este a su vez se pueda "colgar" al sistema de envios de mensajes.

El bSTart no te sirve, porque como bien menciona Rafa, ese evento se ejecuta una vez que el dialogo ya tiene atributos de dialogo, es decir, ya es modal y no esta "bombeando" los mensajes de Windows.