Página 2 de 2

Duplo clique não funciona

Enviado: 01 Mar 2021 10:57
por carlaoonline
Hoje eu uso o hb_gtInfo( HB_GTI_INKEYFILTER.... mas se quiser alguma coisa mais simples pode usar essa função que fiz a alguns anos e que identifica o duplo clique do botão esquerdo.

Ele tem um delay de .3 segundos mas passa despercebido dependendo onde usa.

Código: Selecionar todos

/ Compilar    HBMK2 DP_CLIC

#include "inkey.ch"

Function Main()

CLS
SET( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE ) // + HB_INKEY_GTEVENT )  // Set Eventmask to 1002

DO WHILE .T.

   @ 10,05 Say "De clic unico ou duplo com o botao esquerdo do mouse.!"
   INKEY(0)

   IF LASTKEY()=1002  // So efetua a verificacao qdo clicar no botao esquerdo do mouse
      IF !DUPLO_CLIC() 
	     // colocar aqui as ações para unico clique do botao esquerdo..
		 // No caso do DbEdit ou Achoice a opcao seria voltar para a edicao com return pois com um clic apenas selecionamos a linha/coluna.
         ALERT("Clicou uma vez com o botao esquerdo")	   
	   else  // Se clicou duas vezes, entao ele volta com lastkey()=1006
		 // colocar aqui as ações para duplo clique do botao esquerdo..		 
         ALERT("Clicou duas vezes com o botao esquerdo")		 
      ENDIF
   ENDIF		

   if lastkey()=27 
      return
   endif   

ENDDO

**
**  Funcao que testa se houve duplo click no botao esquerdo do mouse
**
FUNCTION DUPLO_CLIC()
local AAA,BBB
IF LASTKEY()=1006 // Se ja for detectado, entao volta .T.
   RETURN .T.
ENDIF
IF !(LASTKEY()=1002)   // Se o lastkey() nao for 1002 (botao esquerdo) , entao volta .F.
   RETURN .F.
ENDIF

*alert("clicou 2 vezes"+str(lastkey()))

BBB=SECOND()
AAA=lastkey()
DO WHILE BBB+.3 > SECOND()  // Fica aguardando em .3 segundos o segundo clicque
   IF LASTKEY()=1006
      RETURN .T.
   ENDIF
   AAA=INKEY()
ENDDO
      
RETURN .F.  // Nao foi clicado pela segunda vez no botao esquerdo durante o tempo de espera...

Duplo clique não funciona

Enviado: 17 Ago 2024 21:09
por clodoaldomonteiro
Hoje estava refazendo um browse e cheguei nessa pesquisa para saber o nome das teclas "INKEY" do mouse, e contribuo aqui com minha rotina para movimentar a seleção da célula com o clique do Mouse.

Código: Selecionar todos

Function Main()
...
...
...

   While lContinue                             // Browse's loop

      IF NextKey() = 0
         oBrowse:RefreshCurrent()
         While .not. oBrowse:stabilize()
         EndDo     // Stabilizing loop

         oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 5, 5 } ) // linha está com o cursor
         oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor

         oCol := oBrowse:getColumn(1)
         mVar := EVal(oCol:block)

         oBrowse:refreshall()                                 // refaz so' a linha do browse

         IF ! Empty(  oBrowse:Freeze )                                                                       // Marcar parte congelada
            oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:Freeze }, { 5, 5 } )
         EndIf

         wvw_DrawFocusRect(, oBrowse:RowPos + nLi + 2, oBrowse:nLeft, oBrowse:RowPos + nLi + 2, oBrowse:nRight ) // linha está com o cursor

      EndIf

      nKeyPressed := KeyPressed( @oBrowse )   //Aqui a funçào para checar qual tecla do mouse foi pressionada e ajustar o valor do Inkey() ou focar na célula nova.

      lContinue  := TBrApplyKey( oBrowse, nKeyPressed )

      IF nKeyPressed = 0                                     // nao teclou nada, sai pelo
         oBrowse:refreshall()                                // tempo de "refresh" entao
         LOOP                                                // na tela e volta
      EndIf

   EndDo

...
...
...

/*
 * $Id: tbrowse.prg,v 1.4 2008/06/27 06:21:54 ronpinkas Exp $
 */

/*
 * Harbour Project source code:
 *    TBrowse Class
 *
 * Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
 * This implementation contains code and notes by:
 * Copyright 2008 Viktor Szakats <viktor.szakats / at / syenar.hu>
 * www - http://www.harbour-project.org
 *
Function KeyPressed( oBrowse )
   Local nKeyPressed, n

   nKeyPressed := Inkey(0)

   If nKeyPressed == K_MWFORWARD       //1014 Rolar pra cima
      keyboard 5

   Elseif nKeyPressed == K_MWBACKWARD  //1015 Rolar pra baixo
      keyboard 24

   Elseif nKeyPressed == K_LDBLCLK     //1006 duplo clique com esquerdo
      keyboard 13

   Elseif nKeyPressed == K_LBUTTONDOWN     //1002 um clique com esquerdo. move o cursor para a célula clicada
      IF ( n := oBrowse:mRowPos - oBrowse:rowPos ) < 0
         While++ n <= 0
            oBrowse:up()
         EndDo
      ElseIF n > 0
         While --n >= 0
            oBrowse:down()
         EndDo
      EndIf

      IF ( n := oBrowse:mColPos - oBrowse:colPos ) < 0
         While++ n <= 0
            oBrowse:Left()
         EndDo
      ElseIF n > 0
         While --n >= 0
            oBrowse:right()
         EndDo
      EndIf

   EndIf

   Return  nKeyPressed

Abraços.