Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2003
aig aig is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 56
Poder: 21
aig Va por buen camino
Cool 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.
Responder Con Cita
  #2  
Antiguo 18-06-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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.

Última edición por __marcsc fecha: 18-06-2003 a las 15:07:09.
Responder Con Cita
  #3  
Antiguo 18-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 22
Kafu Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 18-06-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
Hola Kafu,

también puedes cargar un memo en un richedit mediante

RichEdit.Lines.LoadFromStream

saludos
Responder Con Cita
  #5  
Antiguo 18-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 22
Kafu Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 18-06-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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;
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.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 18-06-2003 a las 18:52:15.
Responder Con Cita
  #7  
Antiguo 18-06-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
Cita:
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.
Responder Con Cita
  #8  
Antiguo 18-06-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #9  
Antiguo 18-06-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
Cita:
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.


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

P.D: Me ha encantado tu frase, plenamente de acuerdo
Responder Con Cita
  #10  
Antiguo 18-06-2003
aig aig is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 56
Poder: 21
aig Va por buen camino
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.


Última edición por aig fecha: 18-06-2003 a las 18:26:43.
Responder Con Cita
  #11  
Antiguo 18-06-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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.
Responder Con Cita
  #12  
Antiguo 18-06-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
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 , es una lástima que una buena idea este tan mal implementada.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #13  
Antiguo 19-06-2003
aig aig is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 56
Poder: 21
aig Va por buen camino
Wink

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.
Responder Con Cita
  #14  
Antiguo 27-06-2003
bitERROR bitERROR is offline
No confirmado
 
Registrado: may 2003
Posts: 33
Poder: 0
bitERROR Va por buen camino
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;
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
Responder Con Cita
  #15  
Antiguo 27-06-2003
aig aig is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 56
Poder: 21
aig Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:58:42.


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
Copyright 1996-2007 Club Delphi