harbour - modo console / mouse / get

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

Moderador: Moderadores

Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

harbour - modo console / mouse / get

Mensagem por Abel »

Ola pessoal, agora que estou testando o harbour nigthy 3.1 e como meus sistemas nunca tiveram uso do mouse estou tentando fazer algumas coisas e nao estou conseguindo.

ja descobri que: lastkey()=1002 é quando clica o mouse botao esquerdo
ja descobri que: lastkey()=1001 é quando o mouse esta em movimento
ja descobri que: lastkey()=1006 é quando clica 2 vezes botao esquerdo
ja descobri que: mcol() devolve a posicao do mouse (linha)
ja descobri que: mrow() devolve a posicao do mouse (coluna)

alguem sabe dizer se existe alguma funcao que eu passe as coordenadas da tela (modo texto), e se for clicado
nestas coordenadas o sistema execute uma funcao especifica ou um comando ?

procurei e nao achei nada, tentei montar uma rotina, mas o GET nao responde ao mouse, permanecendo no READ ate pressionar ENTER, a idéia é simples abro um box sobre a tela do sistema e se o cliente nao quiser digitar nada
ele fecha no X da janela ao inves de usar o teclado e pressionar ESC.

segue um exemplo

Código: Selecionar todos

#include "inkey.ch"

FUNCTION MAIN()
   // Ativa as ações do mouse
   SET( _SET_EVENTMASK, 255 )

   // Ativa cores intensas no fundo
   SetBlink(.f.)

   // Torna o cursor do mouse visivel
   mSetCursor(.T.)
   //
   CLEAR
   rA_CONTEUDO=SPAC(15)
   rA_GET=TELA_GET(rA_CONTEUDO)  
   //
RETURN


   PROCEDURE TELA_GET(rA_CONTEUDO)
   save screen to rT_TELGET
   rA_CONTEUDO2=rA_CONTEUDO
    //
   DO WHILE .T.
      @ 1,1 SAY 'Ú--------------------[x]¿'
      @ 2,1 SAY '│                            │'
      @ 3,1 SAY '│Nome:                  │'
      @ 4,1 SAY 'À-----------------------Ù'
      //
      @ 3,8 GET rA_CONTEUDO2 PICT '@!' VALID FUNCAO()
      READ
      IF LASTKEY()=1002 .OR. LASTKEY()=27 // BOTAO ESQUERDO DO MOUSE
         EXIT
      ENDIF
   ENDDO
   restore screen from rT_TELGET
   RETURN rA_CONTEUDO2


PROCEDURE FUNCAO()
IF MROW()=1 .AND. MCOL()=23
   KEYBOARD CHR(27)
ENDIF
RETURN .T.
ABEL
Avatar do usuário
rmg
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 02 Mar 2006 11:54
Localização: Ipanema/MG

harbour - modo console / mouse / get

Mensagem por rmg »

Abel,

Então, quando aos códigos referentes aos eventos do mouse, você pode encontrar direto no cabeçalho inkey.ch do Harbour, em Mouse Events.

Quanto a usar referencias da área que está sendo clicada, você vai conseguir com as funções e códigos de tecla que já indicou na sua pergunta. MCol(), MRow(), 1002, 1004, etc.

Quando usamos o READ, de fato ele aguarda a finalização da tela dos GET's, e usando o código da forma indicada no seu questionamento, o sistema só vai atingir o bloco de código onde você está verificando se o clique do mouse foi feito depois que sair do último GET.

Você pode fazer alterações direto nas classes do tget/getsys, ou então tentar incrementar de alguma outra forma antes do READ.

Então, resumindo, se for fazer validações com o mouse sem usar GET, conseguirá sem maiores alterações. Agora se for usar o mouse em uma tela GET, terá que fazer alterações ou usar algum recurso na própria lista GET.

Veja um código sem usar o GET:

Código: Selecionar todos

procedure main 
local nevento:=0, ctela, ctelamax, lminimizada:=.f., lmaximizada:=.f.
clear screen 

?? "Pressione ESC para sair"

SET EVENTMASK TO INKEY_ALL

ctela=savescreen(3,2,10,40)

@ 3,2 to 10,40
@ 4,34 say "- [] X"
@ 5,3 say replicate(chr(196),37)

do while lastkey() <> K_ESC
   nevento := Inkey(0)
   nevento := LastKey( INKEY_KEYBOARD + INKEY_LUP )
   if nevento == 0
      loop
   end if
   @ 0, 0 clear to 1, maxcol()
   
   // Fechar janela
   if mrow()=4 .and. mcol()=39 .and. lastkey()=1002 .and. !lminimizada .and. !lmaximizada
      if alert("Deseja realmente fechar a janela?",{"Sim","Nao"})=1
         restscreen(3,2,10,40,ctela)
      end if
   // Minimizar janela
   elseif mrow()=4 .and. mcol()=34 .and. lastkey()=1002 .and. !lminimizada .and. !lmaximizada
      ctelamax=savescreen(3,2,10,40)
      restscreen(3,2,10,40,ctela)
      @ maxrow()-3,0 to maxrow()-1,10
      @ maxrow()-2,8 say "[]"
      lminimizada=.t.
   // Maximizar janela
   elseif mrow()=4 .and. mcol()>=36 .and. mcol()<=37 .and. lastkey()=1002 .and. !lminimizada .and. !lmaximizada
      ctelamax=savescreen(3,2,10,40)
      restscreen(3,2,10,40,ctela)
      @ 3,2 to maxrow()-2,75
      @ 5,3 say replicate(chr(196),72)
      @ 4,73 say "[]"
      lmaximizada=.t.
   // Restaurar janela minimizada
   elseif mrow()=maxrow()-2 .and. mcol()>=8 .and. mcol()<=9 .and. lastkey()=1002 .and. lminimizada
      @ maxrow()-3,0 clear to maxrow()-1,10
      restscreen(3,2,10,40,ctelamax)
      lminimizada=.f.
   // Restaurar janela maximizada
   elseif mrow()=4 .and. mcol()>=73 .and. mcol()<=74 .and. lastkey()=1002 .and. lmaximizada
      @ 3,2 clear to maxrow()-2,75
      restscreen(3,2,10,40,ctelamax)
      lmaximizada=.f.
   end if
   
   if nevento >= K_MINMOUSE
      @ 0,1 say "Linha do mouse :"
      ?? mrow()
      @ 1,1 say "Coluna do mouse:"
      ?? mcol()
   else
      @ 0,1 say "Codigo de tecla:"
      ?? nevento
   end if
   @ maxrow(),0 say str(lastkey())

enddo

return nil

Veja um código usando uma tela GET (Aqui eu encaro como uma gambiarra, usando os GET's como recurso):

Código: Selecionar todos

#include "Inkey.ch"

procedure main
local d_dataini:=ctod(""), ctexto:=space(20)
public cEsc       := "N"

SET EVENTMASK TO INKEY_ALL

clear screen

tela(06,04,15,73," Teste GET ")
@ 09,06 say "Data :" Get d_DataIni
@ 13,06 say "Texto:" Get ctexto picture "@!"
func_botoes(,06,04,15,73)
read

function tela(nwin_1, nwin_2, nwin_3, nwin_4,ctitulo)
cor_sec = "W"
pri_cor = 'w+'
seg_cor = 'n'
c_corant := setcolor()
if valtype(nwin_1)='N'
   @ nwin_1,nwin_2 clear to nwin_3,nwin_4
   @ nwin_1-1, nwin_2 to nwin_3, nwin_4
   @ nwin_1,nwin_2 say ' [' color(pri_cor+'/'+seg_cor)
   @ nwin_1,col()  say left(ctitulo,(nwin_4-nwin_2)-4) color(pri_cor+'/'+seg_cor)
   @ nwin_1,nwin_2+1+len(ctitulo)+1 say ']' color(pri_cor+'/'+seg_cor)
   cordajan := 'gr+/'+seg_cor+',gr+/'+seg_cor
   @ nwin_1,nwin_4-2 say "XX"  color(cordajan)
   dispend()
endif
return


function func_botoes(tela_jan,l01,c01,l02,c02,l_01,c_01)
if tela_jan=nil
   tela_jan := .t.
endif
cEsc := "N"
if tela_jan=.t.
   @ l02-3,c02-6 to l02-1,c02-1
   @ l02-2,c02-5 get " Ok " when validar_botoes(2) color('n/w,n/w')
   @ l01,c02-2   get "XX" when validar_botoes(1) color('gr+/n,gr+/n')
else
   @ l01,c01 to l02,c02
   @ l01+1,c01+1 get " Ok " when validar_botoes(2) color('n/w,n/w')
   @ l_01,c_01   get "XX" when validar_botoes(1) color('gr+/n,gr+/n')
endif

function validar_botoes
parameters ntecla
if ntecla=1
   if cEsc="N"
      keyboard chr(27)
   else
      keyboard chr(13)
   endif
   return .t.
elseif ntecla=2
   cEsc := "S"
   keyboard chr(13)
   return .t.
endif

Como falei, as classes de Get poderiam ser alteradas também para permitir esse recurso.

Abraço,
Renato Martins
Analista de TI - Grupo Colombo<br>
Harbour, xHarbour, C, C++
Responder