Página 1 de 1

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

Enviado: 22 Jan 2008 20:28
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.

Enviado: 23 Jan 2008 01:29
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.

Enviado: 23 Jan 2008 09:43
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

Enviado: 23 Jan 2008 09:50
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á.

Enviado: 23 Jan 2008 09:53
por alaminojunior
Realmente, é um caso pra se pensar e estudar.

Enviado: 23 Jan 2008 13:06
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

Enviado: 23 Jan 2008 13:24
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.

Enviado: 23 Jan 2008 13:29
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. :)

Enviado: 23 Jan 2008 13:31
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´.

Enviado: 23 Jan 2008 18:33
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!

Enviado: 23 Jan 2008 18:54
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. :)

Enviado: 24 Jan 2008 10:04
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.

Enviado: 24 Jan 2008 21:10
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!