Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Márgenes en componente TRichMemo (https://www.clubdelphi.com/foros/showthread.php?t=96426)

rretamar 05-10-2023 20:01:58

Márgenes en componente TRichMemo
 
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 11:37:15

TRichMemo en Lazarus, en qué paleta está.

rretamar 06-10-2023 17:58:42

Cita:

Empezado por Casimiro Notevi (Mensaje 552848)
TRichMemo en Lazarus, en qué paleta está.

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



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...ent_Formatting

Saludos.

rretamar 15-10-2023 18: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.



Código Delphi [-]
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:

Código Delphi [-]
  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;


La franja horaria es GMT +2. Ahora son las 19:58:44.

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