PDA

Ver la Versión Completa : Modificar tStream


aig
18-06-2003, 12:49:42
Hola.

Tengo una variable tMemoryStream que cargo desde un fichero rtf. Dentro de las cadenas cargadas hay una palabra que quiero reemplazar por un string.

¿Com se puede reemplazar parte del contenido de la variable tMemoryStream por otro string?

Gracias.
Carlos.

__marcsc
18-06-2003, 15:04:39
Hola,

porqué no cargas primero el rtf en un RichEdit y lo modiifcas des de allí mediante la función StringReplace ( o con algún método del RichEdit que también te permite hacerlo...)? Te sería más fácil...

Si quieres luego puedes cargarlo en el MemoryStream...

Saludos.

Kafu
18-06-2003, 16:26:50
Otra opción es usar un memoedit que tiene un método loadformstream. Y otra función es Ansireplacestr o AnsiReplaceText. Viene a ser lo mismo que lo que apunta Marcsc.
Un saludo,






F.T.G.

__marcsc
18-06-2003, 16:32:49
Hola Kafu,

también puedes cargar un memo en un richedit mediante

RichEdit.Lines.LoadFromStream

saludos ;)

Kafu
18-06-2003, 17:06:30
Cierto, de hecho con una simple variable de tipo tstringlist ya tenemos ese método. Imagino que AIG no necesita este reemplazo usando sólo el memorystream. Eso ya lo veo más complicado.

Una pega que he visto al uso del ansireplacetext es que tiene limitación de tamaño. No son 256 caracteres pero creo recordar que a partir de cierto número de líneas cascaba. La ventaja es que reemplaza pasando directamente todo lines.text, sin necesidad de un bucle por las líneas.

Un saludo,




F.T.G.

delphi.com.ar
18-06-2003, 17:20:27
Bueno, yo tuve ese problema y lo que hice fue un nuevo Stream heredado de TMemoryStream y sobrescribo el método Write y ahí hago lo que quiero con los datos que me pasa en el parámetro Buffer. Yo utilizé un TMemoryStream porque lo cargo de un campo en la base de datos, pero si vas a leer un archivo, puedes heredarlo de TFileStream.

function TReplaceStream.Write(const Buffer; Count: Integer): Longint;
begin
MiFuncionReplace( Buffer... );
Result := inherited Write( Buffer, NewSize );
end;


El tema que creo de AIG, es que quiere modificar algo que pertenece al RTF, si utilizamos un StringReplace o AnsiReplaceText sobre los Lines de un RichEdit, es que accedemos al texto plano del RTF.

__marcsc
18-06-2003, 17:29:46
El tema que creo de AIG, es que quiere modificar algo que pertenece al RTF, si utilizamos un StringReplace o AnsiReplaceText sobre los Lines de un RichEdit, es que accedemos al texto plano del RTF.

Mmmmm, cierto, yo en su día también lo hice, aunque según que cosas quiera modificar del RTF quizás sea mejor (y más fácil) intentar hacerlo con las herramientas que nos proporciona el TRichEdit o el TRxRichEdit que es un poco más avanzado.

Estaría bien que nos contara que es lo que quiere hacer :)

Saludos.

delphi.com.ar
18-06-2003, 17:39:07
Bueno, esto que le pasé lo utilizo para un TQRRichText... Y antes de ponerme a investigar sobre el mediocre código del QuickReports preferí hacer esto. Obviamente que sirve para todos por igual!


Saludos!

__marcsc
18-06-2003, 17:55:27
Posteado originalmente por delphi.com.ar
Bueno, esto que le pasé lo utilizo para un TQRRichText... Y antes de ponerme a investigar sobre el mediocre código del QuickReports preferí hacer esto.


:D:D:D:D:D:D

Casi me caigo de la silla al leer esto!!! Te ha quedado muy cruel :p

P.D: Me ha encantado tu frase, plenamente de acuerdo ;)

aig
18-06-2003, 18:12:53
Gracias, marcsc, kafu y delphi.com.ar

Los tiros van precisamente por QuickReport y qrRichText.

El problema original a este post lo plantee primero en el foro IMPRESION ya que después de cargar el tqrRichText, al tratarlo como un string para reemplazar una cadena, se perdian los caracteres de control y por tanto perdia el font original y los saltos de línea.

Creí que la solución estaría en cargar el rtf en memoria (uitlizando el tMemoryStream) y modificarlo antes de llevarlo al tqrRichText.

Por eso es mi consulta directamente sobre el tStream.


Nota: Pido disculpas por haber traslado un problema de un foro a otro, aunque no fue mi intención.

;)

__marcsc
18-06-2003, 18:48:08
Hola,

como ya apuntaba en mi primer mensaje, y, aunque no es una opción elegante, lo que yo haría seria lo siguiente:

- Creas un TRichEdit en tiempo de ejecución, y mediante el LoadFromFile cargas tu fichero RTF.

- Una vez hecho esto mediante StringReplace o algún método del TRichEdit, reemplazas el texto que quieres.

- Luego, una vez ya tienes el texto que te interesa, lo cargas en un TMemoryStream

- Ahora tienes el Stream correcto y lo puedes cargar en el TQRRichText.

Espero que sea esto lo que querías. Sé que podrías modificar directamente el stream y que sería más elegante, pero también te requiere codificar un poco más.

Un saludo.

delphi.com.ar
18-06-2003, 22:58:55
Posteado originalmente por marcsc
Sé que podrías modificar directamente el stream y que sería más elegante, pero también te requiere codificar un poco más.
Mmmmmm... no se!.. En mi caso fue la solución mas sencilla, y no creo que sea más código de la solución que tu propones.
En mi caso el stream posee una lista con los valores buscados y por lo que se debe cambiar, y con cuatro líneas de código esta totalmente implementado y funcional.


PD: Lo del QuickReport no es saña, es 100% realidad, y creo que estamos todos de acuerdo en esto :D :D , es una lástima que una buena idea este tan mal implementada.

Saludos!

aig
19-06-2003, 10:50:28
Bueno !!! . El problema original que ha planteado este hilo se ha solucionado y la solución estaba más cerca de lo que parecía.

Aunque me extienda un poco, voy a explicar todo paso a paso por si le sirve a alguien. (Esto pasa con tqrRichText y tambien con tRichEdit por eso pongo en este foro la solución)

- El primer problema se plantea cuando al modificar un tqrRichText cargado desde un fichero RTF, se pierden los saltos de líneas y el font original.

- La forma en que yo cambiaba un string por otro, era tratando todo el qrRichText como un string (qrRichText1.lines.text). De esta forma se perdían los saltos de líneas y el font que tenía el fichero RTF.

- Traté de solucionarlo intentando reemplazar el string antes de cargar el qrRichText, por eso era lo de modificar un tStream.

- Pero la solución está en tratar el tqrRichText o el tRichEdit línea a línea (qrRichText1.lines.strings[i]......) , de esta forma se conservan los saltos de líneas y el font del rtf.

Muchas gracias.

bitERROR
27-06-2003, 01:24:12
Buenasss, igual esto ahora no sirve de mucho, pero yo me vi en un caso parecido e identifiqué el texto a reemplazar utilizando algún carácter significativo, tal como así...

'Estimado cliente, hoy [FECHA_ACTUAL] le informo de... bla bla bla'

Una vez decidido esto implementé así (+ o -) el código para reemplazar el 'macro' por la fecha actual, sin perder el formato del texto:

procedure TForm1.DoMacroFecha;
var SS: TStringStream; // <- <- <- <-
begin
SS := TStringStream.Create('');
with RxRichEdit1 do
try
Lines.SaveToStream(SS);
SS.Seek(0, soFromBeginning);
SS.WriteString(StringReplace(SS.DataString, '[FECHA_ACTUAL]', DateToStr(Date), [rfReplaceAll]));
SS.Seek(0, soFromBeginning);
Lines.LoadFromStream(SS);
finally
FreeAndNil(SS);
end;
end;

Obviamente con este código existe el mismo problema comentado de reemplazar algún valor clave del texto enriquecido, yo no contaba con esa desventaja al utilizar 'macros', así que probablemente no sea lo más óptimo para el caso, pero os dejo la curiosidad del TStringStream y su propiedad más interesante DataString.

Un saludo a todos
:p

aig
27-06-2003, 09:09:29
Muchisimas Gracias bitError.

Esa es la solución.

Al tratar el qrRichText (supongo que será lo mismo con tRichEdit) como un string (.text o .string) se perdían todos los caracteres de control, que indicaban donde comenzaba y terminaba cada tipo de letra o estilo.

Al llevar todo el contenido del qrRichText a un tStringStream se mantiene todo y se puede modificar como una cadena de caracteres.


De nuevo muchas gracias, te aseguro que tu respuesta ha llegado como un gol en el último minuto (a favor claro).


Saludos.
Carlos.