Página 2 de 2

Uso de funções da Mouse Library do Clipper

Enviado: 18 Set 2013 18:03
por cjp
Aqui não funcionou, meu caro.

Primeiro, deu erro Variável não existe na linha

Código: Selecionar todos

 SET EVENTMASK TO HB_INKEY_ALL
Daí eu atribui um valor aleatório a hb_inkey_all. Não deu mais erro, mas o mouse não funciona.

Não sei se fiz algo errado.

Uso de funções da Mouse Library do Clipper

Enviado: 18 Set 2013 19:02
por Toledo
Inácio, veja um exemplo de uso de mouse em Menu e GET:

Código: Selecionar todos

FUNC MAIN()
CLS
SETMODE(25,80)
set eventmask to 255
msetcursor(.t.)

SAVE SCREEN TO tela002
nOp:=1
DO WHILE nOp <> 0
   RESTORE SCREEN FROM tela002
   SET COLOR TO n/bg,w+/r
   @ 1,0,1,79 BOX "         "
   @ 1,10 PROMPT " CADASTRO  "
   @ 1,35 PROMPT " FINANCEIRO "
   @ 1,61 PROMPT " ADMINISTRATIVO "
   MENU TO nOp
   IF LASTKEY() = 27
      EXIT
   ENDIF
   DO CASE
      CASE nOp = 1
          cad()
      CASE nOp = 2
          Finan()
      CASE nOp = 3
          adm()
   ENDCASE
ENDDO
RETU NIL

Proc cad()
cCampo1=spac(20)
cCampo2="Clique com o mouse aqui...  "
@ 10,10 SAY "Campo 1...:" GET cCampo1
@ 12,10 SAY "Campo 2...:" GET cCampo2
READ
Retu

Proc Finan()
Alert("Financeiro")
Retu

Proc adm()
Alert("Administrativo")
Retu
Para compilar basta digitar: hbmk2 nomedoarquivo.prg

Abraços,

Uso de funções da Mouse Library do Clipper

Enviado: 18 Set 2013 19:03
por Jairo Maia
Inácio, é que esqueci de fazer essa alteração. Você está com certeza usando o Harbour 3.0, e então precisa alterar a variável HB_INKEY_ALL para INKEY_ALL que vai funcionar.

HB_INKEY_ALL é do Harbour 3.2. Tinha em mente alterar antes de postar e acabei esquecendo, INKEY_ALL funciona em ambas versões.

Editado:
A função do Toledo também é muito legal. Apresentou uma tela bonita, e funciona legal. Porém, também é objeto deste assunto a definição da área de evento do mouse. Em seu exemplo Toledo, a área de evento não está delimitada. Teoricamente a função MSetBounds() tem essa função, mas não consigo fazer ela funcionar no Harbour, ou encontrar uma equivalente, sem entrar na classe HbPushButton().

Uso de funções da Mouse Library do Clipper

Enviado: 20 Set 2013 23:21
por cjp
Ambas as funções funcionaram perfeitamente agora, meus caros Jairo e Toledo.

Não entendi o que vc quis dizer com delimitar a área de evento do mouse, Jairo, pois aparentemente, ambas as funções funcionaram da mesma forma.

De qualquer forma, desde já, obrigado pela ajuda.

A propósito, achei muito interessante, na tua função, as funções HB_GtInfo para maximizar a tela, mudar a fonte e colocar título na janela. Tentei usar no meu programa, mas travou tudo. Será que é porque eu estou usando a versão 3.0, e não a 3.2?

Uso de funções da Mouse Library do Clipper

Enviado: 21 Set 2013 09:13
por Jairo Maia
Olá Inácio,
cjp escreveu:Não entendi o que vc quis dizer com delimitar a área de evento do mouse, Jairo, pois aparentemente, ambas as funções funcionaram da mesma forma.
Delimitar a área de evento significa você informar ao mouse que deve ser retornado um evento somente se for clicado o mouse num local que você definiu para isso.

Para você entender, tomando por base ambos exemplos, faça o seguinte teste:

Teste 1 - usando o teste do Toledo, clique apenas uma vez em qualquer opção de menu para selecioná-lo, depois, fora da área de menus dê duplo clique em qualquer lugar da tela, e veja que o menu será selecionado.

Teste 2 - Em qualquer dos exemplos, dê duplo em algum menu para abrir a mensagem do alert(). Com o alert na tela, clique livremente em qualquer outro lugar fora do botão OK da caixa do alert, e veja que nada acontece, pois a área de evento está definida pelo alert somente no botão OK. Clicando sobre o botão OK então sim o mouse retorna o evento.

Teste 3 - Usando meu exemplo, repita os testes acima. Veja que se você apenas selecionar o menu e clicar fora da área de menu não irá selecionar nenhum menu. Porém, note que isso ocorre porque no meu exemplo ao verificar que o mouse não foi clicado na linha 1 o exemplo faz um loop. Isso é apenas um ajuste técnico, pois o mouse retornou o evento e foi tratado. A rigor, ele deveria retornar evento somente se fosse clicado sobre algum menu.

Espero ter ajudado a entender essa questão.
Jairo Maia escreveu:Tentei usar no meu programa, mas travou tudo. Será que é porque eu estou usando a versão 3.0, e não a 3.2?
Não. Os drivers GTs funcionam corretamente também nas versões anteriores a 3.0. Esse não foi o problema.

Uso de funções da Mouse Library do Clipper

Enviado: 04 Out 2013 00:03
por cjp
Agora (depois de muito estudo) consegui entender perfeitamente o que vc disse, Jairo.

Mas estou com um problema no teu modelo, que o do Toledo não causa: salvo erro da minha parte, o teu modelo não permite a seleção dos menus com o uso exclusivo do teclado (seta e enter), não é isso?

Tem como combinar o uso do mouse com o teclado, permitindo ao usuário selecionar a opção por um ou por outro?

Outra dúvida: vc mencionou a questão da memória, e estou notando que de fato houve um aumento do uso da memória depois que passei a usar o mouse no meu programa. Vc disse que teria que fazer alguns ajustes. Que ajustes seriam esses?

Uso de funções da Mouse Library do Clipper

Enviado: 05 Out 2013 03:20
por Jairo Maia
Olá Inácio,

Quanto a também funcionar o teclado, no meu exemplo altere a linha que está assim:

Código: Selecionar todos

If MRow() != 1
Para esta forma:

Código: Selecionar todos

If MRow() != 1 .And. LastKey() > 999
Isto permitirá a leitura dos eventos do teclado também.
cjp escreveu:vc mencionou a questão da memória, e estou notando que de fato houve um aumento do uso da memória
Inácio, acho que você está confundindo uso de memória com uso de processador, ou não? Bom independente disso, usando EVENTMASK não é pra haver aumento de uso de memória significativo, nem tampouco aumento do uso de processador. Dê mais detalhe do que você notou.

Uso de funções da Mouse Library do Clipper

Enviado: 05 Out 2013 11:36
por cjp
Funcionou com lastkey()>999. Obrigado.

Agora, no teu exemplo, está tudo funcionando perfeitamente.

Entretanto, quando coloco no meu programa, ainda não está funcionando a delimitação da área. Não sei se estou fazendo algo errado. Minha função está assim:

Código: Selecionar todos

#include "inkey.ch"
#include "hbgtinfo.ch"
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850

function main()
         HB_SETCODEPAGE('PT850')
         HB_LANGSELECT('PT')
	 cls
         save scre to tl0                                                                                                                                                                                                                                                                                                                                              
         DO WHILE .T.
              keys277()
              rest scre from tl0
              OPC=0
             cls                                                                                                                                                                                                                                                                                                                                                      
             set eventmask to INKEY_ALL
             msetcursor(.t.)   
             DispBox( 0, 0, 2, MaxCol(), Nil, "GR+/N" )
             DispBox( 3, 0, MaxRow(), MaxCol(), Nil, "G+/N" )
             @ 1,1 PROMPT "Finalizar"                                                                                                                                                                                                                                                                                                                                   
             @ 1,15 PROMPT "Ag.financeira"                                                                                                                                                                                                                                                                                                                              
             @ 1,maxcol()/3+4 prompt "Contas bancárias"                                                                                                                                                                                                                                                                                                                           
             @ 1,maxcol()-maxcol()/3-1 PROMPT "Telefones"                                                                                                                                                                                                                                                                                                                                  
             @ 1,maxcol()-13 PROMPT "Compromissos"                                                                                                                                                                                                                                                                                                                               
             MENU TO OPC                                                                                                                                                                                                                                                                                                                                                
             save screen to tl0                                                                                                                                                                                                                                                                                                                                         
             DO CASE                                                                                                                                                                                                                                                                                                                                                    
                  case mrow()!=1 .and. lastkey()>999
	                  loop
		   
                  case OPC=1 .or. opc=0                                                                                                                                                                                                                                                                                                                                   
                          exit                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                              
                 CASE OPC=2
                         contagen()                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                                                              
                 CASE OPC=3
                          listbanc()
                                                                                                                                                                                                                                                                                                                                                              
                 CASE OPC=4                                                                                                                                                                                                                                                                                                                                              
                         agtel()                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                                                              
                 CASE OPC=5 
                          agcom()

           ENDCASE
     enddo                                                                                                                                                                                                                                                                                                                                                         
Outra coisa que tenho notado: depois que coloquei o uso do mouse no meu programa, ele está "teclando" algo (um ESC ou um ENTER) quando eu simplesmente alterno a janela do Windows para o meu programa, mesmo sem eu teclar ou clicar em nada. É normal isso?

Uso de funções da Mouse Library do Clipper

Enviado: 11 Out 2013 00:17
por cjp
Amigo, por favor, dá uma mão para eu fazer isto funcionar.

Uso de funções da Mouse Library do Clipper

Enviado: 24 Out 2013 15:17
por Jairo Maia
Olá Inácio,

Sem levar em consideração que o SETEVENTMASK torna-se universal no sistema a partir do ponto que é definida, e por isso não precisa estar dentro do laço WHILE, não há nada errado com seu código, e acabei de testar e funcionou corretamente.

Porém, obviamente comentei as chamadas as suas funções, e uma delas pode estar influenciando no não funcionamento, a saber: keys277(). Creio que possa ser isso, poste esta função também. Pela lógica, eu diria que ela contém alguma definição para a função KeySec().

Uso de funções da Mouse Library do Clipper

Enviado: 26 Out 2013 00:50
por cjp
Sim, a keys277() chama a keysec(). Ela está assim:

Código: Selecionar todos

function keys277
         do case
		    case "AG2PLANO"$procname(1) .or. "AG2PLANO"$procname(2) .or. "AG2PLANO"$procname(3) .or. "AG2PLANO"$procname(4)
		         if keysec(13,20,-1,.t.)=.f.
				    cls
					@ 5,5 say "Keys277 retornando falso: COMUNS 20976"
					tone(261.7,333)
					wait ""
				 endif
            case us="I"
                 if keysec(277,255,-1,.t.)=.f.
				    cls
					@ 5,5 say "Keys277 retornando falso: COMUNS 20983"
					tone(261.7,33)
					wait ""
				 endif
            otherwise
                 if keysec(277,185,-1,.t.)=.f.
                    mandmail1("","Keysec explosiv retornou falso: COMUNS 20982")
				 endif	
         endcase
return
Mudei o set eventmask para antes do do while e vou testar.

Uso de funções da Mouse Library do Clipper

Enviado: 28 Out 2013 00:52
por cjp
Meu caro, aparentemente, o set eventmask deu certo.

Mas restou ainda um problema: qualquer mínimo movimento do mouse, mesmo sem clicar em nada, equivale a teclar alguma coisa, está acionando alguma coisa, o que está me criando problema no programa.

Tem como alterar isso?