tbrowse se estranhando com mouse

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

tbrowse se estranhando com mouse

Mensagem por rbonotto »

Boas pessoal, coloquei no inicio do meu programa o comando de ativação do mouse:

SET( _SET_EVENTMASK, INKEY_ALL )

Funciona ok em tudo menos quando uso um tbrowse. Ao menor deslocamento do mouse ele vai para o ultimo registro, e quando tem filtro de dados no tbrowse ele mistura tudo....

Segue o código de um dos tbrowse que uso e que possui um filtro de dados:

Código: Selecionar todos

***************************************
FUNCTION loc_on()
***************************************
* cChave é o grupo do item
cor(1)
WHILE .T.
   mEugRupa := crd->codigo
   * criar tbrowse 
   oPropri := tbrowsedb (05,28,17,70)


   * filtro tbrowse com a func skipwhil() 
   oProPri:SKIPBLOCK     := {|x| SKIPWHIL(x, {||item->cod_grup == cChave})} 
   oPropri:GOTOPBLOCK    := {| | SKIPWHIL((LASTREC()* -1),{||item->cod_grup == cChave})}
   oproPri:GOBOTTOMBLOCK := {| | SKIPWHIL((LASTREC()* 1), {||item->cod_grup == cChave})}

   oCol1  := tbcolumnnew("  PRODUTOS CADASTRADOS",     {||" ³ " + item->produto + " ³ "}) 

   oProPri:addcolumn(oCol1) 

   WHILE .T.
      WHILE(!oPropri:stabilize())
      END
      IF iNsert_dAta
         sset(2)
         IF     _MODE == 'pItem1'
             IF EMPTY(pItem1)
                forca_lc()
             ELSE
                SEEK gPitem + RTRIM(pItem1)
             END

         ELSEIF _MODE == 'pItem2'
             IF EMPTY(pItem2)
                forca_lc()
             ELSE
                SEEK gPitem + RTRIM(pItem2)
             END

         ELSEIF _MODE == 'pItem3'
            IF EMPTY(pItem3)
                forca_lc()
             ELSE
                SEEK gPitem + RTRIM(pItem3)
             END

         ELSEIF _MODE == 'pItem4'
             IF EMPTY(pItem4)
                forca_lc()
             ELSE
                SEEK gPitem + RTRIM(pItem4)
             END

         END
         IF EOF()
            forca_lc()
            oPropri:refreshall()
            KEYBOARD(CHR(47)); KEYBOARD(CHR(47))
         END
         oPropri:refreshall()
         KEYBOARD(CHR(47)); KEYBOARD(CHR(47))
      END

      nTecla := INKEY(0)

      DO CASE

         CASE ( nTecla == K_ESC ) 
            EXIT

         CASE ( nTecla == K_ENTER ) 
            EXIT 

         CASE ( nTecla == K_DOWN ) 
            oPropri:down () 

         CASE ( nTecla == K_UP ) 
            oPropri:up () 

         CASE ( nTecla == K_LEFT ) 
            oPropri:left () 

         CASE ( nTecla == K_RIGHT ) 
            oPropri:right () 

         CASE ( nTecla == K_PGUP ) 
            oPropri:pageup () 

         CASE ( nTecla == K_PGDN ) 
            oPropri:pagedown () 

         CASE ( nTecla == K_CTRL_PGUP ) 
            oPropri:gotop () 

         CASE ( nTecla == K_CTRL_PGDN ) 
            oPropri:gobottom ()

         OTHERWISE
            *** ENC100B2.PRG
            IF nAprima
               nAprima := .F.
            ELSE
               ver_teclado()
            END

      ENDCASE 

      oPropri:refreshall()
   END
   EXIT
END
RETURN

*************************************** 
FUNCTION SKIPWHIL (x,key_val)
***************************************
LOCAL i := 0 
IF LASTKEY() == 0 
   RETURN i 
END

IF (x > 0 .AND. RECNO() <> LASTREC()+1) 
   WHILE (i < x) 
      SKIP 1 
      IF EOF() .OR. !(EVAL(key_val)) 
         SKIP -1 
         EXIT 
      END
      i++ 
   END
ELSEIF (x < 0) 
   WHILE (i > x) 
      SKIP -1 
      IF BOF() 
         EXIT 
      END
      IF !(EVAL(key_val)) 
         SKIP 1 
         EXIT 
      END
      i--
   END
END
RETURN i
Alguém ja teve experiencia com este tipo de problema ?

Qual é a sintaxe do comando para desativar o mouse ? em ultimo caso desativo o mouse na entrada do tbrowsw e ativo na saida.

Abraços
mixsistemas@gmail.com
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

tbrowse se estranhando com mouse

Mensagem por alxsts »

Olá!

Não sei se é isso pois não estamos vendo o código todo: dentro do laço (While .T.), você faz a estabilização do browser mas depois, dependendo de algumas condições, o ponteiro do arquivo é alterado (DbSeek()).

Experimente mudar a estabilização para depois do Endif de IF iNsert_dAta.

Aliás, você pode trocar

Código: Selecionar todos

      WHILE(!oPropri:stabilize())
      END
por

Código: Selecionar todos

oPropri:forceStable()
[]´s
Alexandre Santos (AlxSts)
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

tbrowse se estranhando com mouse

Mensagem por rbonotto »

Ola alxsts,

Fiz a alteração do forceStable() e retirei o IF do código, mas não adiantou.
É entrar no browse, mexer o mouse e da zebra....
mixsistemas@gmail.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

tbrowse se estranhando com mouse

Mensagem por JoséQuintas »

Não conhecia esse SET( _SET_EVENTMASK, INKEY_ALL )
Por esse motivo criei minha função MyInkey()
Não deveria fazer diferença, mas se quiser fazer um teste...

No sistema inteiro, aonde seria Inkey(AlgumaCoisa) troquei pra MyInkey(AlgumaCoisa)

A diferença é que no MyInkey() eu uso Inkey(nTempo,INKEY_ALL)
E no tbrowse, e outros locais, tenho as ações para o mouse.

A maior vantagem foi agora: habilitei o scroll do mouse pra tudo no sistema só mexendo na MyInkey().
Muito legal mexer no tbrowse, memoedit, menus só usando scroll.

No seu caso, um teste é mexer só no Inkey(0) e alterar pra Inkey(0,INKEY_ALL).
É o equivalente a habilitar o mouse só nesse Inkey()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

tbrowse se estranhando com mouse

Mensagem por rbonotto »

Ola JoséQuintas, obrigado pela resposta...mas substitui o INKEY(0) PELO Inkey(0,INKEY_ALL) e o sintoma permanece, ao abrir o browse com o menor movimento do mouse ele vai para o ultimo registro inclusive perdendo o parametro de filtro.... :P
mixsistemas@gmail.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

tbrowse se estranhando com mouse

Mensagem por JoséQuintas »

Uso assim há anos, mas não sei porque e não consigo entender, comecei a ter problemas também, porque detectou a movimentação do mouse.
Agora substituí o Inkey(0,INKEY_ALL) por inkey(0,INKEY_ALL-INKEY_MOVE)

Acho que foi porque dei uma geral na máquina, e antes misturava ch do Clipper com Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

tbrowse se estranhando com mouse

Mensagem por rbonotto »

Ola JoséQuintas,

Coloquei o comando inkey(0,INKEY_ALL-INKEY_MOVE) e o problema com o movimento do mouse sumiu, mas se usar o scroll do mouse o
problema volta...

Como não é possivel usar a seleção pelo mouse dentro do browser, não seria melhor desativar o mouse e após a saida ativa-lo novamente ?

Existe um comando para desativar o mouse ?

Abraços,
mixsistemas@gmail.com
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

tbrowse se estranhando com mouse

Mensagem por alxsts »

Olá!

Experimente MHide() ou MSetCursor(.F.) para desativar o mouse e MShow() para ativar.

Mas deve haver alguma outra solução, que não essa de desativar o mouse. Será frustrante se não houver...
[]´s
Alexandre Santos (AlxSts)
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

tbrowse se estranhando com mouse

Mensagem por Imatech »

Uma simples lida no Inkey.ch seria suficiente para se ter a solução...

Código: Selecionar todos


SET ( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE )

ou


