TRichEdit - Selecionar texto dentro de um bloco

Delphi

22/12/2008

Olá a todos!

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:

-- -- Table structure for table ´auxiliar_clientes_contatos´ -- DROP TABLE IF EXISTS ´auxiliar_clientes_contatos´; CREATE TABLE ´auxiliar_clientes_contatos´ ( ´CODIGO_ID´ int(6) NOT NULL auto_increment, ´CODIGO_ID_CLIENTE´ int(6) default NULL, ´TIPO´ varchar(60) default NULL, ´NUMERO´ varchar(15) default NULL, ´PRINCIPAL´ char(1) default NULL, ´DATA_INSERIDO´ date default NULL, PRIMARY KEY (´CODIGO_ID´) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED; -- -- Dumping data for table ´auxiliar_clientes_contatos´ -- LOCK TABLES ´auxiliar_clientes_contatos´ WRITE; /*!40000 ALTER TABLE ´auxiliar_clientes_contatos´ DISABLE KEYS */; INSERT INTO ´auxiliar_clientes_contatos´ (´CODIGO_ID´, ´CODIGO_ID_CLIENTE´, ´TIPO´, ´NUMERO´, ´PRINCIPAL´, ´DATA_INSERIDO´) VALUES (1,2,´RESIDENCIAL´,´(37) 3281-3206´,´T´,´2008-12-18´); /*!40000 ALTER TABLE ´auxiliar_clientes_contatos´ ENABLE KEYS */; UNLOCK TABLES;


Exemplo oque quero buscar:

De: CREATE TABLE
Até: ) ENGINE

CREATE TABLE ´auxiliar_clientes_contatos´ ( ´CODIGO_ID´ int(6) NOT NULL auto_increment, ´CODIGO_ID_CLIENTE´ int(6) default NULL, ´TIPO´ varchar(60) default NULL, ´NUMERO´ varchar(15) default NULL, ´PRINCIPAL´ char(1) default NULL, ´DATA_INSERIDO´ date default NULL, PRIMARY KEY (´CODIGO_ID´) ) 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

Devmedia

Curtidas 0

Respostas

Devmedia

Devmedia

22/12/2008

Ninguém :?:


GOSTEI 0
Devmedia

Devmedia

22/12/2008

Ninguém :?:


GOSTEI 0
Dbergkamps10

Dbergkamps10

22/12/2008

Olá,
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
Devmedia

Devmedia

22/12/2008

Olá, 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


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
Devmedia

Devmedia

22/12/2008

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
Dbergkamps10

Dbergkamps10

22/12/2008

Olá,
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
Devmedia

Devmedia

22/12/2008

Olá, 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


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:

CREATE TABLE ´agenda´ ( ´CODIGO_ID´ int(6) NOT NULL auto_increment, PRIMARY KEY (´CODIGO_ID´) ) ENGINE


Total de 107 caracteres.
1ª Consulta OK!

Passa para próxima:

CREATE TABLE ´auxiliar_clientes_contatos´ ( ´CODIGO_ID´ int(6) NOT NULL auto_increment, ´CODIGO_ID_CLIE


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
Dbergkamps10

Dbergkamps10

22/12/2008

Uma conclusão rápida: ´Uma palavra sempre irá ter a mesma número de posição?!´

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
Delutto

Delutto

22/12/2008

Olá amigos, agora a pouco passei por esse tópico achado pelo google também com esse mesmo problema.
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
Delutto

Delutto

22/12/2008

Me desculpem pela formatação incorreta do código.
Abraços.


GOSTEI 0
Devmedia

Devmedia

22/12/2008

Olá amigos, agora a pouco passei por esse tópico achado pelo google também com esse mesmo problema. 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;



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
Devmedia

Devmedia

22/12/2008

Alguém :?: :?: :?:


GOSTEI 0
POSTAR