Página 1 de 2

Uso de funções da Mouse Library do Clipper

Enviado: 12 Set 2013 15:20
por billy1943
Nos meus vários sistemas em Clipper, usei e abusei das funções abaixo da Mouse Library que estão em C ou Assembler;
a) M_INIT() - inicializa o driver do mouse;
b) M_SHOW() - mostra o cursor do mouse;
c) M_HIDE() - oculta cursor do mouse;
d) M_STAT() - indica o status dos botões do mouse ;
e) M_XPOS() - coordenada x do cursor do mouse;
f) M_YPOS() - coordenada y do cursor do mouse.

Essas rotinas foram usadas no getsys.prg e outros que modifiquei.
Simplesmente agregava o clipmous.obj para que fossem linkadas pelo Blinker.

Tentando agora passar um desses sistemas para HMG, defrontei-me com o problema de que essas funções por não estarem Clipper não são assumidas e nem existem nos fontes disponibilizados na compilação.

Como contornar essa falta ?

Existem essas funções no Harbour para que eu as possa substituir ?

Uso de funções da Mouse Library do Clipper

Enviado: 12 Set 2013 15:43
por Jairo Maia
Olá Billy,

No Harbour tem as funções equivalentes. Para você ter melhor idéia, use o xHarbour Language Reference Guide, digite na busca: mouse, depois clique em: mouse functions. Você terá todas as funções de mouse.

Uso de funções da Mouse Library do Clipper

Enviado: 12 Set 2013 18:17
por billy1943
Oi, Jairo

Achei no Guia de referência da Linguagem XHarbour, as funções de mouse e as verifiquei atentamente na sua sintaxe e o que elas retornam.

Ocorre que somente as funções MSHOW e MHIDE são usadas da mesma forma que o Clipper faz.

As funções M_INIT e M_STAT precisam retornar um valor numérico, como poderá ser visto no trecho do fonte (GETSYS.PRG), em Clipper, abaixo.

Deduzi que as correspondentes no XHarbour seriam as funções SETMOUSE e MSAVESTATE, respectivamente.
Mas o retorno delas não é numérico em nenhum dos casos.

Assim, solicitaria que me informassem se estou certo na minha suposição ou não, ou ainda quais seriam as funções adequadas para
a finalidade de que necessito.

Código: Selecionar todos

FUNCTION IN_KM(w_0)
LOCAL rez,mstat
 IF TYPE("is_mpresent")<>"L"
  PUBLIC is_mpresent := ( M_INIT() <> 0 )
 ENDIF
 IF is_mpresent
  m_show()
 ENDIF
 DO WHILE .T.
  IF (rez:=INKEY())<>0
   EXIT
  ENDIF
  IF is_mpresent.AND.(mstat:=M_STAT())<>0
   IF w_0=Nil.OR.w_0
    DO WHILE M_STAT()<>0
    ENDDO
   ENDIF
   rez=mstat+500
   EXIT
  ENDIF
 ENDDO
 IF is_mpresent
  m_hide()
 ENDIF
RETURN rez

Uso de funções da Mouse Library do Clipper

Enviado: 13 Set 2013 18:00
por Jairo Maia
Billy, acho que igual não vai ter, mas precisa adaptar com as similares. Por exemplo:

Código: Selecionar todos

Function M_INIT()
Return If( MPresente(), 1, 0 )

Código: Selecionar todos

Function M_STAT()
 Local nBotao := 0
 If MLeftDown()
  nBotao := 1
 ElseIf MRightDown()
  nBotao := 2
 EndIf
Return ( nBotao )

Código: Selecionar todos

Function M_XPOS()
Return MRow()

Código: Selecionar todos

Function M_YPOS()
Return MCol()

Uso de funções da Mouse Library do Clipper

Enviado: 13 Set 2013 18:49
por billy1943
RESOLVIDO.


Consegui compilar o primeiro sistema de Clipper no HMG.

Obrigado novamente ao Jairo Maia pela atenção dada a este incipiente aprendiz de XHarbour.

Obs: a função a constar em M_INIT é MPresent()

Uso de funções da Mouse Library do Clipper

Enviado: 14 Set 2013 15:02
por cjp
Amigos, existe algo equivalente no Harbour também, ou só para o Xharbour? Eu gostaria de acrescer o uso do mouse nas minhas funções, se for algo simples.

Uso de funções da Mouse Library do Clipper

Enviado: 14 Set 2013 19:01
por Pablo César
cjp escreveu:Amigos, existe algo equivalente no Harbour também, ou só para o Xharbour? Eu gostaria de acrescer o uso do mouse nas minhas funções, se for algo simples.
Por favor LEIA com mais atenção:
billy1943 escreveu:RESOLVIDO.

Consegui compilar o primeiro sistema de Clipper no HMG.
HMG = HARBOUR

Uso de funções da Mouse Library do Clipper

Enviado: 15 Set 2013 00:04
por cjp
Peço desculpa pela minha ignorância, Fabio, mas eu imaginei que HMG fosse apenas em modo gráfico.

Testei a solução apresentada, mas está dando falta das funções m_show() e m_hide().

Também gostaria de saber como chamar a função de dentro do meu programa, para fazer funcionar o mouse.

Uso de funções da Mouse Library do Clipper

Enviado: 15 Set 2013 08:56
por Jairo Maia
Olá Inácio,

Quanto a falta das funções, acrescente em seu sistema as funções faltantes como abaixo:

Código: Selecionar todos

Function M_SHOW()
Return MShow()

Código: Selecionar todos

Function M_Hide()
Return MHide()
Nota aos colegas:
Após habilitar as rotinas do Mouse, verifiquem no gerenciador de tarefas o uso de CPU. Se estiver em 100% mesmo quando o aplicativo estiver em repouso, será necessário pequenos ajustes e estes ajustes dependem das respectivas funções que capturam os eventos do mouse. Mas são simples de ajustar.