SET ( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

tbrowse se estranhando com mouse

Mensagem por rbonotto »

Pessosl, obrigado pela atenção, mas nada da certo!!!! :'(

Tentei todos os comandos citados pelos colegas, mas nenhum funcionou....é mexer o mouse e o tbrowse se perde bonitinho....

Existe alguma outra forma de fazer um browse em um banco de dados colocando um filtro simples alem do que estou usando ?
Eu poderia fazer com um dbedit(), mas ai teria que colocar um filtro ( grupo == crd->codigo) e tenho receio que em rede isto fique lento.

abraços !
mixsistemas@gmail.com
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

tbrowse se estranhando com mouse

Mensagem por rbonotto »

Desculpem a insistência, mas qual a forma que os programadores usam para um brwoser ?

Como estou migrando clipper para Harbour só conhecia dbedit e tbrowser, quais as alternativas no harbour ?

Desde ja, peço desculpas pelo flood e agradeço quem puder me ajudar nesta migração :D
mixsistemas@gmail.com
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

tbrowse se estranhando com mouse

Mensagem por Imatech »

Já pensou em tratar os eventos do mouse ?

Exemplo:

Código: Selecionar todos


#include "Common.ch"
#include "Inkey.ch"
#include "Setcurs.ch"
#include "Error.ch"

#define APP_MODE_ON( b )      ( b:cargo := TRUE  )
#define APP_MODE_OFF( b )     ( b:cargo := FALSE )
#define APP_MODE_ACTIVE( b )  ( b:cargo )

// Separator strings for the browse display
#define MY_HEADSEP      CHR(196)+CHR(194)+CHR(196)
#define MY_COLSEP       " "+CHR(179)+" "

/***
*
*  MyBrowse()
*
*  Create a Tbrowse object and browse with it.
*
*/
PROCEDURE MyBrowse(nTop, nLeft, nBottom, nRight )
  LOCAL oBrowse                          // The TBrowse object
  LOCAL nCursSave                        // State preservers
  LOCAL nKey                             // Keystroke
  LOCAL lMore := TRUE                    // Loop control
  LOCAL xReadExit := READEXIT( .T. )  // Enable Up/Down as READ EXIT keys

   // Make a "stock" Tbrowse object for the current workarea
   oBrowse := StockBrowseNew( nTop, nLeft, nBottom, nRight )

   // Change the heading and column separators
   oBrowse:headSep := MY_HEADSEP
   oBrowse:colSep  := MY_COLSEP

   // Play with the colors and picture
   FormatColumn( oBrowse )

   // Save cursor shape, turn the cursor off while browsing
   nCursSave := SETCURSOR( SC_NONE )

   // Main loop
   WHILE lMore

      // Don't let the cursor move into frozen columns
      IF ( oBrowse:colPos <= oBrowse:freeze )
         oBrowse:colPos := ( oBrowse:freeze + 1 )

      ENDIF

      // Stabilize the display until it's stable or a key is pressed
      oBrowse:forceStable()

      IF ( oBrowse:hitTop .or. oBrowse:hitBottom )
        tone( 125, 0 )

      ENDIF

      /*
      *  Make sure that the current record is showing
      *  up-to-date data in CASE we are on a network.
      */
      oBrowse:refreshCurrent():forceStable()

      // Everything's done -- just wait for a key
      nKey := inkey( 0 )

      IF ( nKey == K_ESC )
         // Esc means leave
         lMore := .F.

      ELSE
         // Apply the key to the oBrowse
         applyKey( oBrowse, nKey )

      ENDIF

   ENDDO

   SETCURSOR( nCursSave )
   READEXIT( xReadExit )

RETURN


/***
*
*   ApplyKey()
*
*   Apply one keystroke to the oBrowse.
*
*   NOTE: uses the cargo #defines shown at the top of Tbdemo.prg
*
*/
STATIC PROCEDURE ApplyKey( oBrowse, nKey )
  LOCAL nCursor
  LOCAL oGet, MyVar
  LOCAL GetList := {}

   DO CASE
   CASE nKey == K_DOWN
     IF EOF()
       oBrowse:goBottom()
       Tone( 125, 0 )
     ELSE
       oBrowse:down()
     ENDIF

   CASE nKey == K_PGDN
     IF EOF()
       Tone( 125, 0 )
       oBrowse:goBottom()
     ELSE
       oBrowse:pageDown()
     ENDIF

   CASE nKey == K_CTRL_PGDN
     IF EOF()
       Tone( 125, 0 )
       oBrowse:goBottom()
     ELSE
       oBrowse:goBottom()
     ENDIF

   CASE nKey == K_UP
     IF BOF()
       oBrowse:goTop()
       Tone( 125, 0 )
     ELSE
       oBrowse:up()
     ENDIF

   CASE nKey == K_PGUP
     IF BOF()
       oBrowse:goTop()
       Tone( 125, 0 )
     ELSE
       oBrowse:pageUp()
     ENDIF

   CASE nKey == K_CTRL_PGUP
     IF BOF()
       oBrowse:goTop()
       Tone( 125, 0 )
     ELSE
       oBrowse:goTop()
     ENDIF

   CASE nKey == K_RIGHT
        oBrowse:right()

   CASE nKey == K_LEFT
        oBrowse:left()

   CASE nKey == K_HOME
        oBrowse:home()

   CASE nKey == K_END
        oBrowse:end()

   CASE nKey == K_CTRL_LEFT
        oBrowse:panLeft()

   CASE nKey == K_CTRL_RIGHT
        oBrowse:panRight()

   CASE nKey == K_CTRL_HOME
        oBrowse:panHome()

   CASE nKey == K_CTRL_END
        oBrowse:panEnd()

   CASE nKey == K_RETURN
        oBrowse:right()

   CASE ( nKey == K_SPACE )
       Tone( 125, 0 )

   CASE nKey == K_MOUSEMOVE
       Tone( 125, 0 )

   CASE nKey >= 1002 .AND. nKey <= 1007 // MOUSE EVENTS
      nCRow    := oBrowse:RowPos
      nMRow    := oBrowse:mRowPos

      IF nCRow < nMRow
         FOR nXv := nCRow to nMRow -1
             oBrowse:down()

         NEXT
      ELSEIF nCRow > nMRow
         FOR nXv := nMRow to nCRow -1
             oBrowse:up()

         NEXT
      ENDIF

      IF BOF()
         oBrowse:gotop()
      ENDIF

      IF EOF()
         oBrowse:goBottom()
      ENDIF

   case nKey == K_DEL
     tone( 125, 0 )

   OTHERWISE
      tone( 125, 0 )

   ENDCASE

RETURN


/***
*
*   StockBrowseNew()
*
*   Create a "stock" Tbrowse object for the current workarea.
*
*/
STATIC FUNCTION StockBrowseNew( nTop, nLeft, nBottom, nRight )
  LOCAL oBrowse
  LOCAL n
  LOCAL oColumn
  LOCAL nCounter

   // Start with a new browse object from TBrowseDB()
   oBrowse := TBrowseDB( nTop, nLeft, nBottom, nRight )

   nCounter := FCOUNT()

   IF nCounter >  32
      nCounter := 32
   ENDIF

   // Add a column for each field in the current workarea
   for n := 1 to nCounter

      // Make a new column
      oColumn := TBColumnNew( field( n ), FieldWBlock( field( n ), select() ) )

      // Add the column to the browse
      oBrowse:addColumn( oColumn )

   next

RETURN oBrowse


/***
*
*   FormatColumn()
*
*   Set up some colors and pictures for the column.
*
*/
STATIC PROCEDURE FormatColumn( oBrowse )
  LOCAL n, r, oColumn, xValue, lControl
  r := MAXCOL()

   // Set up a list of colors for the browse to use
   oBrowse:colorSpec := "N/W,N/BG,B/W,B/BG,B/W,B/BG,R/W,B/R"

   lControl := .T.

   // Loop through the columns, choose some colors for each
   for n := 1 to oBrowse:colCount
      // Get (a reference to) the column
      oColumn := oBrowse:getColumn( n )

      // Get a sample of the underlying data by evaluating the codeblock
      xValue := EVAL( oColumn:block )

      DO CASE
      CASE ISNUMBER( xValue )
          // For numbers, use a color block to highlight negative values
          IF LEN( STR( xValue ) ) <= 10
            oColumn:picture    := "@E 9,999,999.99"
            oColumn:colorBlock := { |x| iif( x < 0, { 7, 8 }, { 5, 6 } ) }
          ELSE
            oColumn:picture    := "@E 999,999,999,999,999.99"
            oColumn:colorBlock := { |x| iif( x < 0, { 7, 8 }, { 5, 6 } ) }
          ENDIF

          // Set default colors also (controls the heading color)
          oColumn:defColor := {7, 8}

      CASE ISCHARACTER( xValue )
         // For non-numeric, just use colors 3 and 4
         oColumn:picture  := ""
         oColumn:defColor := { 3, 4 }

        IF r > 80
          IF len( xValue ) > 96
            oColumn:picture  := "@S96"
          ENDIF
        ELSE
          IF len( xValue ) > 60
            oColumn:picture  := "@S60"
          ENDIF
        ENDIF

      CASE ISDATE( xValue )
         // For non-numeric, just use colors 3 and 4 
         oColumn:picture  := repl( "@E", len( DTOC( xValue ) ) + 2 )
         oColumn:defColor := { 3, 4 }

      OTHERWISE
         // For non-numeric, just use colors 3 and 4
         oColumn:defColor := { 3, 4 }

      ENDCASE

   next

RETURN

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Responder