Clipper On Line • Ver Tópico - Rotinas pra browse

Rotinas pra browse

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Rotinas pra browse

Mensagempor JoséQuintas » 30 Out 2018 10:49

Por causa do FlagShip, acabei criando algumas rotinas auxiliares pra browse.

Esta primeira apenas trata as teclas padrão.
Permite pelo menos eliminar repetição da parte comum.
Lá na sua rotina de browse....

DO WHILE .T.
   DO CASE
   CASE BrowseNavigate( oBrowse, @nKey )
   CASE nKey == K_ESC
      EXIT
   ENDCASE
ENDDO


FUNCTION BrowseNavigate( oBrowse, nKey )

   LOCAL lNavigate := .T.

   DO WHILE ! oBrowse:Stabilize()
      nKey := Inkey()
      IF nKey != 0
         EXIT
      ENDIF
   ENDDO
   IF oBrowse:Stable
      nKey := Inkey(0)
   ENDIF
   DO CASE
   CASE nKey == K_UP         ; oBrowse:up()
   CASE nKey == K_DOWN       ; oBrowse:down()
   CASE nKey == K_LEFT       ; oBrowse:left()
   CASE nKey == K_RIGHT      ; oBrowse:right()
   CASE nKey == K_HOME       ; oBrowse:home()
   CASE nKey == K_END        ; oBrowse:end()
   CASE nKey == K_PGUP       ; oBrowse:pageup()
   CASE nKey == K_PGDN       ; oBrowse:pagedown()
   CASE nKey == K_CTRL_PGUP  ; oBrowse:gotop(); oBrowse:RefreshAll()
   CASE nKey == K_CTRL_PGDN  ; oBrowse:gobottom(); oBrowse:RefreshAll()
   CASE nKey == K_CTRL_HOME  ; oBrowse:panhome()
   CASE nKey == K_CTRL_END   ; oBrowse:panend()
   CASE nKey == K_CTRL_LEFT  ; oBrowse:panleft()
   CASE nKey == K_CTRL_RIGHT ; oBrowse:panright()
   OTHERWISE
      lNavigate := .F.
   ENDCASE

   RETURN lNavigate


Esta outra um browse mais prático.

LOCAL oTBrowse := { ;
      { "codigo", { || código } }, ;
     { "nome", { || nome } } }
MyBrowse( 0, 0, 24, 79, oTBrowse )


FUNCTION MyBrowse( nTop, nLeft, nBottom, nRight, oTBrowse, bFunction, obSetKey )

   LOCAL oBrowser, nKey, nCont, nItem

   IF pCount() < 7
      obSetKey := {}
   ENDIF
   IF pCount() < 6
      bFunction := NIL
   ENDIF
   oBrowser := TBrowseDb( nTop, nLeft, nBottom, nRight )
   oBrowser:HeadSep := Chr(194) + Chr(196)
   oBrowser:ColSep  := Chr(179)
   FOR nCont = 1 TO Len( oTBrowse )
      oBrowser:AddColumn( TBColumnNew( oTBrowse[ nCont, 1 ], oTBrowse[ nCont, 2 ] ) )
   NEXT
   AAdd( obSetKey, { K_UP,         { || oBrowser:Up() } } )
   AAdd( obSetKey, { K_DOWN,       { || oBrowser:Down() } } )
   AAdd( obSetKey, { K_LEFT,       { || oBrowser:Left() } } )
   AAdd( obSetKey, { K_RIGHT,      { || oBrowser:Right() } } )
   AAdd( obSetKey, { K_HOME,       { || oBrowser:Home() } } )
   AAdd( obSetKey, { K_END,        { || oBrowser:End() } } )
   AAdd( obSetKey, { K_PGUP,       { || oBrowser:PageUp() } } )
   AAdd( obSetKey, { K_PGDN,       { || oBrowser:PageDown() } } )
   AAdd( obSetKey, { K_CTRL_PGUP,  { || oBrowser:GoTop(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_PGDN,  { || oBrowser:GoBottom(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_HOME,  { || oBrowser:GoTop(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_END,   { || oBrowser:GoBottom(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_LEFT,  { || oBrowser:PanLeft() } } )
   AAdd( obSetKey, { K_CTRL_RIGHT, { || oBrowser:PanRight() } } )
   DO WHILE .T.
      DO WHILE ! oBrowser:Stable() .AND. nKey == 0
         nKey := Inkey()
         oBrowser:Stabilize()
      ENDDO
      IF nKey == 0
         nKey := Inkey(0)
      ENDIF
      DO CASE
      CASE ( nItem := AScan( obSetKey, { | e | e[ 1 ] == nKey } ) ) != 0
         DO WHILE ! oBrowser:Stable()
            oBrowser:Stabilize()
         ENDDO
         Eval( obSetKey[ nItem, 2 ], oBrowser, nKey )
         oBrowser:RefreshAll()
      CASE nKey == K_ESC        ; EXIT
      CASE nKey == K_UP         ; oBrowser:Up()
      CASE nKey == K_DOWN       ; oBrowser:Down()
      CASE nKey == K_LEFT       ; oBrowser:Left()
      CASE nKey == K_RIGHT      ; oBrowser:Right()
      CASE nKey == K_HOME       ; oBrowser:Home()
      CASE nKey == K_END        ; oBrowser:End()
      CASE nKey == K_PGUP       ; oBrowser:PageUp()
      CASE nKey == K_PGDN       ; oBrowser:PageDown()
      CASE nKey == K_CTRL_PGUP  ; oBrowser:GoTop();    oBrowser:RefreshAll()
      CASE nKey == K_CTRL_PGDN  ; oBrowser:GoBottom(); oBrowser:RefreshAll()
      CASE nKey == K_CTRL_HOME  ; oBrowser:PanHome()
      CASE nKey == K_CTRL_END   ; oBrowser:PanEnd()
      CASE nKey == K_CTRL_LEFT  ; oBrowser:PanLeft()
      CASE nKey == K_CTRL_RIGHT ; oBrowser:PanRight()
      OTHERWISE
         IF bFunction != NIL
            DO WHILE ! oBrowser:Stable()
               oBrowser:Stabilize()
            ENDDO
            Eval( bFunction, oTBrowse, nKey )
            oBrowser:RefreshAll()
         ENDIF
      ENDCASE
   ENDDO

   RETURN NIL


Ponto interessante:

É melhor usar codeblock do que função. Porque? porque a função do codeblock pode ser STATIC, portanto, visível somente no módulo.
Também dá pra usar o bSetKey pra acionar rotinas conforme a tecla, e usar funções STATIC

bSetKey := { ;
   { K_F2, { || incluir() } }, ;
   { K_F3, { || Alterar() } }, ;
   { K_F4, { || Excluir() } }, ;
   { K_F5, { || Imprimir() } } }
...
MyBrowse( 0, 0, 24, 79, oTBrowse, , bSetKey )


Criei pra tapar buraco no Flagship, e até que ficaram interessantes..... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotinas pra browse

Mensagempor alxsts » 30 Out 2018 11:20

Olá!

O Harbour encapsulou esta parte de teste de teclas em um método que não existia no Clipper: applyKey( nKey ). Isto não funciona em FlagShip?

      // display browser and process user input
      DO WHILE .T.
         oTBrowse:forceStable()
         nKey := Inkey(0)

         IF oTBrowse:applyKey( nKey ) == TBR_EXIT
            EXIT
         ENDIF
      ENDDO
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Rotinas pra browse

Mensagempor alxsts » 30 Out 2018 11:32

Olá!

Eu já usava estes codeblocks no tempo do Clipper. Carregava um array com a associação de teclas e funções na variável cargo do TBrowse e verificava no momento em que o usuário digitava algo.:
oBrowse:cargo := { ;
   { K_F2, { || incluir() } }, ;
   { K_F3, { || Alterar() } }, ;
   { K_F4, { || Excluir() } }, ;
   { K_F5, { || Imprimir() } } }
      .
      .
      .
   IF oBrowse:Stable
      nKey := Inkey(0)
   ENDIF

   DO CASE

      CASE !Empty( oBrowse:cargo ) .And. Valtype( oBrowse:cargo ) == "A"
         AEval( oBrowse:cargo, { |e| IF( e[1] == nKey, Eval( e[2] ), NIL ) } )
      CASE nKey == K_UP         ; oBrowse:up()
      .
      .
      .
   ENDCASE
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Rotinas pra browse

Mensagempor JoséQuintas » 30 Out 2018 12:09

O problema do Flagship é que não é tão compatível assim.
Classes não tem nada a ver com Harbour.
Rotina de erros, getsys, etc. nada a ver.
Então... só resta alguns quebra-galhos até trocar pra Harbour.
Nem mouse funciona no Flagship, e nem a tecla de backspace, só seta pra esquerda.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotinas pra browse

Mensagempor JoséQuintas » 30 Out 2018 21:30

É o visual do tbrowse normal. Isso é pra facilitar código fonte, e não pra alterar visual.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 18 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro