Onde está a MEMOEDIT() no Harbour?

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

Moderador: Moderadores

rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Onde está a MEMOEDIT() no Harbour?

Mensagem por rmlazzari »

Alguém sabe onde está a MEMOEDIT() dentre as bibliotecas que o Harbour usa?

No diretório LIB da minha instalação (hb32 e, na verdade, "C:\hb32\lib\win\mingw") só tem um arquivo com a extensão .LIB, o "hwgdebug.lib", todos os outros arquivos têm a extensão .A. É que eu gostaria de estudar e tentar alterar a memoedit para ver se tem um jeito de, clicando fora das coordenadas estipuladas pela ela, ela assumisse como um ctrl-w ou um esc. Quem sabe até um menu no rodapé da janela?

Alguém já descompilou e recompilou bibliotecas desse tipo, A? Como é que mexe nisso?
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Onde está a MEMOEDIT() no Harbour?

Mensagem por JoséQuintas »

Ainda tá pulando carnaval..... rs

Quem disse que precisa alterar MemoEdit() pra isso?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Onde está a MEMOEDIT() no Harbour?

Mensagem por alxsts »

Olá!

A resposta à sua pergunta depende do compilador que foi usado para gerar a tua instalação do Harbour, que pode ser GCC, MSVC ou MinGW.
Algumas extensões de arquivo variam conforme o compilador usado:
.LIB = extensão pra LIB em MSVC e GCC
.OBJ = extensão pra OBJ em MSVC e GCC
.a = extensão pra LIB em MinGW
.o = extensão pra OBJ em MinGW
Creio que você teria que alterar o fonte da função MemoEdit()*, colocar este fonte alterado na pasta de fontes do Harbour e depois gerar a nova versão do Harbour, com suas alterações incluídas.

* O fonte apresentado pertence à versão 3.4, mantida pelo Viktor Szakats. No caso da versão oficial, será necessário alterar o fonte desta versão.
[]´s
Alexandre Santos (AlxSts)
rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Onde está a MEMOEDIT() no Harbour?

Mensagem por rmlazzari »

José Quintas, a memoedit() não é sensível aos inputs por mouse.

Alexandre, grato, vou dar uma estudada. Quem sabe a gente acaba achando algo que contribui com todo mundo, né?

A memoedit() a que me refiro é um pequeno bloco de notas temporárias, não é importante saber se é para gravar, reformatar parágrafo, nada disso.
Bastaria que o usuário desse um clique no tabuleiro para que o programa grave o que estiver na janela de texto e volte ao jogo.

