RAD Studio VCL Reference
ContentsIndex
PreviousUpNext
TMemoryStream Class

TMemoryStream is a stream that stores its data in dynamic memory.

Pascal
TMemoryStream = class(TCustomMemoryStream);
C++
class TMemoryStream : public TCustomMemoryStream;

Classes

Use TMemoryStream to store data in a dynamic memory buffer that is enhanced with file-like access capabilities. TMemoryStream provides the general I/O capabilities of a stream object while introducing methods and properties to manage a dynamic memory buffer. 

Memory streams are useful as intermediary objects that can hold information as well as read it from or write it to another storage medium. They provide a useful format for comparing the contents of streams, or for manipulating data that is stored in a less accessible medium.  

C++ Examples: 

 

/*
This example shows how to use the built-in component
streaming support to convert any component into a string and
convert that string back into a component.
*/
class MyScrollBar : public TScrollBar
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
    __fastcall MyScrollBar(TComponent* Owner);
};

__fastcall MyScrollBar::MyScrollBar(TComponent* Owner)
    : TScrollBar(Owner)
{
}

void RegisterClassesWithStreamingSystem(void)
{
  // Make sure that as part of the startup
  // code our streaming classes are registered
  // with the streaming system.

  #pragma startup RegisterClassesWithStreamingSystem

  Classes::RegisterClass(__classid(MyScrollBar));
}

MyScrollBar *ScrollBar1;

AnsiString __fastcall ComponentToString(TComponent *c)
{
 AnsiString as;
 TMemoryStream* pms = new TMemoryStream();
 TStringStream* pss = new TStringStream(as);

 try
 {
    pms->WriteComponent(c);
    pms->Seek(0, soFromBeginning);
    ObjectBinaryToText(pms, pss);
    pss->Seek(0, soFromBeginning);
    as = pss->DataString;
 }
 catch(...)
 {
    ShowMessage("Streaming error.");
 }

 delete pms;
 delete pss;
 return as;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Text = ComponentToString(ScrollBar1);
}

TComponent *__fastcall StringToComponent(AnsiString as)

{
 TMemoryStream* pms = new TMemoryStream();
 TStringStream* pss = new TStringStream(as);
 TComponent *pc;

 try
 {
    ObjectTextToBinary(pss, pms);
    pms->Seek(0, soFromBeginning);
 }
 catch(...)
 {
    ShowMessage("Streaming error.");
 }

 pc = pms->ReadComponent(NULL);
 delete pms;
 delete pss;
 return pc;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TComponent *temp = StringToComponent(Memo1->Text);
  ScrollBar1->Free();

  ScrollBar1 = dynamic_cast<MyScrollBar *>(temp);
  ScrollBar1->Parent = Form1;
  ScrollBar1->Visible = TRUE;
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ScrollBar1 = new MyScrollBar(Form1);
  ScrollBar1->Parent = Form1;
  ScrollBar1->Visible = TRUE;
  ScrollBar1->Top = 48;
  ScrollBar1->Left = 250;
  ScrollBar1->Name = "Ricksbar";
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  delete ScrollBar1;
}

 

Delphi Examples: 

{
This example shows how to use the built-in component
streaming support to convert any component into a string and
convert that string back into a component.
}
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  MyScrollBar = class(TScrollBar)
  end;

var
  Form1: TForm1;
  ScrollBar1: MyScrollBar;
  
implementation

{$R *.dfm}

function ComponentToStringProc(Component: TComponent): string;
var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;
    end;
  finally
    BinStream.Free
  end;
end;

function StringToComponentProc(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result:= BinStream.ReadComponent(nil);
    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text:= ComponentToStringProc(ScrollBar1);
end;

// Edit the scrollbar parameters in the memo, click this
// button and see the scrollbar change.
procedure TForm1.Button2Click(Sender: TObject);
begin
  ScrollBar1.Free;
  ScrollBar1:= (StringToComponentProc(Memo1.Text) as MyScrollBar);
  ScrollBar1.Parent:= Form1;
  ScrollBar1.Visible:= TRUE;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ScrollBar1:= MyScrollBar.Create(Form1);
  ScrollBar1.Parent:= Form1;
  ScrollBar1.Visible:= TRUE;
  ScrollBar1.Top:= 48;
  ScrollBar1.Left:= 250;
  ScrollBar1.Name:= 'Ricksbar';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ScrollBar1.Free;
end;

initialization

RegisterClass(MyScrollBar);

 

Copyright(C) 2008 CodeGear(TM). All Rights Reserved.
What do you think about this topic? Send feedback!