Browse com busca incremental

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Browse com busca incremental

Mensagem por Luciano Bonfim »

Pessoal,

tem como fazer uma busca incrmental (ir dando seek cumulativos conforme o usuario for pressionando uma tecla) igual faço no DBEDIT porem usando o BROWSE da HWGUI

uso assim:

Código: Selecionar todos

@ 10,40 BROWSE oBrw DATABASE OF oFrm SIZE 680,400;
        STYLE  WS_VSCROLL + WS_HSCROLL
alguem tem algum exemplo disto? ou existe uma outra classe que faça isso melhor na HWGUI?

Muito Obrigado
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Olha esse exemplo que esta no Grupo da HWGUI:

Código: Selecionar todos

#define x_BLUE       16711680
#define x_DARKBLUE   10027008
#define x_WHITE      16777215
#define x_CYAN       16776960
#define x_BLACK             0
#define x_RED             255
#define x_GREEN         32768
#define x_GRAY        8421504
#define x_YELLOW        65535
#define HB_EXT_INKEY

#include "windows.ch"
#include "guilib.ch"
#include "hwgui.ch"

Function MAIN()
cria_bd()
USE CLIENTES
INDEX ON NOME_CLI TO NOME

frm_pesquisa()
return nil

function frm_pesquisa()
   Private  oBrw
   PRIVATE oDlgHabla:=NIL

   Private gPes,vPes:="",keyAnt:=0


   PREPARE FONT oFontBtn NAME "Arial" WIDTH 0 HEIGHT -12 charset 255

           Private xBtn2


    INIT DIALOG oFrm TITLE [Titulo] CLIPPER FONT oFontBtn;
           SIZE 800,600 ;
           STYLE WS_DLGFRAME + WS_SYSMENU + DS_CENTER NOEXIT

   @ 5,0  say "Pesquisa:" size 70,20
   @ 5,15 SAY gPes CAPTION vPes size 200,20 ;
         STYLE WS_BORDER COLOR 10485760;
         BACKCOLOR 12507070

   @ 10,550 say oTecla CAPTION space(30) size 200,25

   @ 500,0 say [F7 - Sobre - F11 Calculadora]  size 250,30

   @ 10 ,140 BROWSE oBrw DATABASE OF oFrm SIZE 780, 380  ;
        STYLE  WS_VSCROLL + WS_HSCROLL;
        ON CLICK {|o,key| BrowseKey()} ;
        ON POSCHANGE {|| SetFocus(oBrw:handle ) }

   oBrw:alias := aLIAS()


   oBrw:bKeyDown := {|o,key| BrowseKey(o, key) }

   oBrw:AddColumn( HColumn():New( "Field1" , FieldBlock(Fieldname(1)),"C", 10,0) )
   oBrw:AddColumn( HColumn():New( "Field1" , FieldBlock(Fieldname(2)),"C", 30,0) )

   aAmarelo := VColor("00ECF3F4")

   aVerde:= VColor("00DCE6DC")


   FOR nI := 1 TO 2
       oBrw:aColumns[ni]:bColorBlock := {|| IF(MOD(recno(), 2) = 0,;
                  {x_BLACK, aVerde, x_CYAN, x_DARKBLUE} , ;
                  {x_BLACK, aAmarelo , x_WHITE, x_DARKBLUE })}
   NEXT

   //oBrw:lesc:= .t.

   //setfocus(obrw:handle)
  //oFrm:bActivate:={||setfocus(oBrw:handle)}

   oFrm:Activate()

   IF oDlgHabla#NIL
      oDlgHabla:CLOSE()
   ENDIF

RETURN .t.




Static Function BrowseKey( oBrowse, key )
   Local vTxt :=[Tecla Pressionada:]+strzero(key,3)
   SetWindowText( oTecla:handle, vTxt)


  DO CASE
       CASE KEY= 27
       msginfo([oi])
           EndDialog()

       CASE KEY =46
         MSGINFO([DEL])
         DBDELETE()
         OBROWSE:REFRESH()

//       CASE (KEY = 13)
//           Tela2()


       otherwise
       PesqInc( oBrowse, key )
  ENDCASE

Return .T.



Static Function PesqInc( oBrowse, key )
   if  (key >=96 .and. key<=105)
      key:= key-48
   ENDIF

  IF key == VK_BACK .or. key == VK_LEFT
     If len(vPes) > 0
        vPes := substr(vpes,1,len(vPes)-1)
     EndIf
  ElseIf key == VK_UP .or. key == VK_DOWN
     return .t.

  ElseIf key =16
      keyAnt:=Key
      return .t.

  ElseIf (key <48) .and. key#32 // PGDWN PGUP  #32 = space
       return .t.
  Else

    if key =190
       vPes += [.]
    elseif key=194
       vPes += [.]
    elseif key=188
       vPes += [,]
    elseif key=110
       vPes += [,]
    elseif key=97 //.
       vPes += [.]
    elseif key>=96 .and. key<=105
       key := key -48
    else
      IF IsCapsLockActive() .or. KeyAnt=16
      ELSE
         if key>=65 .and. key <=90
            key := key+32
         endif
      ENDIF
      vPes += chr(key)
    endif

  EndIf
  keyAnt:=key

  gPes : SetText(vPes)
  //gPes : Refresh()
  gPes : SetFocus()

  //(aDb) -> (DbSeek(vPes)) //Nao esta indexado
  dbseek(vpes)
  //locate for vPes in Nome
  oBrowse:Refresh()
  oBrowse:SetFocus()
return nil



function cria_bd()
     ESTRU5:={}
     AADD(ESTRU5,{[CODIGO_CLI],[C],05,0})
     AADD(ESTRU5,{[NOME_CLI  ],[C],30,0})
     AADD(ESTRU5,{[NOME_CLI  ],[C],30,0})
     DBCREATE([CLIENTES],ESTRU5)
     use clientes new

     DBAPPEND()
     REPLACE CODIGO_CLI WITH [00001]
     REPLACE NOME_CLI   WITH [Jose da Silva]

     DBAPPEND()
     REPLACE CODIGO_CLI WITH [00002]
     REPLACE NOME_CLI   WITH [Antonio Silva]

     DBAPPEND()
     REPLACE CODIGO_CLI WITH [00003]
     REPLACE NOME_CLI   WITH [Carlos  Silva]

     DBAPPEND()
     REPLACE CODIGO_CLI WITH [00004]
     REPLACE NOME_CLI   WITH [Pedro   Silva]

     //INDEX ON CODIGO_CLI to codcli
     FOR I:=4 TO 1000
        DBApPEND()
        REPLACE CODIGO_CLI with STRZERO(I,5)
        REPLACE NOME_CLI   WITH [Clientews lkjslkfajlk]+codigo_cli
     NEXT


     close all

return nil
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder