Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Mantener "formato" del texto en format (https://www.clubdelphi.com/foros/showthread.php?t=91375)

GustavoCruz 19-01-2017 18:21:52

Mantener "formato" del texto en format
 
Hola amigos del foro, tengo un componente RichEdit, sobre el cual cargo una plantilla que está en una tabla, esta plantilla tiene formato cierto tipo de letra, tamaño y algunas parte en negrita, la información la debo completar con algunos datos que el usuario va a tomar

para rellenar los datos faltantes utilizo la función FORMAT, pero esta me devuelve el texto sin formato.

Mi pregunta es cómo hacer para se mantenga el formato original y no tener que volver a formatear el texto.


Mil gracias


Gustavo Cruz

AgustinOrtu 19-01-2017 21:52:33

Como guardas el texto en la tabla? No podes realizar una prueba y verificar que en la tabla efectivamente estes guardando el texto con los tags para el formato RichEdit?

GustavoCruz 19-01-2017 22:17:24

Hola AgustinOrtu gracias por tu respuesta, de hecho el guardado del archivo en la tabla es correcta, lo hace con su formato y todo, el problema es cuando utilizo la función de "format" me devuelvo un texto sin formato alguno... yo cargo esto en en mi richedit tal cual como está almacenado en la tabla:

"Que el estudiante %s identificada con documento de identidad número %s, cursó y aprobó en este centro educativo, el grado de %s de básica primaria durante el año lectivo de %s, de conformidad con la ley 115 de 1994 y el decreto 1290 de 2009 y los criterios definidos en el sistema institucional de evaluación de estudiantes (SIEE) obteniendo las valoraciones finales exigidas para la aprobación al grado %s y promoción al grado %s de %s "

cuando llenos los datos me devuelte esto la función "format"

"Que el estudiante ALMANZA RODRIGUEZ LEONARDO ESTEBAN identificada con documento de identidad número RC 1112099779, cursó y aprobó en este centro educativo, el grado de CUARTO de básica primaria durante el año lectivo de 2016, de conformidad con la ley 115 de 1994 y el decreto 1290 de 2009 y los criterios definidos en el sistema institucional de evaluación de estudiantes (SIEE) obteniendo las valoraciones finales exigidas para la aprobación al grado CUARTO y promoción al grado de BÁSICA SECUNDARIA"

y debería tener en Negrita todas las palabras que están en mayúscula

Gracias por tu colaboración

AgustinOrtu 19-01-2017 22:37:10

No me respondiste la pregunta

GustavoCruz 19-01-2017 22:45:51

Hola AgustinOrtu, la guardo esta manera
Código Delphi [-]
var  
begin 
  try
    ms := TMemoryStream.Create;
    ms.Position := 0;
    Editore.Lines.SaveToStream(ms);
    with fDatos.qEjecutar do
    begin
      Close;
      sql.Clear;
      sql.Add('update or insert into promocion(idematricula, detalle, ' +
        'fechael, algrado, observaciones)values(''' + fGrupo.qCurso.FieldByName
        ('id_ma').AsString + ''', :p1, ''' + dadoel_ + ''', ''' + nom_promo.Text
        + ''', ''' + pro_observaciones.Text + ''')matching(idematricula)');
      ParamByName('p1').DataType := ftBlob;
      ParamByName('p1').LoadFromStream(ms, ftBlob);
      ExecSQL;
      fDatos.Transaccion.CommitRetaining;
      MsgBox(Titulo, 'Datos guardados satisfactoriamente...', mtInformation,
        ['Aceptar'], 0);
      Close;
    end;
  finally
    ms.Free;
  end;

eso me guarda con el formato que le dé en el richedit...

pero la cuestión es: cómo hago para que la función "format" no le quiete el formato al texto cuando lo trago de la base de datos y llene los campos

AgustinOrtu 19-01-2017 23:28:04

La funcion Format no es el problema. El problema es que el RichEdit solo te permite acceder al texto enriquecido manipulando todo a traves de Streams. Del mismo modo que si al guardar el valor en algun lado (ej en una tabla de una base de datos) usaras algo asi

Código Delphi [-]
procedure GuardarTextoRichEdit(RichEdit: TRichEdit);
var
  qry: TQuery/TADOQuery/, cualquier tipo de query
begin
  qry.SQL.Text := asignar sql para actualizar o insertar el campo;
  qry.ParamByName('p1').DataType := ftBlob;
  qry.ParamByName('p1').AsString := RichEdit.Text;  
  // falla porque RichEdit.Text devuelve el texto "plano", sin las etiuquetas para el formato de texto enriquecido. 
  // Perderias la informacion de negrita, sangria, etc
  qry.Execute; 
end;

Por eso te preguntaba como lo guardabas. Para guardarlo lo haces de la manera correcta, usando Streams.

Ahora el problema esta en como lo "recuperas" de la base de datos

Yo cree la siguiente aplicacion de prueba, que solo tiene un RichEdit y en lugar de una base de datos utilizo un archivo en el disco rigido, pero el concepto es el mismo:

Primero cree un boton que genera dicho archivo de texto, le copie y pege el mismo texto que el de tu mensaje y luego hice click en el boton para ejecutar este codigo:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create;
  try
    RichEdit1.Lines.SaveToStream(Stream);
    RichEdit1.Lines.SaveToFile('C:\Users\Agustin\Desktop\richedit.txt');
  finally
    Stream.Free;
  end;
end;

Esto me genero un archivo con el siguiente contenido:

Código:

{\rtf1\ansi\ansicpg1252\deff0\deflang11274{\fonttbl{\f0\fnil\fcharset0 Segoe UI;}}
\viewkind4\uc1\pard\f0\fs24 "Que el estudiante %s identificada con documento de identidad n\'famero %s, curs\'f3 y aprob\'f3 en este centro educativo, el grado de %s de b\'e1sica primaria durante el a\'f1o lectivo de %s, de conformidad con la ley 115 de 1994 y el decreto 1290 de 2009 y los criterios definidos en el sistema institucional de evaluaci\'f3n de estudiantes (SIEE) obteniendo las valoraciones finales exigidas para la aprobaci\'f3n al grado %s y promoci\'f3n al grado %s de %s "\par
}

Si ahora cargo ese contenido en un RichEdit lo que veo es lo siguiente:



Luego uso los botones de la barra superior para aplicarle formato en negrita a las partes que dice "%s". Si vuelvo a guardar ese contenido lo que me queda ahora es tu plantilla:

Código:

{\rtf1\ansi\ansicpg1252\deff0\deflang11274{\fonttbl{\f0\fnil\fcharset0 Segoe UI;}}
\viewkind4\uc1\pard\f0\fs24 "Que el estudiante \b %s\b0  identificada con documento de identidad n\'famero \b %s\b0 , curs\'f3 y aprob\'f3 en este centro educativo, el grado de \b %s \b0 de b\'e1sica primaria durante el a\'f1o lectivo de \b %s,\b0  de conformidad con la ley 115 de 1994 y el decreto 1290 de 2009 y los criterios definidos en el sistema institucional de evaluaci\'f3n de estudiantes (SIEE) obteniendo las valoraciones finales exigidas para la aprobaci\'f3n al grado \b %s \b0 y promoci\'f3n al grado \b %s \b0 de\b  %s \b0 "\par
}

Este Texto se muestra de la siguiente manera en el RichEdit:



Para cargar texto con formato en el RichEdit es a la inversa que para guardar: usando Streams.

El siguiente codigo hace lo que necesitas, la unica diferencia es que yo uso un FileStream para cargar la plantilla:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  ReadStream, FormatStream: TStringStream;
  FileStream: TFileStream;
begin
  FileStream := nil;
  ReadStream := nil;
  FormatStream := nil;

  // leo el archivo que ya esta generado
  FileStream := TFileStream.Create('C:\Users\Agustin\Desktop\richedit.txt', fmOpenRead);
  try
    // creo un TStringStream y lo cargo con el contenido del archivo
    ReadStream := TStringStream.Create;
    ReadStream.LoadFromStream(FileStream);

    // como el StringStream es inmutable (no puedo hacer algo como ReadStream.DataString := '')
    // necesito crear otro Stream el cual inicializo usando la funcion format sobre el string anterior
    FormatStream := TStringStream.Create(
      Format(ReadStream.DataString, ['bla', 'bla', 'bla', 'bla', 'bla', 'bla', 'bla']));

    // cargo el Stream en el RichEdit. Si asigno directamente sobre Text o Lines.Text pierdo el formato
    RichEdit1.Lines.LoadFromStream(FormatStream);
  finally
    FileStream.Free;
    ReadStream.Free;
    FormatStream.Free;
  end;
end;

Resultado:


GustavoCruz 20-01-2017 15:42:32

AgustinOrtu un millón de gracias por tu colaboración era justo lo que necestiba ^\||/


La franja horaria es GMT +2. Ahora son las 09:08:03.

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