Clipper On Line • Ver Tópico - Rotina de tbrowse

Rotina de tbrowse

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

Moderador: Moderadores

 

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 18:28

Esta é uma das rotinas que uso no aplicativo, por exemplo na tela de pedidos.
Não tem nada de extraordinário nela, tem até parte que pode ser eliminada, do tempo que eu não usava SET SCOPE.
Uso duas rotinas genéricas de tbrowse, e talvez 1 ou 2 muito específicas, mas que nem olhei ainda se dá pra passar pra genérica.

Só lembrando que em produtos de pedidos não precisa pesquisar em ordem alfabética, filtrar iniciais conforme digita, etc.
São os produtos que entraram em um pedido.

FUNCTION DbView( nTop, nLeft, nBottom, nRight, oTBrowse, bUserFunction, nFixToCol, mSkipVar, bSkipCpo, aHotKeys )

   LOCAL oBrowse, nkey, lmore, col, mRecNo
   LOCAL nMRow, nMCol, nCont, oElement

   IF oTBrowse == NIL
      oTBrowse := {}
      FOR nCont = 1 TO FCount()
         AAdd( oTBrowse, { FieldName( nCont ), FieldBlock( FieldName( nCont ) ) } )
      NEXT
   ENDIF
   oBrowse := tbrowsedb( nTop, nLeft, nBottom + 1, nRight )
   oBrowse:HeadSep := " "
   oBrowse:FootSep := " "
   oBrowse:ColSep  := " "
   IF mSkipvar != NIL .AND. bSkipcpo != NIL
      oBrowse:SkipBlock     := { | nSkip | dbViewSkip( nSkip, mSkipvar, bSkipcpo ) }
      oBrowse:GoBottomBlock := { || dbViewBottom( mSkipvar ) }
      oBrowse:GoTopBlock    := { || dbViewTop( mSkipvar ) }
   ENDIF
   FOR EACH oElement IN oTBrowse
      Col := TbColumnNew( oElement[ 1 ], oElement[ 2 ] )
      IF Len( oElement ) > 2
         col:ColorBlock := oElement[ 3 ]
      ENDIF
      oBrowse:AddColumn( col )
   NEXT
   oBrowse:ColorSpec := SetColorTBrowse()

   IF nFixToCol != NIL
      oBrowse:freeze := nFixToCol
   ENDIF
   IF aHotKeys == NIL
      aHotKeys := {}
   ELSE
      FOR EACH oElement IN aHotKeys
         @ oElement[ 1 ], oElement[ 2 ] SAY oElement[ 5 ]
      NEXT
   ENDIF
   DO WHILE .NOT. oBrowse:Stable
      oBrowse:Stabilize()
   ENDDO
   lmore := .T.
   DO WHILE lmore
      oBrowse:RefreshCurrent()
      nkey := 0
      DO WHILE .NOT. oBrowse:Stable // // Problemas ao acelerar dbview
         oBrowse:Stabilize()
      //   nkey := Inkey()
      ENDDO
      IF oBrowse:Stable
         oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:ColCount }, { 3, 3 } ) // linha está com o cursor
         oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com cursor
         nkey := Inkey(600)
         IF nKey == 0
            KEYBOARD Chr( K_ESC )
            LOOP
         ENDIF
      ENDIF
      nMRow := MROW()
      nMCol := MCOL()
      DO CASE
      CASE SetKey( nKey ) != NIL
         Eval( SetKey( nKey ), ProcLine(), ProcName(), ReadVar() )
      CASE nKey > 999
         DO CASE
         CASE mBrzMove( oBrowse, nMRow, nMCol, nTop + 2, nLeft + 1, nBottom, nRight - 1 ) // Move cursor
         CASE mBrzClick( oBrowse, nMRow, nMCol ) // click no tbrowse atual
            KEYBOARD Chr( K_ENTER )
            Inkey(0)
            nKey := 13
         CASE nKey == K_LBUTTONDOWN
            FOR EACH oElement IN aHotKeys
               IF nMRow >= oElement[ 1 ] .AND. nMRow <= oElement[ 3 ] .AND. nMCol >= oElement[ 2 ] .AND. nMCol <= oElement[ 4 ]
                  nKey := oElement[ 6 ]
                  EXIT
               ENDIF
            NEXT
         ENDCASE
      CASE nkey == K_DOWN ;      oBrowse:Down() ;     LOOP
      CASE nkey == K_PGDN ;      oBrowse:PageDown() ; LOOP
      CASE nkey == K_PGUP ;      oBrowse:PageUp()   ; LOOP
      CASE nkey == K_CTRL_PGDN ; oBrowse:GoBottom() ; LOOP
      CASE nkey == K_UP ;        oBrowse:Up() ;       LOOP
      CASE nkey == K_CTRL_PGUP ; oBrowse:GoTop() ; oBrowse:RefreshAll() ; LOOP
      CASE nkey == K_HOME ;      oBrowse:GoTop() ;    LOOP
      CASE nkey == K_END ;       oBrowse:GoBottom() ; LOOP
      CASE nkey == K_RIGHT ;     oBrowse:Right() ;    LOOP
      CASE nkey == K_LEFT ;      oBrowse:Left() ;     LOOP
      CASE nKey == Asc( "0" );   hb_KeyPut( K_INS );  LOOP
      CASE nKey == Asc( "." );   hb_KeyPut( K_DEL );  LOOP
      CASE nKey == Asc( "7" );   hb_KeyPut( K_HOME ); LOOP
      CASE nKey == Asc( "8" );   hb_KeyPut( K_UP );   LOOP
      CASE nKey == Asc( "2" );   hb_KeyPut( K_DOWN ); LOOP
      CASE nKey == Asc( "9" );   hb_KeyPut( K_PGUP ); LOOP
      CASE nKey == Asc( "3" );   hb_KeyPut( K_PGDN ); LOOP
      ENDCASE
      IF nkey == K_ESC .OR. ( nkey == K_ENTER .AND. bUserFunction == NIL ) // ENTER só sai se não existir função definida
         lmore := .F.
      ENDIF
      IF bUserFunction # NIL
         DO WHILE .NOT. oBrowse:Stable
            oBrowse:Stabilize()
         ENDDO
         WSave( MaxRow() - 1, 0, MaxRow(), MaxCol() )
         mRecno := RecNo()
         IF ValType( bUserFunction ) == "C"
            &bUserFunction( oBrowse, nKey )
         ELSE
            Eval( bUserFunction, oBrowse, nKey )
         ENDIF
         nKey := 0 // Testar se resolve saída indesejavel
         IF mRecno != RecNo() .OR. Deleted()
            Eval( oBrowse:SkipBlock, 1 )
         ENDIF
         oBrowse:RefreshAll()
         WRestore()
      ENDIF
   ENDDO
   //SetCursor( SC_NORMAL )
   RETURN  ( nkey == K_ENTER )

