Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Enviar Stream a un frxRichView de FastReport (https://www.clubdelphi.com/foros/showthread.php?t=90925)

santiago14 09-10-2016 01:13:11

Enviar Stream a un frxRichView de FastReport
 
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

Por las dudas, lo copio también:
Código Delphi [-]
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:
Código Delphi [-]
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í...

Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 12:06:12.

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