Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Parrafos de un Memo (https://www.clubdelphi.com/foros/showthread.php?t=79165)

sac 13-06-2012 02:19:42

Parrafos de un Memo
 
Hola gente quería saber si alguno me puede guiar en algo que al principio parecia sencillo.
necesito cargar un txt en un memo pero necesito que al hacer un click sobre un párrafo cualquiera de ese txt, éste se vea en otro memo. Solamente el párrafo seleccionado no se si soy claro.
Desde ya gracias.

Lepe 13-06-2012 09:12:52

Un memo no tiene párrafos.

Se entiende "párrafo" como un texto con etiquetas "paragraph" típicamente usadas en RichEdits.

Para simular algo así, tendrás que buscar los caracteres #13 (salto de carro) y #10 (salto de línea) que normalmente vienen como #13#10 (ó $D$A en Hexadecimal, que seguro lo has visto en el depurador de Delphi). Puedes usar la función PosEx para buscar la primera ocurrencia y la siguiente de esos caracteres.

Es lo único que se me ocurre, a ver si alguien aporta algo mejor.

Saludos

Casimiro Noteví 13-06-2012 11:05:33

Si es un memo "normal y corriente" entonces seguramente tendrá el $D$A en cada línea, por lo que habría que saber cómo es el texto que se va a procesar, lo mismo cada "párrafo" (en esta ocasión) tiene 2 saltos de línea (por decir algo) y entonces con buscar $D$A$D$A ya podría servir.
Digo yo, haría falta ver un ejemplo.

ecfisa 13-06-2012 14:09:50

Hola sac .

Como te menciona Lepe, el concepto de parrafo no se lleva bién con el TMemo.

No sé si te sirva captuar el mensaje EM_CHARFROMPOS y empezar a retroceder columnas y filas e intentar encontrar la secuencia CRLF inicial para tomar la cadena comprendida hasta la próxima. Según tengo entendido los saltos de línea no son almacenados en el buffer de texto del TMemo.

Algo que se me ocurre es considerar en el Memo1 cada línea como un párrafo.

Un ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('C:\ARCHIVO.TXT');
  Memo1.WordWrap:= False; // (una línea es un párrafo)
end;

procedure TForm1.Memo1Click(Sender: TObject);
begin
  Memo2.Lines.Add(Memo1.Lines[SendMessage(memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0)]);
end;

Saludos.

sac 14-06-2012 02:54:47

Probando
 
Mmm está complicado no? Estoy probando lo que me aconsejaron.
Lo otro sería usar un archivo PowerPoint ver todas las diapositivas y cada diapositiva que se cliquea que aparezca en un memo pero obviamente creo que esto debe ser el doble de complicado. Sigo intentando.

Casimiro Noteví 14-06-2012 09:37:18

Cita:

Empezado por sac (Mensaje 435034)
Mmm está complicado no?

No, no es que esté complicado, es que no tenemos el fichero para poder probar :)
Además de que no nos explicas los resultados de las pruebas que se te han comentado.

Y no sé a qué viene lo del powerpoint y diapositivas, ¿Pero de qué estamos hablando? :confused:

Como se dice hoy en día, nos falta feedback por tu parte ;)

roman 14-06-2012 18:55:32

No me queda claro eso de que los Memo no se llevan con los párrafos. Si en una hoja impresa hay párrafos, ¿cómo no los va a haber en un archivo de texto?

Para mi, un doble salto de línea ($0D$0A$0D$0A en Windows) marca el final de un párrafo.

Aquí una rutina para extrer el párrafo actual de un Memo. Seguro hay algún detalle que revisar.

Código Delphi [-]
uses StrUtils;

procedure ExtraeParrafo(Memo: TMemo; Parrafo: TStrings);
var
  S: String;
  I, A, B: Integer;

begin
  // Encontrar el final del párrafo
  S := Memo.Text;
  I := Memo.SelStart;
  B := PosEx(#$D#$A#$D#$A, S, I);

  if B = 0 then B := Length(S);

  // Encontrar el comienzo del párrafo
  S := ReverseString(S);
  I := Length(S) - (I + 1);
  A := PosEx(#$A#$D#$A#$D, S, I);

  if A > 0 then A := Length(S) - A;

  Parrafo.Text := Copy(Memo.Text, A, B - A);
end;

Ejemplo de uso:

Código Delphi [-]
// Extrae el párrafo actual de Memo1 y lo pone en Memo2
ExtraeParrafo(Memo1, Memo2.Lines);

// Saludos

ecfisa 15-06-2012 04:25:35

Cita:

Para mi, un doble salto de línea ($0D$0A$0D$0A en Windows) marca el final de un párrafo.
Recién me desayuno con el doble salto de línea :eek:. ¡Con razón no podía detectar el #$D#$A como CRLF !... :o


Saludos. :)

sac 18-06-2012 18:19:54

No puedo correr ese código Roman.
 
Trate de correr el código de Roman con mi delphi 7 pero no reconoce la sintaxis en las lineas del Reversestring y posex... creo que tendría que funcionar perono puedo correrlo.

roman 18-06-2012 18:40:08

¿Qué significa que no reconozca la sintaxis? ¿Qué error te marca? ¿Incluiste la unidad StrUtils en el uses?

// Saludos

sac 20-06-2012 01:17:46

Roman perdona la ignorancia jeje. Me había olvidado de copiar el StrUtils en el uses asi y todo cuando compilo en la linea del codigo del procedure ExtraeParrafo me da como error Unsatisfied forward or external declaration. A que se puede deber?
Estoy entusiasmado con probarlo porque a priori parece que es lo que necesito.

Casimiro Noteví 20-06-2012 01:38:29

Pon tu código fuente, seguramente no has declarado la función igual que la implementación.

sac 21-06-2012 20:01:38

Gracias
 
Roman compilé el programa y agregué el código para buscar párrafos que subiste y anduvo de mil maravillas. Desde ya muchas gracias, solucionó gran parte de la aplicación que estoy desarrollando.
Nuevamente gracias.


La franja horaria es GMT +2. Ahora son las 09:21:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi