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