FUNCTION dbViewSkip( nSkip, cScopeValue, bScopeMacro )

   LOCAL nSkipped := 0, nRecNo // Para ADO

   IF .NOT. Eof()
     IF Eval( bScopeMacro ) != cScopeValue
        GOTO LastRec() + 1
     ENDIF
     IF ( nSkip == 0 )
         SKIP 0
     ELSEIF ( nSkip > 0 .AND. Eval( bScopeMacro ) = cScopeValue .AND. .NOT. Eof() )
       DO WHILE nSkipped < nSkip
          SKIP
          IF Eof() .OR. Eval( bScopeMacro ) > cScopeValue
             SKIP -1
             EXIT
          ENDIF
          nSkipped++
       ENDDO
     ELSEIF ( nSkip < 0 ) .AND. Eval( bScopeMacro ) = cScopeValue
       DO WHILE  ( nSkipped > nSkip )
          nRecNo := RecNo() // alterado aqui pra ADO
          SKIP -1
          IF Bof() .OR. nRecNo == RecNo() .OR. Eval( bScopeMacro ) < cScopeValue // alterado aqui pra ADO
             IF Eval( bScopeMacro ) < cScopeValue
                SKIP
             ENDIF
             EXIT
          ENDIF
          nSkipped--
       ENDDO
     ENDIF
   ENDIF
   RETURN ( nSkipped )

FUNCTION dbViewBottom( cScopeValue )

   SEEK cScopeValue + Replicate( Chr(255), 10 ) SOFTSEEK
   SKIP -1
   RETURN NIL

FUNCTION dbViewTop( cScopeValue )

   SEEK cScopeValue SOFTSEEK
   RETURN NIL


No uso mais simples:

USE arquivo
dbView()
USE
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 18:37

Faltou dizer:

CASE mBrzMove( oBrowse, nMRow, nMCol, nTop + 2, nLeft + 1, nBottom, nRight - 1 ) // Move cursor 
CASE mBrzClick( oBrowse, nMRow, nMCol ) // click no tbrowse atual


Estas duas rotinas se referem a mouse. Acho que retirei da superlib, não lembro mais.
Uma posiciona a linha do tbrowse no click do mouse (quando não está posicionado) e a outra é o click na opção selecionada.