Por enquanto, baseando-me na resposta do caro Quintas e nesse tópico aqui ( https://pctoledo.org/forum/viewto ... =4&t=12152 ), o que tentei foi:

No programa principal:

Código: Selecionar todos

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850

function MAIN()

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

* setmode(25,80)
setmode(26,80)

set colo to
cls

set wrap on
set score off
set date brit
set century on
set cursor off
set eventmask to 255 // <- incluí esse set. 255 significa "qualquer tecla ou mouse", segundo o inkey.ch
e na função que chama a memoedit():

Código: Selecionar todos

xobs = memoedit(xobs,03,45,19,75,tipo,'usrme') // tipo é passado por parâmetro à função mtexto() que é a que contém essas linhas aí...
set curs off
dbcommitall()
retu


* funcao do usuario da memoedit()
func usrme(mstat,mlin,mcol)
loca mtecla  := lastkey()
loca mretval := 0

if mstat = 0
   // modo = idle
else
   if mstat = 1 .or. mstat = 2 // tanto faz se mudou ou não o buffer, grave sempre, já que são apenas anotações temporárias
      if mtecla = 27 .or. mtecla = 23 .or.;
      (mtecla = 1002 .and. mlin >= 2 .and. mlin <= 20 .and. mcol >= 3 .and. mcol  <= 39) // 1002 é o retorno de inkey() ao clique com botão esquerdo e essas coordenadas são as coordenadas do tabuleiro
         mretval = 23
      endi
   elseif mstat = 3
      // modo = inicialização da memoedit
   endi
endi
retu mretval

Bem... contar um pouco da história: estou fazendo um programa para jogar Sudoku. Na tela desse programa há duas janelas lado-a-lado.
A da esquerda é o tabuleiro, onde há as 81 casas; a da direita, um bolo de anotações para dicas rápidas, que a gente anota do ladinho da folha quando joga um sudoku impresso...

Quando o usuário está jogando, se clicar com o botão esquerdo no tabuleiro, posiciona o curso na casa mais próxima do cursor. E se clicar com o mesmo botão na área em que está o bloco de notas, entra na memoedit(). Eu gostaria de que ele voltasse ao tabuleiro - e deixando gravado o que tivesse alterado no bloco de notas - clicando com o esquerdo no tabuleiro. Mas só consigo sair da memoedit() teclando ESC ou CTRL-W... A memoedit() como está, mesmo depois do "set eventmask = 255", está cega e surda ao mouse.

Tenho comentado sobre isso no tópico "Migrar Clipper para Harbour" mas não sem um pouco de constrangimento, já que o assunto talvez já esteja extrapolando em muito o assunto daquele tópico... Além de que é um tópico pinado, muito importante para quem chega e quer debater migração entre compiladores.

Se quiser dar uma olhada, eis aqui os fontes e o executável desse programa de Sudoku. Cuidado: não execute o sudoku.exe em qualquer lugar porque ele vai criar um monte de arquivos e tralhas, vai bagunçar o coreto... digo, a pasta em que for executado. Aqui criei a pasta "sudoku" sob a "Arquivos de programas", mas pode por onde quiser...
sudoku.zip
(718.14 KiB) Baixado 35 vezes
Grato!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Onde está a MEMOEDIT() no Harbour?

Mensagem por JoséQuintas »

Não é o ideal mas quebra o galho, já testei aqui.

Código: Selecionar todos

TestMouseOn()
xobs = memoedit(xobs,03,45,19,75,tipo,'usrme')
TestMouseOff()

Código: Selecionar todos

STATIC FUNCTION TestMouseOn()
   hb_gtInfo( 60, { | nKey | iif( nKey > 1000 .and. MRow() >= 2 .and. MRow() <= 20 .and. MCol() >= 3 .and. MCol() <= 39, 23, nKey ) } )
   RETURN NIL

STATIC FUNCTION TestMouseOff()
   hb_gtInfo( 60, NIL )
   RETURN NIL
Talvez até possa abrir mais possibilidades no jogo, como mexer no tabuleiro com o MemoEdit() aberto.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Onde está a MEMOEDIT() no Harbour?

Mensagem por rmlazzari »

Grato, caro José Quintas!

Funciona, sim, mas com um pequeno um problema: a simples passagem do mouse sobre o tabuleiro já encerra a memoedit(), o que deixa o usuário pisando em ovos. Ainda mais sendo as notas uma janela para escrever e ler, basta dar uma empurradinha no mouse, coisa que a gente faz automaticamente quando está editando texto e o cursor está no meio do texto, que o cursor bate no tabuleiro e... lá se vão as notas.

Todavia, lendo sua solução, reparei que na minha nunca que eu poderia buscar a informação das coordenadas do cursor fora das coordenadas do memoedit(). Linha e coluna passadas à função do usuário jamais seriam algo de fora da janela da própria memoedit(). E o que me chamou a atenção foi o fato de que no código de bloco que você fez, você busca as coordenadas em mRow() e mCol(), duas funções que não estão nem aí para a memoedit(), respondem a posição do cursor do mouse esteja onde estiverem. Nem precisou do teste de hb_GtInfo...

Resultou que está funcionando perfeito assim:

Código: Selecionar todos

set colo to
readinsert(.t.)
set curs on
xobs = memoedit(xobs,03,45,19,75,tipo,'usrme')
set curs off
dbcommitall()
retu


* funcao do usuario da memoedit()
func usrme(mstat,mlin,mcol)
loca mtecla  := lastkey()
loca mretval := 0
loca jqlin := mrow() // novidade
loca jqcol := mcol() // novidade

if mstat = 0
   // modo = idle
else
   if mstat = 1 .or. mstat = 2
      // modo = unkeyx, tecla desconhecida mas texto alterado
      if mtecla = 27 .or. mtecla = 23 .or.;
      (mtecla = 1002 .and. jqlin >= 2 .and. jqlin <= 20 .and. jqcol >= 3 .and. jqcol  <= 39)
         mretval = 23
      endi
   elseif mstat = 3
      // modo = inicialização da memoedit
   endi
endi
retu mretval
"jqlin" e "jqcol"... ;)

Imagine as possibilidades:

1 - Desenhe o box onde estará o texto
2 - Desenhe um outro box de apenas uma linha abaixo do box de texto e escreva "Salvar", "Sair" ou o que quiser...
3 - Ponha o texto dentro do box grandão com a memoedit(), diga, na user function, o que fazer se o clique for aqui ou ali e...
4 - Vá pro abraço! rs...

Abraço! Grato!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Onde está a MEMOEDIT() no Harbour?

Mensagem por JoséQuintas »

Reduza a sensibilidade do Inkey.
Ao invés de INKEY_ALL, use INKEY_ALL - INKEY_MOVE, que é para o movimento do mouse não ser considerado.

Mas se assim funcionou, nem precisa da outra.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder