110 lines
2.5 KiB
ObjectPascal
110 lines
2.5 KiB
ObjectPascal
unit proc_StreamComponent;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils;
|
|
|
|
procedure SaveComponentToFile(Component: TComponent; const FileName: string);
|
|
procedure SaveComponentToStream(Component: TComponent; Stream: TStream);
|
|
procedure LoadComponentFromFile(Component: TComponent; const FileName: string; OnError: TReaderError);
|
|
procedure LoadComponentFromStream(Component: TComponent; Stream: TStream; OnError: TReaderError = nil);
|
|
|
|
|
|
implementation
|
|
|
|
|
|
procedure SaveComponentToStream(Component: TComponent; Stream: TStream);
|
|
var
|
|
MemSt: TStream;
|
|
Writer: TWriter;
|
|
begin
|
|
MemSt := TMemoryStream.Create;
|
|
try
|
|
if Component.Owner = nil then
|
|
MemSt.WriteComponent(Component)
|
|
else
|
|
begin
|
|
Writer := TWriter.Create(MemSt, 4096);
|
|
try
|
|
Writer.Root := Component.Owner;
|
|
//Delphi needs Writer.WriteSignature
|
|
Writer.WriteComponent(Component);
|
|
finally
|
|
FreeAndNil(Writer);
|
|
end;
|
|
end;
|
|
MemSt.Position := 0;
|
|
ObjectBinaryToText(MemSt, Stream);
|
|
finally
|
|
FreeAndNil(MemSt);
|
|
end
|
|
end;
|
|
|
|
procedure SaveComponentToFile(Component: TComponent; const FileName: string);
|
|
var
|
|
Stream: TStream;
|
|
begin
|
|
Stream := TFileStream.Create(FileName, fmCreate);
|
|
try
|
|
SaveComponentToStream(Component, Stream);
|
|
finally
|
|
FreeAndNil(Stream);
|
|
end
|
|
end;
|
|
|
|
procedure LoadComponentFromStream(Component: TComponent; Stream: TStream; OnError: TReaderError = nil);
|
|
var
|
|
MemSt: TStream;
|
|
Reader: TReader;
|
|
Sign: array[0..3] of char = ' ';
|
|
begin
|
|
MemSt := TMemoryStream.Create;
|
|
try
|
|
ObjectTextToBinary(Stream, MemSt);
|
|
MemSt.Position := 0;
|
|
Reader := TReader.Create(MemSt, 4096);
|
|
Reader.OnError := OnError;
|
|
try
|
|
if Component.Owner = nil then
|
|
Reader.ReadRootComponent(Component)
|
|
else
|
|
begin
|
|
Reader.Root := Component.Owner;
|
|
|
|
//Reader.ReadSignature; //AT
|
|
Reader.Read(Sign, SizeOf(Sign));
|
|
|
|
Reader.BeginReferences;
|
|
try
|
|
Reader.ReadComponent(Component);
|
|
Reader.FixupReferences;
|
|
finally
|
|
Reader.EndReferences;
|
|
end;
|
|
end;
|
|
finally
|
|
FreeAndNil(Reader);
|
|
end;
|
|
finally
|
|
FreeAndNil(MemSt);
|
|
end;
|
|
end;
|
|
|
|
procedure LoadComponentFromFile(Component: TComponent; const FileName: string; OnError: TReaderError);
|
|
var
|
|
Stream: TStream;
|
|
begin
|
|
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
|
|
try
|
|
LoadComponentFromStream(Component, Stream, OnError);
|
|
finally
|
|
FreeAndNil(Stream);
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|