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