Página 1 de 1

Onde está a MEMOEDIT() no Harbour?

Enviado: 12 Fev 2016 23:09
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?

Onde está a MEMOEDIT() no Harbour?

Enviado: 12 Fev 2016 23:34
por JoséQuintas
Ainda tá pulando carnaval..... rs

Quem disse que precisa alterar MemoEdit() pra isso?

Onde está a MEMOEDIT() no Harbour?

Enviado: 13 Fev 2016 00:15
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.

Onde está a MEMOEDIT() no Harbour?

Enviado: 13 Fev 2016 11:00
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!

Onde está a MEMOEDIT() no Harbour?

Enviado: 13 Fev 2016 12:21
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.

Onde está a MEMOEDIT() no Harbour?

Enviado: 13 Fev 2016 13:10
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!

Onde está a MEMOEDIT() no Harbour?

Enviado: 13 Fev 2016 16:26
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.