| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Mie 06 Ago, 2003 4:14 pm Asunto: seleccionar del TMemo |
|
|
Me gustaría saber buscar en un TMemo una palabra , saber en que línea está y seleccionar la linea para poder copiarla.
Gracias |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 07 Ago, 2003 8:56 am Asunto: Encontrar una palabra en TMemo |
|
|
Se me ocurre lo siguiente, aprovechando la propiedad Text, poniendo el código por ejemplo en un evento OnExit de un TEdit:
| Código: | void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
int nPos = 0;
AnsiString cPalabra = "";
if (!Edit1->Text.IsEmpty())
{
cPalabra = Edit1->Text;
if ((nPos = Memo1->Text.Pos(cPalabra))>0)
{
<Código según condición>
}
else
ShowMessage("No encontré " + Edit1->Text);
}
} |
Con esto encontrarías la palabra que pusieras en un TEdit dentro del TMemo, si existiera. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Jue 07 Ago, 2003 1:10 pm Asunto: me funciona |
|
|
Funciona perfectamente pero cómo se en que línea se encuentra??
ya que luego quiero coger todo lo que se encuentra en esa linea y creo que se hace mediante la función "Trim".
Gracias Angel
Saludo2 |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Jue 07 Ago, 2003 1:53 pm Asunto: |
|
|
Tal vez contando los "\n" (bajada de linea) que hay hasta la posicion donde esta la palabra. La linea termina en el "\n" siguiente. (en realidad son dos caractares los que dan la bajada de linea. No recuerdo en este momento cual es el otro).
La funcion Trim() es para sacar los espacios en blanco al comienzo y final de una cadena de texto.
saludos |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 08 Ago, 2003 7:10 am Asunto: Encontrar la línea |
|
|
Vale. No ha bía entendido la pregunta completa. Par bsucar la línea no te vale la función Trim, que se limita a elminar los espacios delante y detrás de la cadena. Prueba esto, que es lo que sugiere Diego:
| Código: | void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
int nPos, nIni, nFin;
AnsiString cPalabra, cLinea;
if (!Edit1->Text.IsEmpty())
{
cPalabra = Edit1->Text;
// Con esto miramos si está la palabra
if ((nPos = Memo1->Text.Pos(cPalabra)) != 0)
{
// Buscamos el salto de línea antes
nIni = (Memo1->Text.SubString(1, nPos)).LastDelimiter("\n");
// Buscamos el salto de línea después
nFin = (Memo1->Text.SubString(nPos, 1500)).Pos("\n");
// Cadena resultado
cLinea = Memo1->Text.SubString(nIni + 1, nFin - Ini - 1);
}
}
} |
Lo del 1500 en el cálculo de nFin es por dar un margen ampli. Puedes sustuirlo, si quieres, por la longitud total de la cadena poniendo Memo1->Text.Length() en lugar de una cifra
Prueba a ver, que me parece que esto sí debe funcionar.  _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Vie 08 Ago, 2003 10:19 am Asunto: Te cuento |
|
|
Gracias por la respuesta al Diego y a tí,
Estoy mirando el código y en las últimas líneas en cadena resultado, el cLinea no me da ningún valor, me da en blanco, los otros me dan valores pero el último no. Voy a seguir mirando...
Muchas gracias
Saludo2 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 08 Ago, 2003 10:30 am Asunto: |
|
|
Evidentemente, y eso se me olvidó ponerlo en el código, si las variables son iguales no hay nada que sacar, y esto puede pasar por ser otro el carácter de final de línea. Con ese control el código sería este:
| Código: | void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
int nPos, nIni, nFin;
AnsiString cPalabra, cLinea;
if (!Edit1->Text.IsEmpty())
{
cPalabra = Edit1->Text;
// Con esto miramos si está la palabra
if ((nPos = Memo1->Text.Pos(cPalabra)) != 0)
{
// Buscamos el salto de línea antes
nIni = (Memo1->Text.SubString(1, nPos)).LastDelimiter("\n");
// Buscamos el salto de línea después
nFin = (Memo1->Text.SubString(nPos, 1500)).Pos("\n");
// Cadena resultado
if (nIni < nFin)
cLinea = Memo1->Text.SubString(nIni + 1, nFin - Ini - 1);
}
}
} |
Se usan dos: \n para nueva línea y \r para retorno de carro. A lo mejor tienes que buscar otro diferente. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Vie 08 Ago, 2003 11:53 am Asunto: |
|
|
Vamos a ver que te parece esto, y si se puede ajustar, ya que puede darme la línea, o darme una por encima o una por debajo.
He puesto 3 Edit y el memo.
Entoces lo que hace es ir sumando la longitud de cada línea hasta que sobrepase donde se encuentra la palabra a buscar (nPos). y luego le resto 1, pero la pega es la comentada, puedo acertar y también fallar por 1.
En el evento OnExit de uno de ellos:
int nPos;
cPalabra ="*********";
// Con esto miramos si está la palabra
if ((nPos = Memo5->Text.Pos(cPalabra)) != 0)
{
int i,b,total;
Edit3->Text=0;
for(i=0;i<=Memo5->Lines->Count;i++){
int a=Edit3->Text.ToInt();
if(a>=nPos){Edit7->Text=i-1;goto fin;};
b=Memo5->Lines->Strings[i].Length();
total=a+b;Edit3->Text=total;}
fin:; |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Vie 08 Ago, 2003 12:11 pm Asunto: |
|
|
hola, basandome en el ejemplo de Angel hice algunas modificaciones para encontrar en que linea esta: | Código: | void __fastcall TForm1::Button2Click(TObject *Sender)
{
int nPos, nIni, nFin;
AnsiString cPalabra, cLinea;
if (!Edit1->Text.IsEmpty())
{
cPalabra = Edit1->Text; //palabra a buscar
// Con esto miramos si está la palabra
if ((nPos = Memo1->Text.Pos(cPalabra)) != 0)
{
// Buscamos el salto de línea antes de la palabra
nIni = (Memo1->Text.SubString(1,nPos)).LastDelimiter("\r\n");
// Buscamos la cantidad de saltos de lineas para saber en que linea esta.
int nLineas = 1;
nPos = 0;
char coco[2];
while (nPos < nIni)
{
strcpy(coco, Memo1->Text.SubString(nPos, 2).c_str());
if (coco[0] == 0x0D && coco[1] == 0x0A ) //"\r" y "\n" respectivamente
{
nLineas++;
nPos++;
}
nPos++;
}
Edit2->Text = nLineas; //mostramos en que linea esta
}
}
} |
Para seleccionar el texto no se me ocurre como hacerlo. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 08 Ago, 2003 12:22 pm Asunto: Probando 1, 2, 3... |
|
|
He probado mi propio código (reconozco que lo he puesto de cabeza) con un proyecto con un TMemo, dos TEdit y un botón, y he conseguido que funcione así:
| Código: | void __fastcall TForm1::FormActivate(TObject *Sender)
{
Memo1->Text = "Estás recibiendo este email debido a que\r\n";
Memo1->Text = Memo1->Text + "estás revisando el tópico, seleccionar del TMemo\r\n";
Memo1->Text = Memo1->Text + "en . Este tópico ha recibido una respuesta desde\r\n";
Memo1->Text = Memo1->Text + "tu última visita. Puedes usar el link provisto\r\n";
Memo1->Text = Memo1->Text + "para ver estas respuestas, no se te enviarán más\r\n";
Memo1->Text = Memo1->Text + "emails hasta que visites el tópico.";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int nPos, nIni, nFin;
AnsiString cTexto;
cTexto = StringReplace(Memo1->Text, "\r", "", TReplaceFlags() << rfReplaceAll);
if (!Edit1->Text.IsEmpty())
if ((nPos = cTexto.Pos(Edit1->Text)) != 0)
{
nIni = (cTexto.SubString(1, nPos)).LastDelimiter("\n") + 1;
nFin = (cTexto.SubString(nIni, cTexto.Length())).Pos("\n") - 1;
if (nFin < 1)
nFin = cTexto.Length();
Edit2->Text = cTexto.SubString(nIni, nFin);
}
}
//--------------------------------------------------------------------------- |
He cargado el TMemo con el texto de un email
Lo priemro que hago es eliminar los posibles \r que pudiera haber (StringReplace). Luego busco la palabra (nPos) y una vez localizada busco el salto de línea anterior (nIni); para sacar el siguiente empiezo desde esa posición, y el valor que me da es la longitud de la línea (nFin).
El segundo Edit lo he puesto para probar que sale bien. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Vie 08 Ago, 2003 12:33 pm Asunto: |
|
|
Angel, a mi me funciona bien. No habia entendido bien. Pense que solo hacia falta el numero de lineas y seleccionar el texto (me parecia raro tu codigo por ese motivo jeje).
saludos
diego |
|
| Volver arriba |
|
 |
|