TRichEdit - Selecionar texto dentro de um bloco
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:
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?
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
Curtidas 0
Respostas
Devmedia
22/12/2008
Ninguém :?:
GOSTEI 0
Devmedia
22/12/2008
Ninguém :?:
GOSTEI 0
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:
Assim vc tera o texto selecionado. Pode haver algum problema em relação a mais um ou menos um caracter selecionado.
Att
Dalton
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
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:
Assim vc tera o texto selecionado. Pode haver algum problema em relação a mais um ou menos um caracter selecionado.
Att
Dalton
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
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
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
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
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
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
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:
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
22/12/2008
Me desculpem pela formatação incorreta do código.
Abraços.
Abraços.
GOSTEI 0
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
22/12/2008
Alguém :?: :?: :?:
GOSTEI 0