Uso de funções da Mouse Library do Clipper

Enviado: 16 Set 2013 01:01
por cjp
Deu certo, Jairo.

Mas ainda não consegui habilitar efetivamente o mouse.

Como chamar a função exatamente?

Uso de funções da Mouse Library do Clipper

Enviado: 16 Set 2013 02:45
por Jairo Maia
Olá Inácio,

Para um sistema trabalhar com Mouse em modo console, ele precisa ser planejado para isso, ou claro, ser alterado para capturar os eventos do mouse. Não basta usar o comando SET EVENTMASK INKEY_ALL (que não é o caso aqui), precisa tratar os eventos. Num aplicativo gráfico, ele é automaticamente montado para uso de mouse.

Mas para que você passe a ter uma idéia de como isso funciona, veja o exemplo abaixo, mas veja também, que é um exemplo simples, e portanto em qualquer ponto que você pressionar o mouse vai ter efeito, pois não tem área de evento delimitada, sendo a tela toda. Observe que a função Inkey() está embutida na função MyInkey() que retorna a tecla digitada ou evento do mouse:

Código: Selecionar todos

Function Main()

 Clear Screen

 @ 3,2 say "Pressione alguma tecla ou o Mouse..."

 While LastKey() != 27

  nTecla := MyInkey()

  cMsg := "Voce pressionou a tecla: " + Chr( nTecla )
  cMsg += " - " + Hb_NToS( nTecla ) + Space( 20 )
  @ 5,2 say cMsg

 EndDo

 SetPos( 10, 1 )

Return Nil

Function MyInkey()

 While Inkey( .01 ) = 0  // .01 para desacelerar o processador...

  @ 7,2 say MRow()
  @ 8,2 say MCol()

  If MLeftDown()
   Hb_KeyPut( 13 )
  ElseIf MRightDown()
   Hb_KeyPut( 27 )
  EndIf

 EndDo

Return LastKey()

Uso de funções da Mouse Library do Clipper

Enviado: 17 Set 2013 00:15
por cjp
Entendi a lógica, meu caro.

Só fiquei com uma dúvida: como faço para delimitar a área do evento pro mouse? Imagine um menu com @...prompt, por exemplo. Como mudo ele para permitir usar o mouse para selecionar no menu?

Uso de funções da Mouse Library do Clipper

Enviado: 17 Set 2013 14:36
por Jairo Maia
Olá Inácio,

Pelo que sei, as funções MENU TO, ACHOICE e ALERT delimitam automaticamente a área de eventos, embora não use nenhuma delas. Mas você poderia postar um exemplo de menu que você usa? Acho que fica mais fácil exemplificar.

Uso de funções da Mouse Library do Clipper

Enviado: 17 Set 2013 23:50
por cjp
Uso menus simples, como este:

Código: Selecionar todos

  
   @ 2,0 TO 2,maxcol() DOUBLE                                                                                                                                                                                                                                                                                                                                       
   @ 1,1 PROMPT "Finalizar"                                                                                                                                                                                                                                                                                                                                   
   @ 1,15 PROMPT "Ag.financeira"                                                                                                                                                                                                                                                                                                                              
   @ 1,35 PROMPT "Contas bancárias"                                                                                                                                                                                                                                                                                                                           
   @ 1,51 PROMPT "Telefones"                                                                                                                                                                                                                                                                                                                                  
   @ 1,65 PROMPT "Compromissos"                                                                                                                                                                                                                                                                                                                               
   MENU TO OPC                                                                                                                                                                                                                                                                                                                                                
Mas, se era pra ser automático, aqui não está funcionando.

Uso de funções da Mouse Library do Clipper

Enviado: 18 Set 2013 02:48
por Jairo Maia
Olá Inácio,

Pois é... O Alert() define a área automaticamente, o MENU TO não... Vai entender.

Mas de qualquer forma, de uma olhada no menu abaixo montado com seu exemplo. Veja que o mouse funciona quase 100%. Quase pq se o usuário clica entre duas opções na linha 1, a opção marcada é selecionada.

PS: Para Este caso, usei SET EVENTMASK. Use duplo clique para testar.

Para compilar use: Hbmk2 nome_teste -lxhb

Código: Selecionar todos

#include "inkey.ch"
#include "hbgtinfo.ch"

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850

REQUEST HB_GT_WVT_DEFAULT

Function Main()

 HB_LANGSELECT('PT')
 HB_SETCODEPAGE('PT850')

 HB_GtInfo( HB_GTI_MAXIMIZED, .T. )
 HB_GtInfo( HB_GTI_FONTNAME, "Lucida Console" )
 HB_GtInfo( HB_GTI_WINTITLE, "Teste para Mouse" )

 /*
   habilita o mouse...
 */
 SET EVENTMASK TO HB_INKEY_ALL

 While LastKey() != K_ESC

  Clear Screen
  DispBox( 0, 1, 2, MaxCol(), Nil, "GR+/N" )
  DispBox( 3, 1, MaxRow(), MaxCol(), Nil, "G+/N" )

  @ 1,3 PROMPT "Finalizar"
  @ 1,16 PROMPT "Ag.financeira"
  @ 1,32 PROMPT "Contas bancárias"
  @ 1,52 PROMPT "Telefones"
  @ 1,66 PROMPT "Compromissos"

  MENU TO OPC

  /*
    Como em Harbour a função MSetBounds() não funciona,
    em Harbour tem que definir a area na unha...
  */
  If MRow() != 1
   Loop
  ElseIf LastKey() != K_ESC
   Alert( "Você clicou na opção: " + Hb_NToS( opc ) )
  EndIf

 EndDo

Return Nil