Escolher registro com ENTER no BROWSE...

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Escolher registro com ENTER no BROWSE...

Mensagem por ANDRIL »

Ola pessoal,

Tenho um DIALOG com os GETS para cadastrar o cliente. Coloquei um BUTTONEX [...] para que possa ao clicar chamar um novo DIALOG com um BROWSE retirado aqui do forum, onde digito e faço uma busca pelo nome do cliente.

Ao localizar o cliente, teclo ENTER e o DIALOG se fecha rapidamente e abre novamente, como se ficasse no keyboard o CHR(13) tentei usar o CLEA TYPE mais nao resolveu, gostaria de teclar ENTER e voltar ao dialog anterior. Ja uso o EndDialog() mais como disse, fecha e abre novamente.

Código: Selecionar todos


local arq1,areantes:=alias(),idxantes:=indexord()


IF abrearea("CLIENTE")=.F.
   return nil
ENDIF
PRIVATE gPes, vPes:="",keyAnt:=0,oBrw,oButFechar,recebedados:=1,oFrm

       INDEXORD(1)

       INIT DIALOG oFrm TITLE [Pesquisando Cliente] CLIPPER FONT oFont;
               SIZE larjanmain-100,altjanmain-200 ;
               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

       *@ 550,altjanmain-250 BUTTON oButFechar CAPTION "Fechar" size 80,32;
       *STYLE WS_TABSTOP ACTION { || EndDialog() }

       @ 700,altjanmain-270 BUTTON oButton3 CAPTION "Fechar"  OF oFrm  SIZE 80,32 ;
        STYLE WS_TABSTOP ON CLICK { || EndDialog() }


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

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

       
       @ 10 ,50 BROWSE oBrw DATABASE OF oFrm SIZE 850, 380  ;
            STYLE  WS_VSCROLL + WS_HSCROLL;
            ON POSCHANGE {|| SetFocus(oBrw:handle ) };
            ON CLICK {|| BrowseKey(oBrw,13)}

       *oBrw:alias := aLIAS()

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

       oBrw:AddColumn( HColumn():New( "Nome" , FieldBlock("CLIENTE"),"C", 40,0) )
       oBrw:AddColumn( HColumn():New( "Endereco" , FieldBlock("ENDERECO"),"C", 50,0) )
       oBrw:AddColumn( HColumn():New( "Telefone1" , FieldBlock("TELEFONE"),"C", 09,0) )
       oBrw:AddColumn( HColumn():New( "Telefone2" , FieldBlock("TELEFONE1"),"C", 09,0) )

       ACTIVATE DIALOG oFrm
       FECHAAREA("CLIENTE")
       ABREAREA(areantes)
RETURN oForm:lresult


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


      DO CASE
           CASE KEY= 27 
            EndDialog()
           
           CASE KEY =46
             //MSGINFO([DEL])
             //DBDELETE()
             oBrw:REFRESH()

           CASE KEY = 13
              RECEBEDADOS()
              **************************aqui fecho o dialog*************************
              [b]EndDialog()[/b] 
              [b]aqui faz encerrar e reabre novamente logo apos, já com o clique do mouse nao ocorre a reabertura[/b]
              *************************************************************************

              RETURN .F.

           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(UPPER(vpes))
      //locate for vPes in Nome
      oBrw:Refresh()
      oBrw:SetFocus()
    return nil



Como consigo resolve isto?

Ate+,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Escolher registro com ENTER no BROWSE...

Mensagem por sygecom »

Tche, segunda-feira e toh recem pegando no tranco, se poder posta tudo com DBF que vou testar aqui e tentar enteder o que você deseja e ajusto no seu proprio exemplo.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
alvaro.bernardi
Usuário Nível 1
Usuário Nível 1
Mensagens: 40
Registrado em: 22 Nov 2008 11:02
Localização: Porto Velho

Re: Escolher registro com ENTER no BROWSE...

Mensagem por alvaro.bernardi »

Utilizei tua rotina criando uma genérica para uso em qualquer formulário e funcionou corretamente

Código: Selecionar todos


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

STATIC Thisform, oForm, oFont, oBrw

FUNCTION grid()
  Local aItems := {}, g1, g2, oEdit1
  PRIVATE gPes, vPes:="", keyAnt:=0, aDB
  Parameter p1, p2, ordem  // passo o primeiro campo, o segundo e a ordem

  // O arquivo já deve estar aberto no form principal que chamou o grid 
  go top
  
  G1 := TYPE(P1)  
  G2 := TYPE(P2)
  
  ord_ := indexord()
  set order to ordem

  aDB := DBF()

  INIT DIALOG oForm CLIPPER NOEXIT TITLE "Localizar";
       FONT oFont ;
       AT 0, 0 SIZE 700, 425 ;
       STYLE DS_CENTER + WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU
      
       @ 10 ,50 BROWSE oBrw DATABASE OF oForm SIZE 690, 300  ;
                STYLE  WS_VSCROLL + WS_HSCROLL;
                ON POSCHANGE {|| SetFocus(oBrw:handle ) } ;
                ON CLICK {|| BrowseKey(oBrw,13)}
               
           oBrw:bKeyDown := {|o,key| BrowseKey(o, key) }

           oBrw:AddColumn( HColumn():New( "Codigo"    , FieldBlock(p1),type(p1), 10,0) )
           oBrw:AddColumn( HColumn():New( "Descrição" , FieldBlock(p2),type(p2), 50,0) )

       @ 620, 395 BUTTON '&Ok' SIZE 75,25 ON CLICK {|| oForm:Close() } // não implementado

  ACTIVATE DIALOG oForm
  
  set order to ord_

Return(recno())

*****************************************************************************
Static Function BrowseKey( oBrowse, key )
*****************************************************************************

DO CASE
   CASE KEY= 27
        EndDialog()

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

   CASE KEY = 13
        MSGINFO(&p2)
        //RECEBEDADOS()
        **************************aqui fecho o dialog*************************
        //[b]EndDialog()[/b]
        //[b]aqui faz encerrar e reabre novamente logo apos, já com o clique do mouse nao ocorre a reabertura[/b]
        *************************************************************************
      RETURN .F.

   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

   (aDb) -> (DbSeek(vPes))
   dbseek(UPPER(vpes))
   //locate for vPes in Nome
   oBrw:Refresh()
   oBrw:SetFocus()

return nil

Quando digito a sequencia correta ele acha ...
Álvaro de Oliveira Bernardi
Microline Software
Porto Velho - RO
Responder