![]() |
Modificar tStream
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. |
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. |
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. |
Hola Kafu,
también puedes cargar un memo en un richedit mediante RichEdit.Lines.LoadFromStream saludos ;) |
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. |
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.
Código:
function TReplaceStream.Write(const Buffer; Count: Integer): Longint; |
Cita:
Estaría bien que nos contara que es lo que quiere hacer :) Saludos. |
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! |
Cita:
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 ;) |
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. ;) |
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. |
Cita:
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! |
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. |
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: Código:
procedure TForm1.DoMacroFecha; Un saludo a todos :p |
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. |
La franja horaria es GMT +2. Ahora son las 04:40:44. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi