Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

seleccionar del TMemo

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: seleccionar del TMemo Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Encontrar una palabra en TMemo Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: me funciona Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Encontrar la línea Responder citando

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. Razz
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Te cuento Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Probando 1, 2, 3... Responder citando

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 Smile

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.