Get simulando una espera en segundos

Get simulando una espera en segundos

Postby VictorCasajuana » Mon May 06, 2024 11:22 am

Hola.

Necesito darle a un get el comportamiento de esperar a que el usuario termine de teclear para lanzar un proceso ( en este caso búsqueda ), en resumen, hacer algo similar a las capturas de datos de las búsquedas en muchos formularios web.

He montado este código que me funciona bien para lo que quiero hacer, pero no sé si Fivewin ya lleva algo que lo hace. En el caso de que ya lo lleve la propia librería, para utilizarlo nativamente y no reinventar la rueda.

Code: Select all  Expand view
#include 'fivewin.ch'

Static nSeconds := 0
Static lChanged := .F.

Function Main()

    Local oDlg
    Local oGet
    Local oSAy
    Local cVar := Space( 10 )

    nSeconds := Seconds()

    DEFINE DIALOG oDlg;
           SIZE 400,200
   
    @1,1 GET oGet;
         VAR cVar;
         SIZE 90,13;
         OF oDlg;
         ON CHANGE ( nSeconds := Seconds(), lChanged := .T.);
         ACTION Buscar( oGet, oSay)

    @2,1 SAY oSAy;
         PROMPT 'Escribe texto a buscar (mínimo 3 letras)';
         OF oDlg

    ACTIVATE DIALOG oDlg CENTERED ON INIT TimerInit( oDlg,oGet, oSay )

Return ( Nil )

Static Function TimerInit( oDlg,oGet, oSay)

    DEFINE TIMER oTimer;
           INTERVAL 1000;
            OF oDlg;
            ACTION TimerAction( oGet, oSay )
 
    ACTIVATE TIMER oTimer

Return ( Nil )

Static Function TimerAction( oGet, oSay )

    If lChanged .And.;
        Seconds() - nSeconds > 1 .And.;
        Len(Alltrim(oGet:cText)) > 2

        Buscar( oGet, oSay )

    Endif

Return ( Nil )

Static Function Buscar( oGet, oSay )

    oSay:SetText(Time() + ' Resultados de la búsqueda: ' + Alltrim(oGet:cText) )
    lChanged := .F.

Return ( Nil )


El resultado es el siguiente:
Image

Gracias y salud!
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: Get simulando una espera en segundos

Postby paquitohm » Mon May 06, 2024 2:34 pm

Hola Víctor,

Yo hice una cosa rara. En mis tablas de clientes, articulos, proveedores, cuentas, etc... tengo una busquedsa wild (ordwildseek()) con un timer.
La busqueda la hago sobre una dbf pero cuando el usuario deja de teclear entonces da el cambiazo y carga un array con el ordwildseek() y sobre el mismo tsbrowse pasa de estar mostrando una dbf a mostrar un array, el de los resultados.
Realmente va como un avion. La potencia de OrdWildSeek() es impresionante

Ya puedes ver que yo no encontré nada nativo de fivewin y usé como tu la tecnica del timer

Salu2
paquitohm
 
Posts: 266
Joined: Fri Jan 14, 2022 8:37 am

Re: Get simulando una espera en segundos

Postby karinha » Mon May 06, 2024 3:08 pm

Buenas tardes Víctor, confieso que no entendí el propósito de esta lógica. Publicaré como lo haría. A ver si te ayuda:

Code: Select all  Expand view

// C:\FWH\SAMPLES\VICTOR2.PRG
/*
 * Project: xFF
 * File: xFF.prg - Original. Modificado por: kapiabafwh@gmail.com
 * Description:
 * Author: JMSilva
 * Date: 06-25-2014
*/


#Include "Fivewin.ch"

FUNCTION Main()

   LOCAL oFont, oFnt, oDlg, oMemo, oBtnSair, oIco, aGrad, oKey, oBtnFind, ;
         cText, cKey := Space( 20 )

   SetBalloon( .T. )
   SkinButtons()

   // Color en el MEMO.
   TGet():bColorBlock := { |oGet| IF( oGet:lFocused, { CLR_BLACK, CLR_HCYAN },     ;
                                  IF( .NOT. oGet:lActive, { CLR_RED, CLR_YELLOW }, ;
                                                          { CLR_BLACK, CLR_WHITE } ) ) }

   cText := MemoRead( "TEXTO.txt" ) // pode ser campo memo

   aGrad := { { 0.30, nRGB( 221, 245, 255 ), nRGB( 192, 221, 255 ) }, ;
              { 0.50, nRGB( 192, 221, 255 ), nRGB( 221, 245, 255 ) } }

   DEFINE FONT oFont NAME "TAHOMA" SIZE 00, - 12 BOLD
   DEFINE FONT oFnt  NAME 'TAHOMA' SIZE 00, - 12 BOLD
   DEFINE ICON oIco FILENAME "..\icons\customer.ico"

   DEFINE DIALOG oDlg TITLE "Pesquisa com GET TEXT" SIZE 680, 480 ICON oIco ;
      GRADIENT aGrad FONT oFont STYLE nOR( WS_SYSMENU, WS_MINIMIZEBOX )

   IF Set( _SET_INSERT, ! Set( _SET_INSERT ) )
      Set( _SET_INSERT, ! Set( _SET_INSERT ) )
   ENDIF

   @ 4, 3 GET oMemo VAR cText MEMO PIXEL SIZE 330, 192 OF oDlg FONT oFont ;
      UPDATE

   oMemo:bGotFocus := {|| oMemo:SetSel( 0, 0 ) }
   oMemo:lReadOnly := .T.  // nÆo edita

   @ 13.10, 07 SAY "<Click> na Lupa Para Procurar: " OF oDlg UPDATE ;
      COLORS METRO_GREEN, CLR_WHITE TRANSPARENT FONT oFnt

   @ 13.85, 1 SAY "PESQUISA: " OF oDlg UPDATE COLORS CLR_HBLUE, CLR_WHITE ;
      TRANSPARENT FONT oFont

   @ 16, 5 GET oKey VAR cKey PICTURE "@!" SIZE 150, 12 OF oDlg ;
      BITMAP "..\bitmaps\Find2.bmp"                            ;
      ACTION ( Find( oMemo, Trim( cKey ), .T. ), oBtnFind:Enable() )

   oKey:cToolTip := "Digite o Texto a Procurar"

   oKey:bKeyChar := {|| oBtnFind:Disable() }

   oKey:lBtnTransparent := .T.
   oKey:lAdjustBtn      := .T.

   @ 203, 195 BTNBMP oBtnFind PROMPT "&Próximo" SIZE 50, 18 OF oDlg ;
      LEFT 2007 FLAT FILENAME "../bitmaps/Next.bmp"                 ;
      ACTION Find( oMemo, Trim( cKey ), .F. ) WHEN( Find() )

   oBtnFind:cToolTip := " Próximo Texto a Procurar"

   oBtnFind:Disable()

   @ 203, 290 BTNBMP oBtnSair PROMPT " &Salir" SIZE 40, 18 OF oDlg  ;
      2007 FLAT LEFT FILENAME "../bitmaps/Exit.bmp" ACTION( oDlg:End() )

   oBtnSair:cToolTip := " Salida - Exit - Cancelar"

   oBtnSair:lCancel := .T.

   ACTIVATE DIALOG oDlg CENTERED ON INIT( XFOCUS( oKey ) )

   IF Set( _SET_INSERT, ! Set( _SET_INSERT ) )
      Set( _SET_INSERT, ! Set( _SET_INSERT ) )
   ENDIF

   oFont:End()
   oFnt:End()

