PDA

Ver la Versión Completa : Busqueda de texto


Gerson12
27-07-2012, 06:10:59
hola amigos de clubdelphi vengo a expresarles una duda que tengo ya que la verdad estoy aprendiendo mucho de este foro y gran ayuda de un amigo ,bueno vamos al grano lo que quiero hacer es una aplicación que busque textos que se le pondra en un edit y el texto sera buscado en un memo pero lo que me crea dificultad es que quiero que el edit solo sea una parte del texto a buscar ahora les dejare un ejemplo.

Ejemplo:
http://www.uploadimagen.com/images/521jpg.jpg

como dije quiero que el edit sea solo una parte de texto a seleccionar pero lo malo es quiero que 'file:' y'exe' sean como textos predeterminados de busqueda


Gracias
Espero que me hayan entendido eh echo lo mejor posible para q me entiendan gracias

roman
27-07-2012, 06:19:42
No estoy seguro de entender pero vamos a ver. Si quieres buscar lo que está en el edit dentro del memo, sólo tendrías que poner:


Start := Pos(Edit.Text, Memo.Text);
if Start > 0 then
begin
Memo.SelStart := Start;
Memo.SelLength := Length(Edit.Text);
end;


Pero si quieres buscar el texto del edit pero sólo si está con el texto predeterminado, puedes concatenar dicho texto al momento de buscar:



Start := Pos('file:' + Edit.Text + '.exe', Memo.Text);
if Start > 0 then
begin
Memo.SelStart := Start + Length('file:');
Memo.SelLength := Length(Edit.Text);
end;


// Saludos

Gerson12
27-07-2012, 06:30:13
No estoy seguro de entender pero vamos a ver. Si quieres buscar lo que está en el edit dentro del memo, sólo tendrías que poner:


Start := Pos(Edit.Text, Memo.Text);
if Start > 0 then
begin
Memo.SelStart := Start;
Memo.SelLength := Length(Edit.Text);
end;


Pero si quieres buscar el texto del edit pero sólo si está con el texto predeterminado, puedes concatenar dicho texto al momento de buscar:



Start := Pos('file:' + Edit.Text + '.exe', Memo.Text);
if Start > 0 then
begin
Memo.SelStart := Start + Length('file:');
Memo.SelLength := Length(Edit.Text);
end;


// Saludos

gracias por la respuesta lo provare pero antes disculpame pero otra pregunta
como haria para agregar a otro memo el texto seleccionado por la busqueda

roman
27-07-2012, 06:59:02
Podrías agregarlo como una nueva línea:


OtroMemo.Lines.Add(Edit.Text);


// Saludos

Gerson12
27-07-2012, 07:01:34
roman disculpa pero el codigo q me enseñas no me soombrea todo lo q quiero solo me sombre lo q esta en el edit lo q yo quiero es sobrear todo incluyendo file: y .exe

José Luis Garcí
27-07-2012, 09:13:33
Gerson12, si lo que vas a introducir es la ruta completa, tendrias que modificar sólo al código que te expuso Román lo siguiente
Start := Pos('file:' + Edit.Text + '.exe', Memo.Text);
if Start > 0 then
begin
Memo.SelStart := Start + Length('file:');
Memo.SelLength := Length('File:'+Edit.Text+'.exe');
end;


En caso contrario te indico que es mejor que crees un tabla en memoria carges los datos y busques con un like en Sql.

Esper te sirva de algo la ayuda

roman
27-07-2012, 16:18:20
roman disculpa pero el codigo q me enseñas no me soombrea todo lo q quiero solo me sombre lo q esta en el edit lo q yo quiero es sobrear todo incluyendo file: y .exe

Pues es que así lo tienes en la imagen que pusiste ;) Si quieres sombrear todo entonces así:


Start := Pos('file:' + Edit.Text + '.exe', Memo.Text);
if Start > 0 then
begin
Memo.SelStart := Start;
Memo.SelLength := Length('file:' + Edit.Text + '.exe');
end;


// Saludos

Gerson12
28-07-2012, 07:15:41
Pues es que así lo tienes en la imagen que pusiste ;) Si quieres sombrear todo entonces así:


