1 (*
2 This Source Code Form is subject to the terms of the Mozilla Public
3 License, v. 2.0. If a copy of the MPL was not distributed with this
4 file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 
6 Copyright (c) Alexey Torgashin
7 *)
8 unit ec_proc_StreamComponent;
9 
10 {$mode objfpc}{$H+}
11 
12 interface
13 
14 uses
15   Classes, SysUtils;
16 
17 procedure SaveComponentToFile(Component: TComponent; const FileName: string);
18 procedure SaveComponentToStream(Component: TComponent; Stream: TStream);
19 procedure LoadComponentFromFile(Component: TComponent; const FileName: string; OnError: TReaderError);
20 procedure LoadComponentFromStream(Component: TComponent; Stream: TStream; OnError: TReaderError = nil);
21 
22 
23 implementation
24 
25 
26 procedure SaveComponentToStream(Component: TComponent; Stream: TStream);
27 var
28   MemSt: TStream;
29   Writer: TWriter;
30 begin
31   MemSt := TMemoryStream.Create;
32   try
33     if Component.Owner = nil then
34       MemSt.WriteComponent(Component)
35     else
36       begin
37         Writer := TWriter.Create(MemSt, 4096);
38         try
39           Writer.Root := Component.Owner;
40           Writer.WriteSignature; //Delphi/ FPC 3.0 needs
41           Writer.WriteComponent(Component);
42         finally
43           FreeAndNil(Writer);
44         end;
45       end;
46     MemSt.Position := 0;
47     ObjectBinaryToText(MemSt, Stream);
48   finally
49     FreeAndNil(MemSt);
50   end
51 end;
52 
53 procedure SaveComponentToFile(Component: TComponent; const FileName: string);
54 var
55   Stream: TStream;
56 begin
57   Stream := TFileStream.Create(FileName, fmCreate);
58   try
59     SaveComponentToStream(Component, Stream);
60   finally
61     FreeAndNil(Stream);
62   end
63 end;
64 
65 procedure LoadComponentFromStream(Component: TComponent; Stream: TStream; OnError: TReaderError = nil);
66 var
67   MemSt: TStream;
68   Reader: TReader;
69   Sign: array[0..3] of char = '    ';
70 begin
71    MemSt := TMemoryStream.Create;
72    try
73      ObjectTextToBinary(Stream, MemSt);
74      MemSt.Position := 0;
75      Reader := TReader.Create(MemSt, 4096);
76      Reader.OnError := OnError;
77     try
78       if Component.Owner = nil then
79         Reader.ReadRootComponent(Component)
80       else
81         begin
82             Reader.Root := Component.Owner;
83 
84             //Reader.ReadSignature; //AT
85             Reader.Read(Sign, SizeOf(Sign));
86 
87             Reader.BeginReferences;
88             try
89               Reader.ReadComponent(Component);
90               Reader.FixupReferences;
91             finally
92               Reader.EndReferences;
93             end;
94         end;
95     finally
96       FreeAndNil(Reader);
97     end;
98   finally
99     FreeAndNil(MemSt);
100   end;
101 end;
102 
103 procedure LoadComponentFromFile(Component: TComponent; const FileName: string; OnError: TReaderError);
104 var
105   Stream: TStream;
106 begin
107   Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
108   try
109     LoadComponentFromStream(Component, Stream, OnError);
110   finally
111     FreeAndNil(Stream);
112   end;
113 end;
114 
115 end.
116 
117