PDA

Ver la Versión Completa : Márgenes en componente TRichMemo


rretamar
05-10-2023, 19:01:58
Hola colegas usuarios de Lazarus.

Tengo la siguiente cuestión con el componente TRichmemo: cuando quiero guardar el contenido a un archivo .rtf el documento tiene un margen alrededor de 1 pulgada, que es demasiado, pero no encuentro la manera dentro del componente de configurar los márgenes. Se que el formato lo admite, porque si abro ese documento o creo uno nuevo con el todopoderoso LibreOffice, puedo configurar los márgenes (inferior, superior, derecho, izquierdo) sin problemas.

Si no puedo resolverlo con alguna propiedad, la única opción que me quedaría es insertar dentro del documento los tags de rtf con los valores de los márgenes antes de guardar a un archivo.

Saludos.

Casimiro Notevi
06-10-2023, 10:37:15
TRichMemo en Lazarus, en qué paleta está.

rretamar
06-10-2023, 16:58:42
TRichMemo en Lazarus, en qué paleta está.

Hola.
Hace rato que uso Codetyphon, está en la paleta "RichText":

http://www.hrservicios.com.ar/imagen.png

Lo de los márgenes está resuelto:

Estuve revisando el componente TKmemo pero a la hora de mostrar los RTF (que tienen cierta complejidad en el contenido, no son sólo texto) tengo ciertos elementos que no se ven correctamente y en el Richmemo sí. Al final lo solucioné agregando las marcas con los valores de los márgenes dentro del contenido del rtf antes de guardar el documento, y funcionó perfecto, por ejemplo un valor de 300 "twips" para los 4 márgenes lo hago insertando estas marcas:

\margl300\margr300\margt300\margb300

Me ayudó mucho el libro "The RTF Cookbook" que está para consultar en línea:

https://metacpan.org/dist/RTF-Writer/view/lib/RTF/Cookbook.pod#Document_Formatting

Saludos.

rretamar
15-10-2023, 17:28:24
El código para agregar los márgenes. Ojo, no agregarlos dentro de la propiedad RTF del componete porque este al guardar como que "limpia" el código rtf y elimina esas marcas. En cambuio lo hago usando una variable intermedia donde guardo el codigo rtf, hago los cambios en esa variable y luego la guardo, funciona perfecto. Los valores de márgenes que utilizo son 500 para los cuatro, queda aproximadamente 1,2 centímetros alrededor.



Function Agregar_Margenes_y_Guardar(Documento: String; MArgenI, MargenD, MargenS, MargenA: Word; Archivo: TFileName): String; // Agregar valore de márgenes a documento RTF en formato string (variable "documento") y guardarlo como archivo
Var
Posi: Longint;
Marca: String;
Fs: TFileStream;
Begin
Result := '';
If FileExists( Archivo ) Then
if Not DeleteFile(Archivo) Then // Por segurodad, borrar archivo RTF previo, si existiera
Begin
MessageDlg('No se pudo eliminar el archivo existente antes de guardarlo: ' + Archivo, mtError, [mbOK, mbCancel], 0);
Exit;
end;
//
Marca:= '\margl' + IntTostr(MargenI) + '\margr' + IntToStr(MargenD) + '\margt' + IntToStr(MargenS) + '\margb' + IntToStr(MargenA); // \margl300\margr300\margt300\margb300
For Posi := Length( Documento ) DownTo 0 Do
If Documento[ Posi ] = '}' Then Break;
//
Insert( Marca, Documento, Posi); // Insertar marcadores con valores de los márgenes
Result := Documento;
//
Fs := TFileStream.Create(Archivo, fmCreate);
try
Fs.Write(PChar(Documento)^, Length(Documento)); // Guardar archvo RTF a partir de la cadena "documento"
except
Result := ''; // Si no se puedo realizar el guardado, devolver una cadena vacia, de lo contrario devolver el texto rtf modificado
end;
Fs.Free;
//
end;

Otro problema que puede aparecer al hacer un "buscar-reemplazar" dentro del códigho RTF del TRichEdit son los caracteres especiales, por el tema del Unicode. Con este código "sucio y desprolijo" :D lo soluciono:

Function Corregir_caracteres( Cadena1: String): String; // corregir caracteres especiales en texto RTF (acentos, eñes)
Begin
Cadena1 := ReplaceStr( Cadena1, 'á','\u225\' ); // Minúsculas
Cadena1 := ReplaceStr( Cadena1, 'é','\u233\' );
Cadena1 := ReplaceStr( Cadena1, 'í','\u237\' );
Cadena1 := ReplaceStr( Cadena1, 'ó','\u243\' );
Cadena1 := ReplaceStr( Cadena1, 'ú','\u250\' );
Cadena1 := ReplaceStr( Cadena1, 'ñ','\u241\' );
//
Cadena1 := ReplaceStr( Cadena1, 'Á','\u193\' ); // Mayúsculas
Cadena1 := ReplaceStr( Cadena1, 'É','\u201\' );
Cadena1 := ReplaceStr( Cadena1, 'Í','\u205\' );
Cadena1 := ReplaceStr( Cadena1, 'Ó','\u211\' );
Cadena1 := ReplaceStr( Cadena1, 'Ñ','\u209\' );
//
Cadena1 := ReplaceStr( Cadena1, '¿','\u191\' ); // Signos
Cadena1 := ReplaceStr( Cadena1, '¡','\u161\' );
//
Corregir_Caracteres := Cadena1;
end;