Fórum TRichEdit - Selecionar texto dentro de um bloco #367267
22/12/2008
0
Estou com uma dúvida e estou precisado de uma ajuda.
Preciso do seguinte:
Eu tenho um backup do meu BD MySQL no qual crio um arquivo de texto e logo leio ele em um TRichEdit.
Até então sem problemas.
Logo depois disto, eu gostaria de exibir em outro TRichEdit alguns conteúdos dentro de um bloco. Ou seja somente selecionar e copiar para outro oque estiver dentro da linha X, posição 2 até linha Y posição 15;
Exemplo como leio:
Exemplo oque quero buscar:
De: CREATE TABLE
Até: ) ENGINE
Entenderão?
Conseguir localizar em todo o arquivo todas as CREATE TABLE e ) ENGINE eu consigo. Porém não estou raciocinando corretamente selecionar o conteúdo dentro deste bloco.
Podem me ajudar?
Devmedia
Curtir tópico
+ 0Posts
24/12/2008
Devmedia
Gostei + 0
29/12/2008
Devmedia
Gostei + 0
01/01/2009
Dbergkamps10
Procura a string do ´CREATE TABLE´ através do comando POS, e depois marque como o inicio da seleção. Depois localize )ENGINE e marque como o final da seleção. Ficaria assim:
memo1.SelStart := pos(´CREATE TABLE´, String_Consulta) -1; Memo1.SelLenght:=[pos(´)ENGINE´, String_Consulta) -1]-[pos(´CREATE TABLE´, String_Consulta) -1] ;
Assim vc tera o texto selecionado. Pode haver algum problema em relação a mais um ou menos um caracter selecionado.
Att
Dalton
Gostei + 0
02/01/2009
Devmedia
memo1.SelStart := pos(´CREATE TABLE´, String_Consulta) -1; Memo1.SelLenght:=[pos(´)ENGINE´, String_Consulta) -1]-[pos(´CREATE TABLE´, String_Consulta) -1] ;
Amigo Dalton!
Tudo bom contigo?
Muito obrigado pela sua resposta, porém como eu vou pegar este conteúdo e mover para outro TRichEdit?
Lembrando que a tabela terá bastante resultado por esta consulta! Então terá que dar sequência, sem substituir pelos já localizados.
Grato.
Gostei + 0
02/01/2009
Devmedia
Memo1.SelLenght:=[pos(´)ENGINE´, String_Consulta) -1]-[pos(´CREATE TABLE´, String_Consulta) -1] ;
Outro detalhe é que aqui no Delphi 2009 nesta linha, acontece este erro:
[color=red:047a5e1c7b]Incompatible types ´Integer´ and ´set´[/color:047a5e1c7b]
Se eu retirar as [] do código, funciona a seleção do texto, porém falta o CREATE no ínicio da consulta e no final, seleciona até ) ENGINE=Inn
Eu verifiquei através deste código:
RichEditBACKUP.SelStart := Pos(EditProcuraDe.Text, RichEditBACKUP.Text) -1; RichEditBACKUP.SelLength := Pos(EditProcuraAte.Text, RichEditBACKUP.Text) -1 - Pos(EditProcuraDe.Text, RichEditBACKUP.Text) -1; RichEditBACKUP.SelAttributes.Color := ClRed; RichEditBACKUP.SelAttributes.Style := [fsBold];
Gostei + 0
02/01/2009
Dbergkamps10
Grande Lucas, foi mal... :lol: :lol: :lol:
É que faço curso de matemática, e sempre depois dos parênteses usamos os colchetes.... mas nesse caso era só pra vc ´enxergar´ melhor o código.
Espero q vc consiga, qualquer coisa poste pra q a gente possa te ajudar.
Att
Dalton
Gostei + 0
05/01/2009
Devmedia
Olá Dalton!
Tudo bom contigo?
Muito obrigado pelas suas respostas e com elas, juntando a outras dicas consegui alterar uma função para o que preciso. O porém é que a função esta com um ´leve´ defeito, segue:
procedure TForm1.FindCopy(var Texto: TRichEdit);
var
FoundStart : LongInt;
StartPos, StartPos2, ToEnd : Integer;
begin
{Enquanto Starpos ñ for igual a Starpos2, é porquê ñ procurou em todo
o texto, então continuo procurando e marcando as encontradas}
While StartPos <> StartPos2 do
Begin //While Busca
StartPos2 := StartPos;
With Texto do
Begin
If SelLength <> 0 then
StartPos := SelStart + SelLength
else
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundStart := FindText(EditProcuraDe.Text, StartPos, ToEnd, [stWholeWord]);
If FoundStart <> -1 then
Begin
SetFocus;
SelStart := FoundStart;
SelLength := Pos(EditProcuraAte.Text, Text) - Pos(EditProcuraDe.Text, Text);
SelAttributes.Color := clRed; // Colorizo as palavras selecionadas
SelAttributes.Style := [fsBold]; // Altera para negrito o style
RichEditPROCURA.Lines.Add(´´);
RichEditPROCURA.Lines.Add(SelText);
RichEditPROCURA.Lines.Add(´Nº de caracteres selecionados: ´+IntToStr(Length(SelText)));
end;
end; //Fim do while
Keybd_event(VK_CONTROL,0,KEYEVENTF_EXTENDEDKEY or 0,0);
{Simulo o pressionar da tecla home }
Keybd_event(VK_HOME,0,0,0);
{"Solto" a tecla Control}
Keybd_event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;
end;O [color=red:2386dd2d52]problema[/color:2386dd2d52] é que no 1º resultado, ele é localizado corretamente.
O porém é que gostaria de saber como o TRichEdit funciona porque andei testando este código:
showmessage(inttostr(Pos(RichEditBACKUP.SelText, RichEditBACKUP.Text)));
Apenas seleciono a palavra que eu quero, clico no TButton que contém este código para que me mostre a posição da palavra no TRichEdit.
Até então tudo ok, mas quando eu seleciono outra palavra igual a esta o mesmo número de posição mostrado anteriormente aparece na outra palvra.
Uma conclusão rápida: ´Uma palavra sempre irá ter a mesma [b:2386dd2d52]número[/b:2386dd2d52] de posição?!´
Isto que preciso saber, porque sempre nas demais consultas utilzando a função todas os resultados são mostrados com o número de caracteres da 1ª consulta, exemplo:
FIZ a mesma consulta quero que me mostre TUDO que estiver dentro de CREATE TABLE e ENGINE
Resultado:
Total de 107 caracteres.
1ª Consulta OK!
Passa para próxima:
Total de 107 caracteres.
Não mostrou todo o resultado.
E assim permanece por toda a consulta, compreendeu?
Se puder analizar meu código da função, aonde estou errando agradeço.
Mais uma vez, muito obrigado pela sua atenção.
Gostei + 0
05/01/2009
Dbergkamps10
Olá,
No caso da string ´CREATE TABLE´, sim pq ele está no inicio. Mas a string ´)ENGINE´, pelo que eu vi, não irá ter a mesma posição.
Pense na posição como a ´casa´ que cada caracter ocupa dentro do RichEdit.
Espero ter ajudado.
Att
Dalton
Gostei + 0
30/01/2009
Delutto
Como acabo de resolver o meu problema, resolvi voltar aqui e me registrar no forum para poder deixar uma solução um tanto simples encontrada por mim:
begin RichEdit1.SelStart:=pos(´Frase Inicial´,RichEdit1.Text)+13;// 13 é Número de caracteres da palavra RichEdit1.SelEnd := pos(´Frase Final´,RichEdit1.Text) - 11; //11 é Número de caracteres da palavra RichEdit2.Text := Rich1.SelText; end;
Gostei + 0
30/01/2009
Delutto
Abraços.
Gostei + 0
30/01/2009
Devmedia
begin RichEdit1.SelStart:=pos(´Frase Inicial´,RichEdit1.Text)+13;// 13 é Número de caracteres da palavra RichEdit1.SelEnd := pos(´Frase Final´,RichEdit1.Text) - 11; //11 é Número de caracteres da palavra RichEdit2.Text := Rich1.SelText; end;
Olá delutto!
Estou em desenvolvimento de um sistema e por isso não voltei nesse problema até hoje.
Não estou podendo testar seu código, porque aqui no Delphi 2009 - Update II o componente RichEdit não possui esta classe [b:aae5f7adb7]SelEnd[/b:aae5f7adb7]
Poderiamos debater mais sobre esse assunto?
Meu msn: lucascronos@msn.com
Gostei + 0
10/02/2009
Devmedia
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)