O TBrowse inclui criação de "botões" pra clicar com o mouse, em modo texto.
É aquele Hotkeys.
Já esqueci o conteúdo, vou verificar... 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 18:51

Tive que olhar o fonte.
Aqui:

      FOR EACH oElement IN aHotKeys
         @ oElement[ 1 ], oElement[ 2 ] SAY oElement[ 5 ]
      NEXT


Significa que o elemento 1 e 2 são linha e coluna, e o 5 é o texto

e aqui:

            FOR EACH oElement IN aHotKeys
               IF nMRow >= oElement[ 1 ] .AND. nMRow <= oElement[ 3 ] .AND. nMCol >= oElement[ 2 ] .AND. nMCol <= oElement[ 4 ]
                  nKey := oElement[ 6 ]
                  EXIT
               ENDIF
            NEXT


Significa que 3 e 4 também são linha e coluna, igual a um box/retângulo, linha inicial, coluna inicial, linha final, coluna final
E o 6 seria a tecla equivalente, o Inkey correspondente ao clique.

Então seria algo parecido com isto:

aHotKeys := { ;
   { 1, 5, 1, 10, "inclui", K_INS }, ;
   { 1, 21, 1, 20, "Altera", K_ENTER }, ;
   { 1, 31, 1, 40, "Exclui", K_DEL } }


Clicou no texto "inclui", é convertido pra tecla Insert, seria isso.

Comentário:
Essa rotina vém do tempo do Clipper.
Mesmo no Clipper, tela console, o mouse estava disponível pra algo mais !!
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 19:02

Outras duas funções que usei aí:

WSave( MaxRow() - 1, 0, MaxRow(), MaxCol() )
WRestore()


Seria algo como save screen, restore screen.

Explicação:
A função de usuário pode chamar uma sub-rotina, que pode abrir uma janela, ou até apagar a tela.
Não importa o que aconteça na função de usuário, a tela volta do jeito que estava.
O detalhe a mais é que wSave() pode salvar somente um pedaço da tela, e wRestore() vai devolver exatamente o pedaço que foi salvo, na posição que foi salvo.
Simples e prático.
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 19:12

Teve mais uma:

FUNCTION SetColorTbrowse()

   RETURN SetColorSay() + "," + SetColorFocus() + ",15/3" + ",7/2,7/4,7/5,7/10,7/13"


Nada demais, só a tabelinha de cores usada no tbrowse.
É porque dá pra definir cores conforme determinada condição.
O aplicativo inteiro segue o mesmo padrão de cores, então só alterar as funções de cores, e tudo se altera.
Esses números são os códigos da tabela de cores, é coisa padrão do Clipper e do tbrowse, não fui eu quem inventou.
Eu apenas indiquei quais são as cores. Isso só retorna uma string, não compliquei nada.... rs
Só deixei separado dos fontes, pra facilitar.
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 19:55

O uso em pedidos:

   oTBrowse := { ;
      { " msg",           { || iif( Encontra( jpitped->ipItem, 'jpitem', 'item' ), '', '' ) + Pad( PedItemStatus(), 4 ) } }, ;
      { "Item/Descricao", { || Pad( jpitped->ipItem + ' ' + jpitem->ieDescri, 40 ) + iif( vSay( MaxRow(), 0, Left( jpitem->ieDescri, MaxCol() ) ), "", "" ) } }, ;
      { "Qtde.",          { || Transform( jpitped->ipqtde, "@E 999,999.999" ) } }, ;
      { "Unit Ped",       { || Transform( jpitped->ipPrePed, "@E 999,999.99999" ) } }, ;
      { "Total Prod",     { || Transform( jpitped->ipValPro, "@E 999,999,999.99" ) } }, ;
      { "CFOP",           { || jpitped->ipCfOp } }, ;
      { "CST",            { || jpitped->ipIcmCst } }, ;
      { "GAR",            { || Transform( jpitped->ipGarantia, "999" ) } }, ;
      { "IPI",            { || Transform( jpitped->ipIpiVal, "@R 999,999.99" ) } }, ;
      { "ICMS",           { || Transform( jpitped->ipIcmVal, "@E 999,999.99" ) } }, ;
      { "ST",             { || Transform( jpitped->ipSubVal, "@E 999,999.99" ) } } }
   IF "NOME EMPRESA" $ AppEmpresaNome() .OR. AppUserLevel() < 2
      ASize( oTBrowse, Len( oTBrowse ) + 1 )
      AIns( oTBrowse, 9 )
      oTBrowse[ 9 ] := { "MG", {|| Transform( jpitped->ipPrePed / CustoItem() * 100 - 100, "9999" ) } }
   ENDIF
   FOR nCont = 1 TO Len( oTBrowse )
      AAdd( oTBrowse[ nCont ], {|| iif( ! Empty( PedItemStatus() ), { 3, 2 }, { 1, 2 } ) } )
   NEXT
...
   SELECT jpitped
   SET SCOPE TO mpdPedido
   GOTO TOP
   IF Eof()
      KEYBOARD Chr( K_INS )
   ENDIF
   Mensagem( "<SETAS> seleciona, <INS> insere, <DEL> exclui, <ESC> sai" )
   dbView( mLinTBrowse, 0, MaxRow() - 8, MaxCol(), oTBrowse, {| b, k | DigPed( b, k ) },, mpdPedido, {|| jpitped->ipPedido } )
   SELECT jpitped
   SET SCOPE TO
   SELECT jppedi


- Entra em modo de inclusão, caso ainda não tenha sido incluso nenhum produto
- Conforme o status do pedido, uma cor diferente
- Coluna que mostra qual a irregularidade do pedido
- Opção especial, conforme navega pelos produtos, uma mensagem de informação extra
- Pra determinado cliente ou conforme senha, uma coluna a mais
- O tbrowse se ajusta conforme o espaço disponível na tela

Parece complicado, olhando tudo de uma vez, mas é só identificar cada parte.
Depois das colunas adicionadas, todas seguirão a mesma configuração da cor, por isso mais fácil adicionar a cor no final, tudo de uma vez.

oTBrowse := { ;
   { "titulo", { || conteudo }, { 1, 2 } /* cor */ } }


Se olhar tudo, só centralizei na dbView() o que se repete em todos os programas.
Foi mais uma redução de repetição de fonte, do que algo sofisticado.

O que passei a usar há relativamente pouco tempo, que facilitou muito, foi usar codeblock como função de usuário.

Classe pro tbrowse? Será que compensa?

Vamos ver:

