PDA

Ver la Versión Completa : Parrafos de un Memo


sac
13-06-2012, 02:19:42
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 Notevi
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:

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
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 Notevi
14-06-2012, 09:37:18
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.


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:


// Extrae el párrafo actual de Memo1 y lo pone en Memo2
ExtraeParrafo(Memo1, Memo2.Lines);


// Saludos

ecfisa
15-06-2012, 04:25:35
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
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 Notevi
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
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.