Start := Pos('file:' + Edit.Text + '.exe', Memo.Text);
if Start > 0 then
begin
Memo.SelStart := Start;
Memo.SelLength := Length('file:' + Edit.Text + '.exe');
end;


// Saludos

bueno gracias por sus respuesta pero como les dije anterior mente quiero q seleccione todo no solo una parte les dejo mi codigo
procedure TForm1.Button1Click(Sender: TObject);
var
hotkey:integer;
begin
hotkey:=Pos('https://www'+Edit1.Text+'.com.pe',memo1.Text);
if hotkey>0 then
Memo1.SelStart := hotkey;
Memo1.SelLength := Length('https://www'+Edit1.Text+'.com.pe');
Memo1.SetFocus;
end;
end.
else
begin
ShowMessage ('no se encontro nada');

ecfisa
28-07-2012, 08:43:39
Hola Gerson12.

A ver si entendí lo que buscas...

Supongamos que en Edit tenemos el texto:
Un_Nombre_De_Pagina
En el Memo el siguiente texto:

...
bla, bla, bla ...
bla, bla, ... https://www.Un_Nombre_De_Pagina.com.pe , bla, ..., etc
bla,bla,bla
...

Y queres que quede seleccionada la cadena "https://www.Un_Nombre_De_Pagina.com.pe".

Si no me equivoque, creo que podrías hacer:

procedure TForm1.Button1Click(Sender: TObject);
var
pd, ph: Integer;
begin
pd:= Pos('https://www.' + Edit1.Text + '.com.pe', Memo1.Text);
if pd > 0 then
begin
ph:= pd;
Memo1.SelStart:= ph-1;
while not(Memo1.Text[ph] in [#13,' ']) and (ph < Length(Memo1.Text)) do
inc(ph);
Memo1.SelLength:= ph - pd;
Memo1.SetFocus;
end;
end;


Saludos.

Gerson12
28-07-2012, 08:50:21
hola gracias por responder pero el problema q tengo es q este mira en la imagen
http://www.uploadimagen.com/images/961prueba.jpg
me selecciona la pagina google y todo pero tambien selecciona otra partes mas eso es lo q yo no quiero
Pd: quiero q esta accion se haga varias veces para busque las paginas y las agrege a un memo

ecfisa
28-07-2012, 09:10:50
Hola.

Tenes razón... entonces proba de este modo:


procedure TForm1.Button1Click(Sender: TObject);
var
p: Integer;
begin
p:= Pos('https://www.' + Edit1.Text + '.com.pe', Memo1.Text);
if p > 0 then
begin
Memo1.SelStart:= p - 1;
Memo1.SelLength:= Length('https://www.' + Edit1.Text + '.com.pe');
Memo1.SetFocus;
end;
end;

Pero es claro que a menos que utilices variables en su lugar, siempre estarás limitado a buscar cadenas con el contenido 'https://www.' y '.com.pe'.

Saludos.

Gerson12
28-07-2012, 15:18:21
gracias eficsa me salvastes era y disculpa me pudrieses decir como puedo hacer para q no solo seleccione a 1 sino a todos los textos buscados en este caso https.//www.google.com.pe en este caso pondre y paginas iguales a https.//www.google.com.pe y quiero q me seleccione todas y esas paginas me las agrege a un memo si no es mucha molesta me seria de mucha ayuda tu opinion gracias
Pd: a pero estoy usando variables en el codigo o a q te refieres con tu recomendacion:
Pero es claro que a menos que utilices variables en su lugar, siempre estarás limitado a buscar cadenas con el contenido 'https://www.' y '.com.pe'.

ecfisa
28-07-2012, 17:51:16
Hola Gerson12.

Pd: a pero estoy usando variables en el codigo o a q te refieres con tu recomendacion:
Un ejemplo:

procedure TForm1.SeleccionarTexto(const Prefijo, Texto, Sufijo: string);
var
p: Integer;
begin
p:= Pos(Prefijo + Texto + Sufijo, Memo1.Text);
if p > 0 then
begin
Memo1.SelStart:= p - 1;
Memo1.SelLength:= Length(Prefijo + Texto + Sufijo);
Memo1.SetFocus;
end;
end;


Llamada:

procedure TForm1.Button1Click(Sender: TObject);
begin
SeleccionarTexto('https://www.', Edit1.Text, '.com.pe');
end;

De ese modo si deseas buscar 'www.', '.com', '.com.es', etc, el procedimiento funcionará igual.

Saludos.

------------------------
Edito: Te pongo otro ejemplo que creo, deja mas en claro la flexibilidad de este modo:

SeleccionarTexto(edPrefijo.Text, edTexto.Text, edSufijo.Text);

Gerson12
29-07-2012, 01:41:44
ah te referias a eso gracias creia q era otra cosa ^^ porfa ayudame en esta ultima duda porfa
me pudrieses decir como puedo hacer para q no solo seleccione a 1 sino a todos los textos buscados en este caso https.//www.google.com.pe en este caso pondre y paginas iguales a https.//www.google.com.pe y quiero q me seleccione todas y esas paginas me las agrege a un memo

ecfisa
29-07-2012, 02:17:10
Hola Gerson12.

Ya había leido tu inquietud en el mensaje #12, pero no respondí a ese punto, por que al menos a mi, no se me ocurre como realizar múltiples selecciones de texto en un TMemo del modo que venimos tratando.

Tal vez algún otro compañero conozca o se le ocurra la manera de lograrlo y nos eche un poco de luz. Lamento no poder ayudarte en eso...

Saludos. :)

Gerson12
29-07-2012, 02:22:36
Hola Gerson12.

Ya había leido tu inquietud en el mensaje #12, pero no respondí a ese punto, por que al menos a mi, no se me ocurre como realizar múltiples selecciones de texto en un TMemo del modo que venimos tratando.

Tal vez algún otro compañero conozca o se le ocurra la manera de lograrlo y nos eche un poco de luz. Lamento no poder ayudarte en eso...

Saludos. :)
:( q lastima gracias entonces seguire buscando en internet algo q me pueda ayudar y gracias y disculpa esta es mi ultima inquietud por q pones el -1 en este codigo
memo1.SelStart:=f-1;
Gracias ^^#:-)#

ecfisa
29-07-2012, 02:58:57
por q pones el -1 en este codigo
Hola Gerson12.

Por que la función Pos devuelve la posición del primer caracter de un string comenzando por la posición 1, pero la propiedad SelStart determina el primer caracter seleccionado a partir de la posición 0.

Saludos.

Gerson12
29-07-2012, 03:34:34
gracias ^^ les agradesco mucho roman,eficsa,[José Luis Garcí] gracias a todos ^^

Gerson12
31-07-2012, 02:30:08
hola amigos quisiera hacerles una pregunta es que segun eh visto por internet se puede obtener un texto de un memo supongamos que en el el texto esta escrito esto:
gfdg
df
gdf
g
dfgdfgdfg
holaamigosclubdelphi
dsf
sdfsdfsdfsdfsdf
sdfdsholaamigosclubdelphi
como veran yo quiero que el texto que dice'holaamigosclubdelphi' eso me obtenga y salga en otro memo
es posible hacer eso ¿?


Estuve averiguando y segun parece se tiene que usar settext o gettex pero realmente estoy confundido

roman
31-07-2012, 02:41:33
Bueno, realmente esto ya lo preguntaste y se te respondió en el otro hilo (http://clubdelphi.com/foros/showthread.php?p=438419#post438419). Detente a estudiar un poco las respuestas que te dimos para que aprendas a aplicar la técnica en este y otros casos.

//Saludos

Gerson12
31-07-2012, 02:51:50
hola Roman pero lo que yo pregunte en el hilo pasado fue para hacer una busqueda o puede ser similar al otro hilo ¿? y q es get text(ya se q es obtener text xD) pero aparte como puedo usar un get text eso mas me interesa saber

roman
31-07-2012, 03:05:11
Pues para encontrar el texto que dices tienes precisamente que hacer una búsqyeda, o sea, lo mismo que en el hilo anterior. No veo que relación pueda tener eso con GetText o SetText.

// Saludos

Gerson12
31-07-2012, 03:10:15
pero yo quiero q lo buscado se agrege a otro memo diferente

roman
31-07-2012, 03:36:01
Eso también lo preguntaste en el otro hilo

gracias por la respuesta lo provare pero antes disculpame pero otra pregunta
como haria para agregar a otro memo el texto seleccionado por la busqueda

y también te contesté

Podrías agregarlo como una nueva línea:


OtroMemo.Lines.Add(Edit.Text);


// Saludos


// Saludos

Gerson12
31-07-2012, 03:40:30
ya gracias disculpa por las molestias la verdad recien entendi a q te referias si crees necesario borrar el tema haslo y disculpa :(

Casimiro Notevi
31-07-2012, 09:38:52
He combinado ambos hilos porque es lo mismo.

Gerson12, si tienes dudas y no lo tienes claro entonces sigue con el mismo hilo, vuelve a preguntar, explica lo que no entiendes y se continua hasta que lo entiendas y lo resuelvas, pero abrir otro hilo no sirve de nada, salvo para dispersar la información.

Así que no hay problema, si no lo tienes claro, ya sabes, pregunta, que se te responderá. ( Para eso nos pagan :D )

roman
31-07-2012, 16:47:34
No lo digas ni en broma, que hay algunos que exigen como si realmente nos pagaran :D

Yo lo que le recomendaría a Gerson, es que trate de entender las respuestas que se le dan en lugar de sólo aplicarlas en su sódigo. De esta manera podrá usarlas en otras partes y no sólo en el problema que origina la pregunta.

// Saludos

Casimiro Notevi
31-07-2012, 17:56:23
... que trate de entender las respuestas que se le dan en lugar de sólo aplicarlas en su sódigo

por supuesto, así tiene que ser si se quiere aprender ^\||/

roman
31-07-2012, 17:59:30
Eso mismo!

// Saludos

ecfisa
31-07-2012, 18:58:00
Hola.

En defensa de Gerson12, voy a decir que, aunque no identifico los temas como similares, se preocupo por consultar antes de de abrir un nuevo hilo.

Mensaje privado:

FW: consulta si puedo abrir un nuevo tema ?
Cita:
Empezado por Gerson12
hola amigo quisiera hacerte una consulta es que te recuerdas de la consulta q hize anteriormente en el foro pero no se si esta permitido abrir un nuevo tema despues de de haber recibido ayuda de otro tema distinto es q necesito abrir un tema gracias por tu atencion
Discupe por la redundancia
--------------------------------
Hola Gerson12.

No hay ningún problema en que abras un nuevo hilo, es lo correcto si el tema es diferente.

Lo que no corresponde es abrir varios hilos haciendo una consulta similar o la misma. Si es la misma o está intimamente relacionada, lo correcto es ponerla en el hilo ya creado.

Podes crear todos los hilos que desees sobre las diferentes dudas que tengas. Y realmente espero que encuentres la ayuda necesaria en cada uno de ellos.

Saludos.

Indudablemente no me expresé lo suficientemente claro o no supo interpretarme, pero lo cierto es que no hubo desinterés de su parte.

Saludos. :)

roman
31-07-2012, 19:04:28
Sí, tienes razón. En realidad, no veo tanto problema en haber abierto un nuevo hilo. Lo que percibí -y es lo que le comento- es que es importante tratar de entender las soluciones que le den pues así el mismo habría notdo que no era necesario.

// Saludos

Casimiro Notevi
31-07-2012, 19:26:19
Vaya, queda claro :)

Gerson12
01-08-2012, 06:16:12
gracias eficsa ^^ entonces ya vere la manera de encontrar solucion roman gracias roman lo q me dijistes de tu respuesta de comoa gregar lo buscado eso no era lo q tenia en mente pero bueno seguire buscando en san google gracias a todos
y gracias eficsa por tu defensa

roman
01-08-2012, 07:12:15
roman lo q me dijistes de tu respuesta de comoa gregar lo buscado eso no era lo q tenia en mente pero bueno seguire buscando

Y ¿por qué no nos dices qué es lo que tenías en mente?

// Saludos

Casimiro Notevi
01-08-2012, 09:21:39
gracias eficsa ^^ entonces ya vere la manera de encontrar solucion roman gracias roman lo q me dijistes de tu respuesta de comoa gregar lo buscado eso no era lo q tenia en mente pero bueno seguire buscando en san google gracias a todos
y gracias eficsa por tu defensa

Es que no somos adivinos, por eso hace falta que nos expliques claramente qué es lo que buscas.

Y en cuanto a la defensa... no veo que te hayan atacado ;)

