PDA

Ver la Versión Completa : Enviar Stream a un frxRichView de FastReport


santiago14
09-10-2016, 01:13:11
Buenas, realmente FastReport es bueno, pero es dificultoso encontrar algunas cosas.
En mi caso particular estuve buscando por varios días el como pasar datos desde un RichEdit hacia un frxRichView.
Luego de bastante buscar encontré lo siguiente. Si hay algo mejor, por favor, lo agregan.
Gracias.

Primeramente hay que pasar un Stream a OleVariant, lo hice con un pequeño módulo que encontré en este lugar (http://www.delphipages.com/forum/showpost.php?p=62986&postcount=2)

Por las dudas, lo copio también:

function MemoryStreamToOleVariant(Strm: TMemoryStream): OleVariant;
var
Data: PByteArray;
begin
Result := VarArrayCreate ([0, Strm.Size - 1], varByte);
Data := VarArrayLock(Result);
try
Strm.Position := 0;
Strm.ReadBuffer(Data^, Strm.Size);
finally
VarArrayUnlock(Result);
end;
end;

function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream;
var
Data: PByteArray;
Size: integer;
begin
Result := TMemoryStream.Create;
try
Size := VarArrayHighBound (OV, 1) - VarArrayLowBound(OV, 1) + 1;
Data := VarArrayLock(OV);
try
Result.Position := 0;
Result.WriteBuffer(Data^, Size);
finally
VarArrayUnlock(OV);
end;
except
Result.Free;
Result := nil;
end;
end;


Ahora, tengo un componente frxRichView llamado 'rchTextoMembrete', una variable de FastReport llamada 'TextoMembrete'
Hago click derecho sobre 'rchTextoMembrete' --> Editar... y allí coloco la variable, de la siguiente forma: [TextoMembrete]

El código para pasar los datos hacia el FastReport:

procedure TfrmEditorDocumentoMembretado.btnConfirmarTextoEditadoClick(
Sender: TObject);
var
stream:TMemoryStream;
begin
stream:=TMemoryStream.Create;
//Guardamos el contenido como un flujo en stream
Editor.Lines.SaveToStream(stream);
dmReportes.dmReportesCarahuasi.frxImpresionMembrete.Variables['TextoMembrete']:=MemoryStreamToOleVariant(stream);
dmReportes.dmReportesCarahuasi.frxImpresionMembrete.ShowReport();
end;


En el documento FastReport podemos ver lo que escribimos en el editor RichEdit, respetando el formato, que es lo que queríamos.
Bueno, espero sirva.

Santiago.

cloayza
12-10-2016, 20:41:17
Podría ser así...


procedure TfrmEditorDocumentoMembretado.btnConfirmarTextoEditadoClick(
Sender: TObject);
var
RichView:TfrxRichView;
stream:TMemoryStream;
begin
stream:=TMemoryStream.Create;
//Guardamos el contenido como un flujo en stream
Editor.Lines.SaveToStream(stream);

//Buscar el objeto al que debes asignar el contenido del Stream.
RichView := TfrxRichView(dmReportes.dmReportesCarahuasi.frxImpresionMembrete.FindObject( 'Nombre_Del_Objeto_frxRichView' ) );
//Verificas si lo encontró
If RichView <> Nil Then
Begin
//Asignas el contenido del stream al RichView...
RichView.RichEdit.Lines.LoadFromStream( stream );
//dmReportes.dmReportesCarahuasi.frxImpresionMembrete.Variables['TextoMembrete']:=MemoryStreamToOleVariant(stream);
dmReportes.dmReportesCarahuasi.frxImpresionMembrete.ShowReport();
end;
end;

Saludos cordiales