lasarus_compotents/EControl/ec/proc_streamcomponent.pas

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.