RETURN NIL

FUNCTION Find( oMemo, cFind, lNew )

   LOCAL nIndex := 0

   STATIC nStart := 0

   IF PCount() == 0 ; RETURN( nStart > 0 ) ; ENDIF // when

   IF lNew ; nStart := 1; ENDIF               // start

   nIndex := At( Trim( cFind ), Upper( oMemo:cText ), nStart, Len( oMemo:cText ) )

   IF nIndex > 0

      oMemo:Setfocus()     // seta o focu
      oMemo:SetPos( nIndex - 1, nIndex ) // posiciona
      oMemo:SetSel( nIndex - 1, nIndex + Len( Trim( cFind ) ) - 1 )

      RESetSelection( oMemo:hWnd, nIndex + Len( Trim( cFind ) ), nIndex )  // faz a rolagem do texto

      oMemo:Change()

      nSTART := nIndex + Len( Trim( cFind ) )// para continuar a pesquisa

   ELSEIF lNew

      MsgStop( "A palavra: " + cFind + " não foi localizada", "Find" )

      oMemo:SetSel( 0, 0 )

      nStart := 1

   ELSE

      MsgStop( "Nenhuma outra ocorrência foi encontrada", "Find" )

      nIndex := nStart - Len( Trim( cFind ) )

      oMemo:SetPos( nIndex - 1, nIndex ) // posiciona

   ENDIF

RETURN( .T. )

FUNCTION xFocus( oObj )

   xSetFocus( oObj )
   xSetFocus( oObj )

RETURN( .T. )

FUNCTION xSetFocus( oObj )    

   LOCAL _oWnd := oObj:oWnd, _oTempo := ""

   DEFINE TIMER _oTempo INTERVAL 10 OF _oWnd ;
      ACTION ( oObj:SetFocus(), _oTempo:End() )

   ACTIVATE TIMER _oTempo

RETURN( .T. )

// FIN / END
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7826
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Get simulando una espera en segundos

Postby karinha » Mon May 06, 2024 3:16 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7826
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Get simulando una espera en segundos

Postby VictorCasajuana » Mon May 06, 2024 6:02 pm

paquitohm wrote:Hola Víctor,

Yo hice una cosa rara. En mis tablas de clientes, articulos, proveedores, cuentas, etc... tengo una busquedsa wild (ordwildseek()) con un timer.
La busqueda la hago sobre una dbf pero cuando el usuario deja de teclear entonces da el cambiazo y carga un array con el ordwildseek() y sobre el mismo tsbrowse pasa de estar mostrando una dbf a mostrar un array, el de los resultados.
Realmente va como un avion. La potencia de OrdWildSeek() es impresionante

Ya puedes ver que yo no encontré nada nativo de fivewin y usé como tu la tecnica del timer

Salu2


Gracias, el tema de las búsquedas ya es un tema secundario respecto a lo que estoy buscando, la clave es el manejo del get con la espera después de la última pulsación, pero como tú dices, no hay nada nativo en Fivewin y lo mejor es jugar con el timer
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: Get simulando una espera en segundos

Postby VictorCasajuana » Mon May 06, 2024 6:05 pm

karinha wrote:Victor, mira AUTOGET también:

https://forums.fivetechsupport.com/viewtopic.php?f=3&t=21772&hilit=autoget

Regards, saludos.


Gracias por el ejemplo que me pasas anteriormente, lo he revisado y lo que estoy buscando es si hay algo nativo en Fivewin, de lo contrario ya lo tengo montado con lo que he pasado al principio. Respecto al Autoget, lo conozco y utilizo, pero no deja de ser un get "vitaminado" que puede incluir los resultados, yo lo que estoy buscando el tema previo a la búsqueda, la gestión de la espera después de la última pulsación para ejecutar la búsqueda. Posteriormente fivewin ya proporciona múltiples controles para mostrar los resultados, autoget, xbrowse, listbox, etc...
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 29 guests