oTbrowse := { ;
   { "titulo1", { || campo1 }, ;
   { "titulo2", { || campo2 } }
dbView( 0, 0, MaxRow(), MaxCol(), aTBrowse )
...

odbView := dbViewClass():New()
odbView:linha := 0
odbView:Coluna := 0
odbView:linhafinal := MaxRow()
odbView:ColunaFinal := MaxCol()
odView:AddColumn( "titulo", { || campo2 } )
odbView:AddColun( "titulo2", { || campo2 } )
odbView:Show()


Parece que o fonte fica mais confuso, sujeito a erros.
Por enquanto não vi nenhum motivo pra alterar isso.

A outra rotina de tbrowse segue o estilo dessa, mas só pra consulta.
Mas na outra, é ir filtrando iniciais conforme digita, filtro pra combinação de palavras, pesquisa pra frente e pra trás, troca da ordem (indexação), já desenha a janela, etc.
Basicamente é trocar uma pela outra, partindo do mesmo array oTBrowse.
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 20:14

Quer uma outra, com opção de desenhar a tela, poderia usar classe e herança....

Vamos simplificar:

FUNCTION DbViewComDesenho( nTop, nLeft, nBottom, nRight, oTBrowse, bUserFunction, nFixToCol, mSkipVar, bSkipCpo, aHotKeys )
   @ nTop, nLeft CLEAR TO nBottom, nRight
   @ nTop, nLeft TO nBottom, nRight
   RETURN dbView( nTop + 1, nLeft + 1, nBottom -1, nRight - 1, oTBrowse, bUserFunction, nFixToCol, mSkipVar, bSkipCpo, aHotKeys )


Pronto.
Talvez acrescentar valores default pras coordenadas, pra não dar erro se quiser usar só DbViewComDesenho() sem parâmetro nenhum.

Nota:
São rotinas direto de meus fontes, não costumo olhar muito pra elas.... rs
nFixToCol = pra fixar até determinada coluna, pode navegar pra direita e esquerda, que essas colunas não sairiam do lugar
mSkipVar e bSkipCpo = pra fixar um intervalo no arquivo
aHotkeys = Se criar áreas pra clicar com o mouse, fora do tbrowse, ou até numa barra de rolagem estilo janela Windows!!!

Nota2:
Uso campos chaves caractere, então não me preocupo em tbrowse indexado por numérico.
Caso seja usada em arquivo com índice numérico, já devem ter percebido que pode gerar erro.
Lembro de ter visto em algum lugar, que se o campo não for pra cálculo, não deveria ser numérico, mas isso foi há muito tempo, antes do MySQL....
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 01 Jul 2016 21:43

Um pequeno pedaço da outra rotina de tbrowse, que está desativado:

   // @ nTop + 3, nRight, nBottom - 1, nRight BOX Replicate( Chr(176), 9 )
   // @ nBottom, nLeft + 1, nBottom, nRight - 1 BOX Replicate( Chr(176), 9 )
   aHotKeys := {}
   //    { nTop + 1, nRight, nTop + 1, nRight, "", K_CTRL_PGUP }, ;
   //    { nTop + 2, nRight, nTop + 2, nRight, "", K_CTRL_PGUP }, ;
   //    { nTop + 3, nRight, nTop + 3, nRight, Chr(30), K_UP }, ;
   //    { nTop + 4, nRight, nTop + 4, nRight, Chr(30), K_UP }, ;
   //    { nBottom - 2, nRight, nBottom - 2, nRight, Chr(31), K_DOWN }, ;
   //    { nBottom - 1, nRight, nBottom - 1, nRight, Chr(31), K_DOWN }, ;
   //    { nBottom, nRight, nBottom, nRight, "", K_CTRL_PGDN }, ;
   //    { nBottom, nLeft + 1, nBottom, nLeft + 2, Chr(17) + Chr(17), K_LEFT }, ;
   //    { nBottom, nRight - 2, nBottom, nRight - 1, Chr(16) + Chr(16), K_RIGHT }, ;
   //    ;// Nesta ordem, se tiver area livre, PgUp e PgDn funciona
   //    { nTop + 5, nRight, nTop + 5, nRight, "", K_PGUP }, ;
   //    { nTop + 6, nRight, nTop + 6, nRight, "", K_PGUP }, ;
   //    { nBottom - 4,nRight, nBottom - 4, nRight, "", K_PGDN }, ;
   //    { nBottom - 3,nRight, nBottom - 3, nRight, "", K_PGDN }, ;
   //    { nBottom, nLeft + 3, nBottom, nLeft + 12, "[Localiza]", K_ALT_L}, ;
   //    { nBottom, nLeft + 13, nBottom, nLeft + 20, "[Filtro]", K_ALT_F}, ;
   //    { nBottom, nLeft + 21, nBottom, nLeft + 27, "[Ordem]", K_F5 } }
   // FOR EACH oElement IN aHotKeys
   //    @ oElement[ 1 ], oElement[ 2 ] SAY oElement[ 5 ]
   // NEXT


Isso configura aquele Hotkeys.
Eu usava o que mencionei, de usar a janela como se fosse uma janela Windows, com imitação de barras de rolagem.
Era só clicar nas barras de rolagem pra um efeito parecido com janelas Windows.
Tinha esquecido dessa parte, não apaguei do fonte, apenas deixei assim.
Estilo Windows, sem Windows, no tempo do Clipper. Ambiente GUI em modo console....rs

Nada de extraordinário.
Só verificar linha/coluna aonde foi clicado o mouse, procurar se linha/coluna está na lista, e colocar o código Inkey da lista no inkey do tbrowse.
E o tbrowse já faz o resto, porque já trata de teclas.
Com isso lembrei porque deixei HotKeys necessitando da indicação do retângulo completo, e não apenas linha/coluna.
Pra casos desse tipo.

Tá aí uma coisa curiosa que eu não tinha percebido antes:
aHotkeys - uma área, onde se faz o clique do mouse, e converte pra tecla.
Igual meu uso do pushbutton da GTWVG. Só troquei o texto por um desenho.
No final é como se eu já usasse o pushbutton antes, só faltava o recurso de fazer desenho.
Comentei que passei a usar GTWVG porque ela se encaixou no meu estilo, e não é que foi mesmo... 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina de tbrowse

Mensagempor syslink » 26 Fev 2018 22:51

boa noite.
o meu tbrowse funcionava até usar a função wvgcrt da gtwvg.
continua funcionando e navegando pelos campos e posições perfeitamente. só que ao dar ENTER o valor não repassa à variável GET que chamou o browse.
syslink
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 132
Data de registro: 20 Fev 2018 13:13
Cidade/Estado: joinvile/sc
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Rotina de tbrowse

Mensagempor JoséQuintas » 27 Fev 2018 07:44

o meu tbrowse funcionava até usar a função wvgcrt da gtwvg.


Se funcionava antes do wvgCrt, então o problema só pode ser no uso do wvgCrt.

só que ao dar ENTER o valor não repassa à variável GET que chamou o browse.


Ao teclar ENTER o tbrowse se encerra... então o problema não é no tbrowse, e sim no que vém depois (ou antes).

É revisar como usou wvgCrt e como está fazendo pra transferir valores.
Lembrando que cada janela tem seu conjunto de tela/teclado/mouse, não adianta KEYBOARD numa janela se quer o resultado em outra.
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: 18007
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 19 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