ecfisa
01-08-2012, 16:11:09
Hola.

Bueno parece que en este hilo me la paso aclarando... :D

Cuando usé la estereotipada y tal vez poco acertada frase : "En defensa de ..." mi intención fue poner de manifiesto el interés de Gerson12 por observar las normas, pero bajo ningún punto de vista por que hubiera visto un "ataque" hacia él.

Ya clarificado el punto, sólo nos queda esperar a que Gerson12 nos explique lo más detalladamente posible que es lo que en realidad desea hacer..

Un justificado saludo.:)

Casimiro Notevi
01-08-2012, 16:26:42
Otra aclaración: :D
Sí, te había entendido :)

roman
01-08-2012, 16:57:59
Sí, yo también te había entendido. Y sí, en este hilo hay más aclaraciones que cosas que aclarar. :D

// Saludos

Gerson12
02-08-2012, 05:13:26
creo que me veo como un tonto :(

Tratare de explicarme lo mejor posible
lo q quiero hacer
es una aplicaccion q obtenga texto de un memo y ese texto obtenido lo agregue a un listbox
les dare un ejemplo
supongamos q este texto esta en el memo1:
petronilarodolfopetronilarodolfopetronilarodolfo
petronilarodolfopetronilarodolfopetronilarodolfo
petronilarodolfopetronilarodolfopetronilarodolfo
petronilarodolfopetronilarodolfopetronilarodolfo
petronilarodolfopetronilahttp://www.remusica.bizrodolfopetronilarodolfodsfsdfsdf
dpetronilarodolfo
efsdfdspetronilhttp://www.otraweb1.bizarodolfopetronilarodolfo
dsfsdfsdfsdf
sdsf
ds
f
dsfdsfdsfhttp://www.otraweb2.biz

ahora que al presionar el boton1 me agregue los textos q estan dentro es este parametro 'http://'( agregar texto que estee dentro de estos dos )'.biz':
espero q esta ves me hayan entendido y si cumpen si pregunto demasiado =( y roman gracias por tu consejo me guie de una respuesta para otra cosa pero la verdad que como dije antes se poco pero me gustaria aprender mas viendo sus respuesta de ayuda gracias espero que esta ves me entiendan si puedo mas tarde pongo una imagen ya q no tengo delphi ahora .
PD:destino a donde se agregaran los textos extraidos seran un listobox.
Chau!

ecfisa
02-08-2012, 09:26:01
Hola Gerson12.

Ahora creo haber entendido lo que buscas... Es copiar desde un TMemo hacia un TListBox, todos aquellos términos que comiencen en una cadena inicial A y otra final B incluyendo los caracteres que existan en el medio sin importar cuales sea.

Entonces podrías hacer:

...
uses StrUtils;

procedure Cargar(aMemo: TMemo; const Sufijo, Prefijo: string; TS: TStrings);
var
p1, p2: Integer;
begin
p2:=1;
repeat
p1:= PosEx(Sufijo, aMemo.Text, p2);
p2:= PosEx(Prefijo, aMemo.Text, p1+1);
if p1 <> 0 then
TS.Add(Copy(aMemo.Text, p1, p2-p1 + Length(Prefijo)));
until (p1 = 0)or(p1 > p2);
end;


Llamada de ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
Cargar(Memo1, 'http://www.', '.biz', ListBox1.Items);
end;

Tomando como ejemplo el téxto de tu mensaje anterior, en ListBox1 obtendríamos:

http://www.remusica.biz
http://www.otraweb1.biz
http://www.otraweb2.biz


Saludos. :)

Gerson12
05-08-2012, 20:55:43
muchas gracias eficsa ^^ me salvastes y gracias a todos por su intencion de ayudar