Localizar um TEXTO dentro de um MEMOEDIT - Por favor, ajudem

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

fabianocbrito
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 06 Nov 2007 23:30
Localização: Alfenas

Localizar um TEXTO dentro de um MEMOEDIT - Por favor, ajudem

Mensagem por fabianocbrito »

Prezados colegas,

preciso de uma função para localizar um texto (fornecido através de uma variavel) dentro de um memoedit, em um campo MEMO do DBF. Só preciso localizar o texto e posicionar nele.

Tenho visto alguns exemplos aqui no forum utilizando as funcoes CHARODD() e SCREENSTR() da CT.LIB mas estas funcoes pelo que entendi tratam de caracteres da TELA naquele momento. Não consegui adaptar para funcionar dentro de um campo MEMO já gravado no DBF usando uma função de controle do MEMOEDIT(). Por exemplo, quero pressionar uma tecla de função qualquer (ex: F3) e, na função de controle do MEMOEDIT, fazer ela pesquizar na variavel MEMO. Se localizar o texto, posicionar nele dentro do campo memo.

Agradeço desde já a atenção dispensada.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Pelo pouco que lembro do MemoEdit (nunca usei), ele não permite o reposicionamento do cursor on-the-fly. Alguém me corrija se eu estiver errado.
A busca de uma palavra no texto em si é relativamente fácil com as funções de strings que o Clipper oferece. Mas saber qual a linha e coluna da sub-string dentro do texto formatado pelo MemoEdit, me parece ser um recurso inexistente. Pelo menos eu nunca vi nada igual.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Partindo do principio de que, vc pode jogar o conteudo deste campo memo dentro de uma variável, ou talvez nem precise, tente assim:

Código: Selecionar todos

if at(alltrim(argumento),campomemo) > 0
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Não é só isso, Junior. Note que o colega quer posicionar o cursor dentro do MemoEdit, exatamente onde se encontra a plavra desejada. Se o problema fosse só pesquisa até seria fácil. Mas,... Acho que não dá.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Realmente, é um caso pra se pensar e estudar.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Caro Fabiano, vamos pensar um pouco.
Você pode atribuir o contéudo do memo a uma variável e tratá-lo como tal.
Assim, a função at() vai apresentar a posição da ocorrência da string na variável.
Então, se vc formatar a variável, com ajuda de memoline(), dá prá ter a linha e coluna da ocorrência.
Suponhamos que, numa formatação da variável memo com 80 colunas, at() retorne 136 e memoline() retorne 5.
Então a ocorrência da string está na linha 2 (entre 81 e 160), na coluna 56.
Mas por quê?

cMemo := ... memo...
nPosicao := at(cMemo,'x') // ocorrência da string
nLinhas := memoline(cMemo,80) // nº de linhas se apresentado c/ 80 colunas
nLin := int(nPosicao/80) + 1

if nPosicao <= 80
nCol := nPosicao
else
nCol := nPosicao-(nLinhas*80)
endif

Então em nBufferRow e nBufferCol indique a posição no memoedit uai.

Acho que vai funcionar.

Espero ter ajudado.

MarceloG
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Só preciso localizar o texto e posicionar nele.
Se o desejo do nosso colega é só localizar a expressão dentro da variavel, faz sentido. Agora, o que será que ele quer dizer com posicionar ? Posicionar para que ? Me desculpe a curiosidade.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Agora, o que será que ele quer dizer com posicionar ? Posicionar para que ? Me desculpe a curiosidade.
Provavelmente ele quer ter o que se tem no Word, por exemplo. Nele você pesquisa e o caret (já não é cursor mais) é posicionado na palavra, que aparece em destaque. Faz sentido e ficaria legal. Se der. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

alaminojunior escreveu:
Só preciso localizar o texto e posicionar nele.
Posicionar para que ?
Provavelmente seja para editar. Se não for preciso editar dá para usar uma função para visualização de arquivos com mais de 64kb que um colega colocou em ´funções com fontes´.
fabianocbrito
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 06 Nov 2007 23:30
Localização: Alfenas

Mensagem por fabianocbrito »

Caro colegas, muito obrigado pela atenção:

Respondendo a questão do "PORQUE POSICIONAR":
Preciso posicionar na palavra ou texto pesquisado porque o operador do sistema precisará substituir um texto por outro, mais ou menos como funciona o localizar no Windows (CTRL+F no bloco de notas por ex), para assim, o memoedit continuando a estar em modo de edição, o operador apagar a palavra que procurou e trocar por outra. É um sistema de LAUDOS pré-digitados, q o operador escolhe o LAUDO e o insere no CAMPO MEMO do RESULTADO. Daí, no laudo pré digitado, ele quer colocar algum caracter coringa, por ex "@", para ele procurar este caracter "@" no texto já dentro do MEMOEDIT e substituir pelo valor do resultado apurado nos exames dele.

É isto.

Espero que tenha sanado a dúvida e que sirva para novas discussões sobre o assunto!

Obrigadíssimo!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Deve ser mais ou menos como o meu antigo (e já falecido) sistema de contabilidade. Quando o sujeito ia fazer um lançamento contábil, havia um campo de histórico configurável. Eu nunca quis usar memo pra isso. Então eu deixava incluir um histórico padrão com algumas "tags" no meio. Ao incluir o lançamento, ao invés do sujeito fazer o que você faria no memo, eu abria um campo GET para cada tag que o texto continha. Funcionava redondinho e o sujeito não precisava procurar coisa alguma. Era só preencher esses campos. Deixo essa idéia pra você.

Aliás, agora lembrando: eu também tinha um sistema de laboratório de análises em que haviam os tais laudos também. O esquema era parecido com esse que descrevi, embora mais arcaico. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Fabiano, você ja testou o meu exemplo ?. Compile e veja se é isso que +/- você quer:

https://pctoledo.org/forum/viewtopic.php?t=5521

Depois é só adaptar para a tecla F3 para que o usuáro digite a string numa janela e procurar-la no MEMOEDIT.

Este método que utilizei, baseia-se no posicionamento inicial nTextBufferRow e nTextBufferColumn que o MEMOEDIT possue como 10º 3 11º parâmetro. Porque o MEMOEDIT não possue um método interno de posicionamento do cursor como o colega Maligno já falou. Então a jogada está em abrir, fechar e re-abrir o MEMOEDIT conforme a posição da string localizada, isto é feito em looping.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
fabianocbrito
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 06 Nov 2007 23:30
Localização: Alfenas

Mensagem por fabianocbrito »

Obrigado pessoal, pela atenção.

Pablo César,
estou testando o seu exemplo. é mais ou menos o que preciso sim. Muito obrigado.

Estou estudando também um exemplo que é oferecido com o CLIPPER, junto com seus fontes (\CLIPPER\SOURCE\PE\PE.PRG) . Trata-se do editor PE.EXE desenvolvido totalmente em CLIPPER e que é baseado fundamentalmente na função MEMOEDIT. Ele tem uma pesquisa implementada que vale a pena dar uma olhada: (ALT+S=SEARCH) e (ALT+A=SEARCH AGAIN).

Fica aí uma dica para quem quizer uma referencia.

Obrigado!
Responder