Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pasar TMemoryStream en una Property (https://www.clubdelphi.com/foros/showthread.php?t=85206)

santiago14 13-02-2014 16:06:18

Pasar TMemoryStream en una Property
 
Buenas, estoy intentando pasar datos entre formularios a través de una property, puntualmente tengo que pasar un flujo (Stream) entre ellos. La cuestión es que no doy en la tecla.

El formulario receptor
Código Delphi [-]
  TfrmDatosImprentaDigital = class(TForm)
  private  
    FpDatos_editar: TMemoryStream;
    procedure SetpDatos_editar(const Value: TMemoryStream);
    procedure SetpTitulo_edicion(const Value: string);
  public
    property pDatos_editar:TMemoryStream read FpDatos_editar write SetpDatos_editar;
    property pTitulo_edicion:string read FpTitulo_edicion write SetpTitulo_edicion;
  end;

.......

procedure TfrmDatosImprentaDigital.SetpDatos_editar(const Value: TMemoryStream);
begin
  FpDatos_editar := Value;
//Este es un RichEdit donde quiero ver los datos que llegan.
  editor.Lines.LoadFromStream(FpDatos_editar);
end;

procedure TfrmDatosImprentaDigital.btnConfirmarTextoEditadoClick(
  Sender: TObject);
var
  stream:TMemoryStream;
begin
//Aquí recuperamos el texto desde el RichEdit y lo ponemos en la property para devolverlo a quien llamó
  try
    stream:=TMemoryStream.Create;
    editor.Lines.SaveToStream(stream);
    FpDatos_editar.LoadFromStream(stream);
  finally
    stream.Free;
    ModalResult:=mrOk;
  end;
end;

En el formulario llamador
Código Delphi [-]
procedure TEditorDatos.llamar(texto_enriquecido:TRichEdit);
var
  imprenta:TfrmDatosImprentaDigital;
begin
  imprenta:=TfrmDatosImprentaDigital.Create(nil);
  with imprenta do
  begin
    self.setTexto_enriquecido(texto_enriquecido);
    //pDatos_editar.LoadFromStream(getTexto_enriquecido); //Con esto, en el destino me muestra vacío
    pDatos_editar:=Self.getTexto_enriquecido;
    if mrOk = ShowModal then
    begin
    //Recupero el texto enriquecido desde la ventana de imprenta.
      self.setTexto_enriquecido(pDatos_editar);
    //No me devuelve nada, al parecer, el Rich se muestra vacío.
      rchGobernador.Lines.LoadFromStream(self.getTexto_enriquecido);
    end;
    imprenta.Free;
  end;
end;

Gracias.

nlsgarcia 13-02-2014 19:37:31

santiago14,

Cita:

Empezado por santiago14
...estoy intentando pasar datos entre formularios...

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Menus;

type
  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    MainMenu1: TMainMenu;
    Form21: TMenuItem;
    Exit1: TMenuItem;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Form21Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  FileComponent = 'FileComponent.cmp';

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
   i : Integer;
begin

   if FileExists(FileComponent) then
      DeleteFile(FileComponent);

   for i := 1 to 10 do
      RichEdit1.Lines.Add('Texto de Prueba-' + IntToStr(i));
end;

procedure TForm1.Form21Click(Sender: TObject);
begin
   Form2.Show;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
   Application.Terminate;
end;

procedure SaveComponent(Component : TComponent; FileName: TFileName);
begin
   if not Assigned(Component) then
      raise Exception.Create('El Objeto No Existe');
   with TFileStream.Create(FileName, fmCreate) do
   try
      WriteComponent(Component);
   finally
      Free
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   SaveComponent(RichEdit1,FileComponent);
end;

end.
El código anterior salva la información del Componente RichEdit1 de Form1 en el archivo FileComponent.cmp

Revisa este código:
Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm2 = class(TForm)
    Button2: TButton;
    RichEdit1: TRichEdit;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  FileComponent = 'FileComponent.cmp';

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure LoadComponent(Component : TComponent; FileName: TFileName);
begin
  if not Assigned(Component) then
     raise Exception.Create('El Objeto No Existe');
  if not FileExists(FileName) then
     raise Exception.Create('Archivo de Componente No Existe');
  with TFileStream.Create(FileName, fmOpenRead) do
  try
     ReadComponent(Component);
  finally
     Free
  end;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
   LoadComponent(RichEdit1,FileComponent);
end;

end.
El código anterior recupera y muestra la información salvada anteriormente en el Componente RichEdit1 de Form2.

Espero sea útil :)

Nelson.

ecfisa 14-02-2014 00:43:43

Hola santiago14.

Tal vez te sea útil crear una clase en otra unidad que incluyéndola, te permita transferir el TMemoryStream a cualquier form:
Código Delphi [-]
unit Transf_Stream;

interface

uses SysUtils,Classes;

type
  TTransferStream = class(TObject)
  private
    FStream: TMemoryStream;
    function GetStream: TMemoryStream;
    procedure SetStream(const Value: TMemoryStream);
  public
    constructor Create; reintroduce; overload;
    property DataStream: TMemoryStream read GetStream write SetStream;
    destructor Destroy; override;
  end;

var
  TrStream: TTransferStream;

implementation

constructor TTransferStream.Create;
begin
  inherited;
  FStream:= TMemoryStream.Create;
end;

function TTransferStream.GetStream: TMemoryStream;
begin
  FStream.Position:= 0;
  Result := FStream;
end;

procedure TTransferStream.SetStream(const Value: TMemoryStream);
begin
  Value.Position:= 0;
  FStream.LoadFromStream(Value);
end;

destructor TTransferStream.Destroy;
begin
  if Assigned(FStream) then 
    FStream.Free;
  inherited Destroy;
end;
end.

Un ejemplo de uso, formulario emisor:
Código Delphi [-]
...
implementation

uses Unit2 {Receptor}, Transf_Stream;

...

procedure TForm1.Button1Click(Sender: TObject);
begin
  TransferStream := TTransferStream.Create;
  try
    RichEdit1.Lines.SaveToStream(TransferStream.DataStream);
    if not Assigned(Form2) then
      Form2:= TForm2.Create(Self);
    Form2.Show  // (o ShowModal)
  finally
    TransferStream.Free
  end;
end;

...

En los formularios receptores podrías hacer:
Código Delphi [-]
...
implementation

uses Transf_Stream;

procedure TForm2.FormCreate(Sender: TObject);
begin
  if Assigned(TransferStream) then
    RichEdit1.Lines.LoadFromStream(TransferStream.DataStream);
end;
...

Saludos :)


La franja horaria es GMT +2. Ahora son las 09:53:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi