classesh.inc 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504
  1. {
  2. $Id$
  3. This file is part of the Free Component Library (FCL)
  4. Copyright (c) 1999-2000 by Michael Van Canneyt and Florian Klaempfl
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$H+}
  12. { The 1.0 compiler cannot compile the Seek(int64) overloading correct }
  13. {$ifndef ver1_0}
  14. {$define seek64bit}
  15. {$endif ver1_0}
  16. type
  17. { extra types to compile with FPC }
  18. HRSRC = longint;
  19. THANDLE = longint;
  20. TComponentName = string;
  21. {$ifdef ver1_0}
  22. // 1.0 doesn't have thread
  23. TRTLCriticalSection = record
  24. locked : longint;
  25. end;
  26. // 1.1 and above has interfaces
  27. IUnknown = class(TObject);
  28. TGUID = longint;
  29. {$endif ver1_0}
  30. HMODULE = longint;
  31. TPoint = record
  32. x,y : integer;
  33. end;
  34. TRect = record
  35. Case Integer of
  36. 0 : ( Left,Top,Right,Bottom : integer);
  37. 1 : ( TopLeft,BottomRight : TPoint);
  38. end;
  39. TSmallPoint = record
  40. x,y : smallint;
  41. end;
  42. const
  43. { Maximum TList size }
  44. MaxListSize = Maxint div 16;
  45. { values for TShortCut }
  46. scShift = $2000;
  47. scCtrl = $4000;
  48. scAlt = $8000;
  49. scNone = 0;
  50. { TStream seek origins }
  51. const
  52. soFromBeginning = 0;
  53. soFromCurrent = 1;
  54. soFromEnd = 2;
  55. type
  56. TSeekOrigin = (soBeginning, soCurrent, soEnd);
  57. { TFileStream create mode }
  58. const
  59. fmCreate = $FFFF;
  60. fmOpenRead = 0;
  61. fmOpenWrite = 1;
  62. fmOpenReadWrite = 2;
  63. { TParser special tokens }
  64. toEOF = Char(0);
  65. toSymbol = Char(1);
  66. toString = Char(2);
  67. toInteger = Char(3);
  68. toFloat = Char(4);
  69. Const
  70. FilerSignature : Array[1..4] of char = 'TPF0';
  71. type
  72. { Text alignment types }
  73. TAlignment = (taLeftJustify, taRightJustify, taCenter);
  74. { TLeftRight = taLeftJustify..taRightJustify; }
  75. { Types used by standard events }
  76. TShiftState = set of (ssShift, ssAlt, ssCtrl,
  77. ssLeft, ssRight, ssMiddle, ssDouble,
  78. // Extra additions
  79. ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
  80. ssScroll,ssTriple,ssQuad);
  81. THelpContext = -MaxLongint..MaxLongint;
  82. THelpType = (htKeyword, htContext);
  83. TShortCut = Low(Word)..High(Word);
  84. { Standard events }
  85. TNotifyEvent = procedure(Sender: TObject) of object;
  86. THelpEvent = function (Command: Word; Data: Longint;
  87. var CallHelp: Boolean): Boolean of object;
  88. TGetStrProc = procedure(const S: string) of object;
  89. { Exception classes }
  90. EStreamError = class(Exception);
  91. EFCreateError = class(EStreamError);
  92. EFOpenError = class(EStreamError);
  93. EFilerError = class(EStreamError);
  94. EReadError = class(EFilerError);
  95. EWriteError = class(EFilerError);
  96. EClassNotFound = class(EFilerError);
  97. EMethodNotFound = class(EFilerError);
  98. EInvalidImage = class(EFilerError);
  99. EResNotFound = class(Exception);
  100. EListError = class(Exception);
  101. EBitsError = class(Exception);
  102. EStringListError = class(Exception);
  103. EComponentError = class(Exception);
  104. EParserError = class(Exception);
  105. EOutOfResources = class(EOutOfMemory);
  106. EInvalidOperation = class(Exception);
  107. { Forward class declarations }
  108. TStream = class;
  109. TFiler = class;
  110. TReader = class;
  111. TWriter = class;
  112. TComponent = class;
  113. { TList class }
  114. PPointerList = ^TPointerList;
  115. TPointerList = array[0..MaxListSize - 1] of Pointer;
  116. TListSortCompare = function (Item1, Item2: Pointer): Integer;
  117. TListNotification = (lnAdded, lnExtracted, lnDeleted);
  118. TList = class(TObject)
  119. private
  120. FList: PPointerList;
  121. FCount: Integer;
  122. FCapacity: Integer;
  123. protected
  124. function Get(Index: Integer): Pointer;
  125. procedure Grow; virtual;
  126. procedure Put(Index: Integer; Item: Pointer);
  127. procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
  128. procedure SetCapacity(NewCapacity: Integer);
  129. procedure SetCount(NewCount: Integer);
  130. public
  131. destructor Destroy; override;
  132. function Add(Item: Pointer): Integer;
  133. procedure Clear; dynamic;
  134. procedure Delete(Index: Integer);
  135. class procedure Error(const Msg: string; Data: Integer); virtual;
  136. procedure Exchange(Index1, Index2: Integer);
  137. function Expand: TList;
  138. function Extract(item: Pointer): Pointer;
  139. function First: Pointer;
  140. procedure Assign(Obj:TList);
  141. function IndexOf(Item: Pointer): Integer;
  142. procedure Insert(Index: Integer; Item: Pointer);
  143. function Last: Pointer;
  144. procedure Move(CurIndex, NewIndex: Integer);
  145. function Remove(Item: Pointer): Integer;
  146. procedure Pack;
  147. procedure Sort(Compare: TListSortCompare);
  148. property Capacity: Integer read FCapacity write SetCapacity;
  149. property Count: Integer read FCount write SetCount;
  150. property Items[Index: Integer]: Pointer read Get write Put; default;
  151. property List: PPointerList read FList;
  152. end;
  153. { TThreadList class }
  154. TThreadList = class
  155. private
  156. FList: TList;
  157. {$ifdef FPC_THREADING}
  158. FLock: TRTLCriticalSection;
  159. {$endif FPC_THREADING}
  160. public
  161. constructor Create;
  162. destructor Destroy; override;
  163. procedure Add(Item: Pointer);
  164. procedure Clear;
  165. function LockList: TList;
  166. procedure Remove(Item: Pointer);
  167. procedure UnlockList;
  168. end;
  169. const
  170. BITSHIFT = 5;
  171. MASK = 31; {for longs that are 32-bit in size}
  172. MaxBitRec = $FFFF Div (SizeOf(longint));
  173. MaxBitFlags = MaxBitRec * 32;
  174. type
  175. TBitArray = array[0..MaxBitRec - 1] of cardinal;
  176. TBits = class(TObject)
  177. private
  178. { Private declarations }
  179. FBits : ^TBitArray;
  180. FSize : longint; { total longints currently allocated }
  181. findIndex : longint;
  182. findState : boolean;
  183. { functions and properties to match TBits class }
  184. procedure SetBit(bit : longint; value : Boolean);
  185. function GetSize : longint;
  186. procedure SetSize(value : longint);
  187. procedure CheckBitIndex (Bit : longint;CurrentSize : Boolean);
  188. public
  189. { Public declarations }
  190. constructor Create(TheSize : longint); virtual;
  191. destructor Destroy; override;
  192. function GetFSize : longint;
  193. procedure SetOn(Bit : longint);
  194. procedure Clear(Bit : longint);
  195. procedure Clearall;
  196. procedure AndBits(BitSet : TBits);
  197. procedure OrBits(BitSet : TBits);
  198. procedure XorBits(BitSet : TBits);
  199. procedure NotBits(BitSet : TBits);
  200. function Get(Bit : longint) : boolean;
  201. procedure Grow(NBit : longint);
  202. function Equals(BitSet : TBits) : Boolean;
  203. procedure SetIndex(Index : longint);
  204. function FindFirstBit(State : boolean) : longint;
  205. function FindNextBit : longint;
  206. function FindPrevBit : longint;
  207. { functions and properties to match TBits class }
  208. function OpenBit: longint;
  209. property Bits[Bit: longint]: Boolean read get write SetBit; default;
  210. property Size: longint read getSize write setSize;
  211. end;
  212. { TPersistent abstract class }
  213. {$M+}
  214. TPersistent = class(TObject)
  215. private
  216. procedure AssignError(Source: TPersistent);
  217. protected
  218. procedure AssignTo(Dest: TPersistent); virtual;
  219. procedure DefineProperties(Filer: TFiler); virtual;
  220. function GetOwner: TPersistent; dynamic;
  221. public
  222. destructor Destroy; override;
  223. procedure Assign(Source: TPersistent); virtual;
  224. function GetNamePath: string; virtual; {dynamic;}
  225. end;
  226. {$M-}
  227. { TPersistent class reference type }
  228. TPersistentClass = class of TPersistent;
  229. { TInterfaced Persistent }
  230. {$ifdef HASINTF}
  231. TInterfacedPersistent = class(TPersistent, IInterface)
  232. private
  233. FOwnerInterface: IInterface;
  234. protected
  235. { IInterface }
  236. function _AddRef: Integer; stdcall;
  237. function _Release: Integer; stdcall;
  238. public
  239. function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
  240. procedure AfterConstruction; override;
  241. end;
  242. {$endif HASINTF}
  243. { TRecall class }
  244. TRecall = class(TObject)
  245. private
  246. FStorage, FReference: TPersistent;
  247. public
  248. constructor Create(AStorage, AReference: TPersistent);
  249. destructor Destroy; override;
  250. procedure Store;
  251. procedure Forget;
  252. property Reference: TPersistent read FReference;
  253. end;
  254. { TCollection class }
  255. TCollection = class;
  256. TCollectionItem = class(TPersistent)
  257. private
  258. FCollection: TCollection;
  259. FID: Integer;
  260. function GetIndex: Integer;
  261. procedure SetCollection(Value: TCollection);
  262. protected
  263. procedure Changed(AllItems: Boolean);
  264. function GetNamePath: string; override;
  265. function GetOwner: TPersistent; override;
  266. function GetDisplayName: string; virtual;
  267. procedure SetIndex(Value: Integer); virtual;
  268. procedure SetDisplayName(const Value: string); virtual;
  269. public
  270. constructor Create(ACollection: TCollection); virtual;
  271. destructor Destroy; override;
  272. property Collection: TCollection read FCollection write SetCollection;
  273. property ID: Integer read FID;
  274. property Index: Integer read GetIndex write SetIndex;
  275. property DisplayName: string read GetDisplayName write SetDisplayName;
  276. end;
  277. TCollectionItemClass = class of TCollectionItem;
  278. TCollection = class(TPersistent)
  279. private
  280. FItemClass: TCollectionItemClass;
  281. FItems: TList;
  282. FUpdateCount: Integer;
  283. FNextID: Integer;
  284. FPropName: string;
  285. function GetCount: Integer;
  286. function GetPropName: string;
  287. procedure InsertItem(Item: TCollectionItem);
  288. procedure RemoveItem(Item: TCollectionItem);
  289. protected
  290. { Design-time editor support }
  291. function GetAttrCount: Integer; dynamic;
  292. function GetAttr(Index: Integer): string; dynamic;
  293. function GetItemAttr(Index, ItemIndex: Integer): string; dynamic;
  294. function GetNamePath: string; override;
  295. procedure Changed;
  296. function GetItem(Index: Integer): TCollectionItem;
  297. procedure SetItem(Index: Integer; Value: TCollectionItem);
  298. procedure SetItemName(Item: TCollectionItem); virtual;
  299. procedure SetPropName; virtual;
  300. procedure Update(Item: TCollectionItem); virtual;
  301. property PropName: string read GetPropName write FPropName;
  302. public
  303. constructor Create(AItemClass: TCollectionItemClass);
  304. destructor Destroy; override;
  305. function Add: TCollectionItem;
  306. procedure Assign(Source: TPersistent); override;
  307. procedure BeginUpdate;
  308. procedure Clear;
  309. procedure EndUpdate;
  310. function FindItemID(ID: Integer): TCollectionItem;
  311. property Count: Integer read GetCount;
  312. property ItemClass: TCollectionItemClass read FItemClass;
  313. property Items[Index: Integer]: TCollectionItem read GetItem write SetItem;
  314. end;
  315. TStrings = class;
  316. { IStringsAdapter interface }
  317. {$ifdef HASINTF}
  318. { Maintains link between TStrings and IStrings implementations }
  319. IStringsAdapter = interface ['{739C2F34-52EC-11D0-9EA6-0020AF3D82DA}']
  320. procedure ReferenceStrings(S: TStrings);
  321. procedure ReleaseStrings;
  322. end;
  323. {$else HASINTF}
  324. IStringsAdapter = class(TObject);
  325. {$endif HASINTF}
  326. { TStrings class }
  327. TStrings = class(TPersistent)
  328. private
  329. FUpdateCount: Integer;
  330. FAdapter: IStringsAdapter;
  331. function GetCommaText: string;
  332. function GetName(Index: Integer): string;
  333. function GetValue(const Name: string): string;
  334. procedure ReadData(Reader: TReader);
  335. procedure SetCommaText(const Value: string);
  336. procedure SetStringsAdapter(const Value: IStringsAdapter);
  337. procedure SetValue(const Name, Value: string);
  338. procedure WriteData(Writer: TWriter);
  339. protected
  340. procedure DefineProperties(Filer: TFiler); override;
  341. procedure Error(const Msg: string; Data: Integer);
  342. function Get(Index: Integer): string; virtual; abstract;
  343. function GetCapacity: Integer; virtual;
  344. function GetCount: Integer; virtual; abstract;
  345. function GetObject(Index: Integer): TObject; virtual;
  346. function GetTextStr: string; virtual;
  347. procedure Put(Index: Integer; const S: string); virtual;
  348. procedure PutObject(Index: Integer; AObject: TObject); virtual;
  349. procedure SetCapacity(NewCapacity: Integer); virtual;
  350. procedure SetTextStr(const Value: string); virtual;
  351. procedure SetUpdateState(Updating: Boolean); virtual;
  352. public
  353. destructor Destroy; override;
  354. function Add(const S: string): Integer; virtual;
  355. function AddObject(const S: string; AObject: TObject): Integer; virtual;
  356. procedure Append(const S: string);
  357. procedure AddStrings(TheStrings: TStrings); virtual;
  358. procedure Assign(Source: TPersistent); override;
  359. procedure BeginUpdate;
  360. procedure Clear; virtual; abstract;
  361. procedure Delete(Index: Integer); virtual; abstract;
  362. procedure EndUpdate;
  363. function Equals(TheStrings: TStrings): Boolean;
  364. procedure Exchange(Index1, Index2: Integer); virtual;
  365. function GetText: PChar; virtual;
  366. function IndexOf(const S: string): Integer; virtual;
  367. function IndexOfName(const Name: string): Integer;
  368. function IndexOfObject(AObject: TObject): Integer;
  369. procedure Insert(Index: Integer; const S: string); virtual; abstract;
  370. procedure InsertObject(Index: Integer; const S: string;
  371. AObject: TObject);
  372. procedure LoadFromFile(const FileName: string); virtual;
  373. procedure LoadFromStream(Stream: TStream); virtual;
  374. procedure Move(CurIndex, NewIndex: Integer); virtual;
  375. procedure SaveToFile(const FileName: string); virtual;
  376. procedure SaveToStream(Stream: TStream); virtual;
  377. procedure SetText(TheText: PChar); virtual;
  378. property Capacity: Integer read GetCapacity write SetCapacity;
  379. property CommaText: string read GetCommaText write SetCommaText;
  380. property Count: Integer read GetCount;
  381. property Names[Index: Integer]: string read GetName;
  382. property Objects[Index: Integer]: TObject read GetObject write PutObject;
  383. property Values[const Name: string]: string read GetValue write SetValue;
  384. property Strings[Index: Integer]: string read Get write Put; default;
  385. property Text: string read GetTextStr write SetTextStr;
  386. property StringsAdapter: IStringsAdapter read FAdapter write SetStringsAdapter;
  387. end;
  388. { TStringList class }
  389. TDuplicates = (dupIgnore, dupAccept, dupError);
  390. TStringList = class;
  391. PStringItem = ^TStringItem;
  392. TStringItem = record
  393. FString: string;
  394. FObject: TObject;
  395. end;
  396. PStringItemList = ^TStringItemList;
  397. TStringItemList = array[0..MaxListSize] of TStringItem;
  398. TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
  399. TStringList = class(TStrings)
  400. private
  401. FList: PStringItemList;
  402. FCount: Integer;
  403. FCapacity: Integer;
  404. FSorted: Boolean;
  405. FDuplicates: TDuplicates;
  406. FOnChange: TNotifyEvent;
  407. FOnChanging: TNotifyEvent;
  408. procedure ExchangeItems(Index1, Index2: Integer);
  409. procedure Grow;
  410. procedure QuickSort(L, R: Integer; CompareFn: TStringListSortCompare);
  411. procedure InsertItem(Index: Integer; const S: string);
  412. procedure SetSorted(Value: Boolean);
  413. protected
  414. procedure Changed; virtual;
  415. procedure Changing; virtual;
  416. function Get(Index: Integer): string; override;
  417. function GetCapacity: Integer; override;
  418. function GetCount: Integer; override;
  419. function GetObject(Index: Integer): TObject; override;
  420. procedure Put(Index: Integer; const S: string); override;
  421. procedure PutObject(Index: Integer; AObject: TObject); override;
  422. procedure SetCapacity(NewCapacity: Integer); override;
  423. procedure SetUpdateState(Updating: Boolean); override;
  424. public
  425. destructor Destroy; override;
  426. function Add(const S: string): Integer; override;
  427. procedure Clear; override;
  428. procedure Delete(Index: Integer); override;
  429. procedure Exchange(Index1, Index2: Integer); override;
  430. function Find(const S: string; var Index: Integer): Boolean; virtual;
  431. function IndexOf(const S: string): Integer; override;
  432. procedure Insert(Index: Integer; const S: string); override;
  433. procedure Sort; virtual;
  434. procedure CustomSort(CompareFn: TStringListSortCompare);
  435. property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  436. property Sorted: Boolean read FSorted write SetSorted;
  437. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  438. property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  439. end;
  440. { TStream abstract class }
  441. TStream = class(TObject)
  442. private
  443. {$ifdef seek64bit}
  444. function GetPosition: Int64;
  445. procedure SetPosition(Pos: Int64);
  446. function GetSize: Int64;
  447. procedure SetSize64(NewSize: Int64);
  448. {$else seek64bit}
  449. function GetPosition: Longint;
  450. procedure SetPosition(Pos: Longint);
  451. function GetSize: Longint;
  452. {$endif seek64bit}
  453. protected
  454. {$ifdef seek64bit}
  455. procedure SetSize(NewSize: Longint); virtual;overload;
  456. procedure SetSize(NewSize: Int64); virtual;overload;
  457. {$else seek64bit}
  458. procedure SetSize(NewSize: Longint); virtual;
  459. {$endif seek64bit}
  460. public
  461. function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
  462. function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
  463. {$ifdef seek64bit}
  464. function Seek(Offset: Longint; Origin: Word): Longint; virtual; overload;
  465. function Seek(Offset: Int64; Origin: TSeekOrigin): Int64; virtual; overload;
  466. {$else seek64bit}
  467. function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;
  468. {$endif seek64bit}
  469. procedure ReadBuffer(var Buffer; Count: Longint);
  470. procedure WriteBuffer(const Buffer; Count: Longint);
  471. function CopyFrom(Source: TStream; Count: Int64): Int64;
  472. function ReadComponent(Instance: TComponent): TComponent;
  473. function ReadComponentRes(Instance: TComponent): TComponent;
  474. procedure WriteComponent(Instance: TComponent);
  475. procedure WriteComponentRes(const ResName: string; Instance: TComponent);
  476. procedure WriteDescendent(Instance, Ancestor: TComponent);
  477. procedure WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent);
  478. procedure WriteResourceHeader(const ResName: string; {!!!:out} var FixupInfo: Integer);
  479. procedure FixupResourceHeader(FixupInfo: Integer);
  480. procedure ReadResHeader;
  481. function ReadByte : Byte;
  482. function ReadWord : Word;
  483. function ReadDWord : Cardinal;
  484. function ReadAnsiString : String;
  485. procedure WriteByte(b : Byte);
  486. procedure WriteWord(w : Word);
  487. procedure WriteDWord(d : Cardinal);
  488. Procedure WriteAnsiString (S : String);
  489. {$ifdef seek64bit}
  490. property Position: Int64 read GetPosition write SetPosition;
  491. property Size: Int64 read GetSize write SetSize64;
  492. {$else seek64bit}
  493. property Position: Longint read GetPosition write SetPosition;
  494. property Size: Longint read GetSize write SetSize;
  495. {$endif seek64bit}
  496. end;
  497. {$ifdef HASINTF}
  498. IStreamPersist = interface ['{B8CD12A3-267A-11D4-83DA-00C04F60B2DD}']
  499. procedure LoadFromStream(Stream: TStream);
  500. procedure SaveToStream(Stream: TStream);
  501. end;
  502. {$endif HASINTF}
  503. { THandleStream class }
  504. THandleStream = class(TStream)
  505. private
  506. FHandle: Integer;
  507. protected
  508. {$ifdef seek64bit}
  509. procedure SetSize(NewSize: Longint); override;
  510. procedure SetSize(NewSize: Int64); override;
  511. {$else seek64bit}
  512. procedure SetSize(NewSize: Longint); override;
  513. {$endif seek64bit}
  514. public
  515. constructor Create(AHandle: Integer);
  516. function Read(var Buffer; Count: Longint): Longint; override;
  517. function Write(const Buffer; Count: Longint): Longint; override;
  518. {$ifdef seek64bit}
  519. function Seek(Offset: Int64; Origin: TSeekOrigin): Int64; override;
  520. {$else seek64bit}
  521. function Seek(Offset: Longint; Origin: Word): Longint; override;
  522. {$endif seek64bit}
  523. property Handle: Integer read FHandle;
  524. end;
  525. { TFileStream class }
  526. TFileStream = class(THandleStream)
  527. Private
  528. FFileName : String;
  529. public
  530. constructor Create(const AFileName: string; Mode: Word);
  531. constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal);
  532. destructor Destroy; override;
  533. property FileName : String Read FFilename;
  534. end;
  535. { TCustomMemoryStream abstract class }
  536. TCustomMemoryStream = class(TStream)
  537. private
  538. FMemory: Pointer;
  539. FSize, FPosition: Longint;
  540. protected
  541. procedure SetPointer(Ptr: Pointer; ASize: Longint);
  542. public
  543. function Read(var Buffer; Count: Longint): Longint; override;
  544. function Seek(Offset: Longint; Origin: Word): Longint; override;
  545. procedure SaveToStream(Stream: TStream);
  546. procedure SaveToFile(const FileName: string);
  547. property Memory: Pointer read FMemory;
  548. end;
  549. { TMemoryStream }
  550. TMemoryStream = class(TCustomMemoryStream)
  551. private
  552. FCapacity: Longint;
  553. procedure SetCapacity(NewCapacity: Longint);
  554. protected
  555. function Realloc(var NewCapacity: Longint): Pointer; virtual;
  556. property Capacity: Longint read FCapacity write SetCapacity;
  557. public
  558. destructor Destroy; override;
  559. procedure Clear;
  560. procedure LoadFromStream(Stream: TStream);
  561. procedure LoadFromFile(const FileName: string);
  562. procedure SetSize(NewSize: Longint); override;
  563. function Write(const Buffer; Count: Longint): Longint; override;
  564. end;
  565. { TStringStream }
  566. TStringStream = class(TStream)
  567. private
  568. FDataString: string;
  569. FPosition: Integer;
  570. protected
  571. procedure SetSize(NewSize: Longint); override;
  572. public
  573. constructor Create(const AString: string);
  574. function Read(var Buffer; Count: Longint): Longint; override;
  575. function ReadString(Count: Longint): string;
  576. function Seek(Offset: Longint; Origin: Word): Longint; override;
  577. function Write(const Buffer; Count: Longint): Longint; override;
  578. procedure WriteString(const AString: string);
  579. property DataString: string read FDataString;
  580. end;
  581. { TResourceStream }
  582. TResourceStream = class(TCustomMemoryStream)
  583. private
  584. HResInfo: HRSRC;
  585. HGlobal: THandle;
  586. procedure Initialize(Instance: THandle; Name, ResType: PChar);
  587. public
  588. constructor Create(Instance: THandle; const ResName: string; ResType: PChar);
  589. constructor CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);
  590. destructor Destroy; override;
  591. function Write(const Buffer; Count: Longint): Longint; override;
  592. end;
  593. { TStreamAdapter }
  594. { Implements OLE IStream on VCL TStream }
  595. { we don't need that yet
  596. TStreamAdapter = class(TInterfacedObject, IStream)
  597. private
  598. FStream: TStream;
  599. public
  600. constructor Create(Stream: TStream);
  601. function Read(pv: Pointer; cb: Longint;
  602. pcbRead: PLongint): HResult; stdcall;
  603. function Write(pv: Pointer; cb: Longint;
  604. pcbWritten: PLongint): HResult; stdcall;
  605. function Seek(dlibMove: Largeint; dwOrigin: Longint;
  606. out libNewPosition: Largeint): HResult; stdcall;
  607. function SetSize(libNewSize: Largeint): HResult; stdcall;
  608. function CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint;
  609. out cbWritten: Largeint): HResult; stdcall;
  610. function Commit(grfCommitFlags: Longint): HResult; stdcall;
  611. function Revert: HResult; stdcall;
  612. function LockRegion(libOffset: Largeint; cb: Largeint;
  613. dwLockType: Longint): HResult; stdcall;
  614. function UnlockRegion(libOffset: Largeint; cb: Largeint;
  615. dwLockType: Longint): HResult; stdcall;
  616. function Stat(out statstg: TStatStg;
  617. grfStatFlag: Longint): HResult; stdcall;
  618. function Clone(out stm: IStream): HResult; stdcall;
  619. end;
  620. }
  621. { TFiler }
  622. TValueType = (vaNull, vaList, vaInt8, vaInt16, vaInt32, vaExtended,
  623. vaString, vaIdent, vaFalse, vaTrue, vaBinary, vaSet, vaLString,
  624. vaNil, vaCollection, vaSingle, vaCurrency, vaDate, vaWString, vaInt64);
  625. TFilerFlag = (ffInherited, ffChildPos, ffInline);
  626. TFilerFlags = set of TFilerFlag;
  627. TReaderProc = procedure(Reader: TReader) of object;
  628. TWriterProc = procedure(Writer: TWriter) of object;
  629. TStreamProc = procedure(Stream: TStream) of object;
  630. TFiler = class(TObject)
  631. private
  632. FRoot: TComponent;
  633. FLookupRoot: TComponent;
  634. FAncestor: TPersistent;
  635. FIgnoreChildren: Boolean;
  636. protected
  637. procedure SetRoot(ARoot: TComponent); virtual;
  638. public
  639. procedure DefineProperty(const Name: string;
  640. ReadData: TReaderProc; WriteData: TWriterProc;
  641. HasData: Boolean); virtual; abstract;
  642. procedure DefineBinaryProperty(const Name: string;
  643. ReadData, WriteData: TStreamProc;
  644. HasData: Boolean); virtual; abstract;
  645. property Root: TComponent read FRoot write SetRoot;
  646. property LookupRoot: TComponent read FLookupRoot;
  647. property Ancestor: TPersistent read FAncestor write FAncestor;
  648. property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;
  649. end;
  650. { TComponent class reference type }
  651. TComponentClass = class of TComponent;
  652. { TReader }
  653. TAbstractObjectReader = class
  654. public
  655. function NextValue: TValueType; virtual; abstract;
  656. function ReadValue: TValueType; virtual; abstract;
  657. procedure BeginRootComponent; virtual; abstract;
  658. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  659. var CompClassName, CompName: String); virtual; abstract;
  660. function BeginProperty: String; virtual; abstract;
  661. { All ReadXXX methods are called _after_ the value type has been read! }
  662. procedure ReadBinary(const DestData: TMemoryStream); virtual; abstract;
  663. function ReadFloat: Extended; virtual; abstract;
  664. function ReadSingle: Single; virtual; abstract;
  665. {!!!: function ReadCurrency: Currency; virtual; abstract;}
  666. function ReadDate: TDateTime; virtual; abstract;
  667. function ReadIdent(ValueType: TValueType): String; virtual; abstract;
  668. function ReadInt8: ShortInt; virtual; abstract;
  669. function ReadInt16: SmallInt; virtual; abstract;
  670. function ReadInt32: LongInt; virtual; abstract;
  671. function ReadInt64: Int64; virtual; abstract;
  672. function ReadSet(EnumType: Pointer): Integer; virtual; abstract;
  673. function ReadStr: String; virtual; abstract;
  674. function ReadString(StringType: TValueType): String; virtual; abstract;
  675. procedure SkipComponent(SkipComponentInfos: Boolean); virtual; abstract;
  676. procedure SkipValue; virtual; abstract;
  677. end;
  678. TBinaryObjectReader = class(TAbstractObjectReader)
  679. private
  680. FStream: TStream;
  681. FBuffer: Pointer;
  682. FBufSize: Integer;
  683. FBufPos: Integer;
  684. FBufEnd: Integer;
  685. procedure Read(var Buf; Count: LongInt);
  686. procedure SkipProperty;
  687. procedure SkipSetBody;
  688. public
  689. constructor Create(Stream: TStream; BufSize: Integer);
  690. destructor Destroy; override;
  691. function NextValue: TValueType; override;
  692. function ReadValue: TValueType; override;
  693. procedure BeginRootComponent; override;
  694. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  695. var CompClassName, CompName: String); override;
  696. function BeginProperty: String; override;
  697. procedure ReadBinary(const DestData: TMemoryStream); override;
  698. function ReadFloat: Extended; override;
  699. function ReadSingle: Single; override;
  700. {!!!: function ReadCurrency: Currency; override;}
  701. function ReadDate: TDateTime; override;
  702. function ReadIdent(ValueType: TValueType): String; override;
  703. function ReadInt8: ShortInt; override;
  704. function ReadInt16: SmallInt; override;
  705. function ReadInt32: LongInt; override;
  706. function ReadInt64: Int64; override;
  707. function ReadSet(EnumType: Pointer): Integer; override;
  708. function ReadStr: String; override;
  709. function ReadString(StringType: TValueType): String; override;
  710. procedure SkipComponent(SkipComponentInfos: Boolean); override;
  711. procedure SkipValue; override;
  712. end;
  713. TFindMethodEvent = procedure(Reader: TReader; const MethodName: string;
  714. var Address: Pointer; var Error: Boolean) of object;
  715. TSetMethodPropertyEvent = procedure(Reader: TReader; Instance: TPersistent;
  716. PropInfo: PPropInfo; const TheMethodName: string;
  717. var Handled: boolean) of object;
  718. TSetNameEvent = procedure(Reader: TReader; Component: TComponent;
  719. var Name: string) of object;
  720. TReferenceNameEvent = procedure(Reader: TReader; var Name: string) of object;
  721. TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string;
  722. ComponentClass: TPersistentClass; var Component: TComponent) of object;
  723. TReadComponentsProc = procedure(Component: TComponent) of object;
  724. TReaderError = procedure(Reader: TReader; const Message: string;
  725. var Handled: Boolean) of object;
  726. TPropertyNotFoundEvent = procedure(Reader: TReader; Instance: TPersistent;
  727. var PropName: string; IsPath: boolean; var Handled, Skip: Boolean) of object;
  728. TFindComponentClassEvent = procedure(Reader: TReader; const ClassName: string;
  729. var ComponentClass: TComponentClass) of object;
  730. TCreateComponentEvent = procedure(Reader: TReader;
  731. ComponentClass: TComponentClass; var Component: TComponent) of object;
  732. TReader = class(TFiler)
  733. private
  734. FDriver: TAbstractObjectReader;
  735. FOwner: TComponent;
  736. FParent: TComponent;
  737. FFixups: TList;
  738. FLoaded: TList;
  739. FOnFindMethod: TFindMethodEvent;
  740. FOnSetMethodProperty: TSetMethodPropertyEvent;
  741. FOnSetName: TSetNameEvent;
  742. FOnReferenceName: TReferenceNameEvent;
  743. FOnAncestorNotFound: TAncestorNotFoundEvent;
  744. FOnError: TReaderError;
  745. FOnPropertyNotFound: TPropertyNotFoundEvent;
  746. FOnFindComponentClass: TFindComponentClassEvent;
  747. FOnCreateComponent: TCreateComponentEvent;
  748. FPropName: string;
  749. FCanHandleExcepts: Boolean;
  750. procedure DoFixupReferences;
  751. procedure FreeFixups;
  752. function FindComponentClass(const AClassName: string): TComponentClass;
  753. protected
  754. function Error(const Message: string): Boolean; virtual;
  755. function FindMethod(ARoot: TComponent; const AMethodName: string): Pointer; virtual;
  756. procedure ReadProperty(AInstance: TPersistent);
  757. procedure ReadPropValue(Instance: TPersistent; PropInfo: Pointer);
  758. procedure PropertyError;
  759. procedure ReadData(Instance: TComponent);
  760. property PropName: string read FPropName;
  761. property CanHandleExceptions: Boolean read FCanHandleExcepts;
  762. public
  763. constructor Create(Stream: TStream; BufSize: Integer);
  764. destructor Destroy; override;
  765. procedure BeginReferences;
  766. procedure CheckValue(Value: TValueType);
  767. procedure DefineProperty(const Name: string;
  768. AReadData: TReaderProc; WriteData: TWriterProc;
  769. HasData: Boolean); override;
  770. procedure DefineBinaryProperty(const Name: string;
  771. AReadData, WriteData: TStreamProc;
  772. HasData: Boolean); override;
  773. function EndOfList: Boolean;
  774. procedure EndReferences;
  775. procedure FixupReferences;
  776. function NextValue: TValueType;
  777. function ReadBoolean: Boolean;
  778. function ReadChar: Char;
  779. procedure ReadCollection(Collection: TCollection);
  780. function ReadComponent(Component: TComponent): TComponent;
  781. procedure ReadComponents(AOwner, AParent: TComponent;
  782. Proc: TReadComponentsProc);
  783. function ReadFloat: Extended;
  784. function ReadSingle: Single;
  785. {!!!: function ReadCurrency: Currency;}
  786. function ReadDate: TDateTime;
  787. function ReadIdent: string;
  788. function ReadInteger: Longint;
  789. function ReadInt64: Int64;
  790. procedure ReadListBegin;
  791. procedure ReadListEnd;
  792. function ReadRootComponent(ARoot: TComponent): TComponent;
  793. function ReadString: string;
  794. {!!!: function ReadWideString: WideString;}
  795. function ReadValue: TValueType;
  796. procedure CopyValue(Writer: TWriter);
  797. property Driver: TAbstractObjectReader read FDriver;
  798. property Owner: TComponent read FOwner write FOwner;
  799. property Parent: TComponent read FParent write FParent;
  800. property OnError: TReaderError read FOnError write FOnError;
  801. property OnPropertyNotFound: TPropertyNotFoundEvent read FOnPropertyNotFound write FOnPropertyNotFound;
  802. property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;
  803. property OnSetMethodProperty: TSetMethodPropertyEvent read FOnSetMethodProperty write FOnSetMethodProperty;
  804. property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;
  805. property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;
  806. property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;
  807. property OnCreateComponent: TCreateComponentEvent read FOnCreateComponent write FOnCreateComponent;
  808. property OnFindComponentClass: TFindComponentClassEvent read FOnFindComponentClass write FOnFindComponentClass;
  809. end;
  810. { TWriter }
  811. TAbstractObjectWriter = class
  812. public
  813. { Begin/End markers. Those ones who don't have an end indicator, use
  814. "EndList", after the occurrence named in the comment. Note that this
  815. only counts for "EndList" calls on the same level; each BeginXXX call
  816. increases the current level. }
  817. procedure BeginCollection; virtual; abstract; { Ends with the next "EndList" }
  818. procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
  819. ChildPos: Integer); virtual; abstract; { Ends after the second "EndList" }
  820. procedure BeginList; virtual; abstract;
  821. procedure EndList; virtual; abstract;
  822. procedure BeginProperty(const PropName: String); virtual; abstract;
  823. procedure EndProperty; virtual; abstract;
  824. procedure WriteBinary(const Buffer; Count: Longint); virtual; abstract;
  825. procedure WriteBoolean(Value: Boolean); virtual; abstract;
  826. // procedure WriteChar(Value: Char);
  827. procedure WriteFloat(const Value: Extended); virtual; abstract;
  828. procedure WriteSingle(const Value: Single); virtual; abstract;
  829. {!!!: procedure WriteCurrency(const Value: Currency); virtual; abstract;}
  830. procedure WriteDate(const Value: TDateTime); virtual; abstract;
  831. procedure WriteIdent(const Ident: string); virtual; abstract;
  832. procedure WriteInteger(Value: Int64); virtual; abstract;
  833. procedure WriteMethodName(const Name: String); virtual; abstract;
  834. procedure WriteSet(Value: LongInt; SetType: Pointer); virtual; abstract;
  835. procedure WriteString(const Value: String); virtual; abstract;
  836. end;
  837. TBinaryObjectWriter = class(TAbstractObjectWriter)
  838. private
  839. FStream: TStream;
  840. FBuffer: Pointer;
  841. FBufSize: Integer;
  842. FBufPos: Integer;
  843. FBufEnd: Integer;
  844. FSignatureWritten: Boolean;
  845. procedure FlushBuffer;
  846. procedure Write(const Buffer; Count: Longint);
  847. procedure WriteValue(Value: TValueType);
  848. procedure WriteStr(const Value: String);
  849. public
  850. constructor Create(Stream: TStream; BufSize: Integer);
  851. destructor Destroy; override;
  852. procedure BeginCollection; override;
  853. procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
  854. ChildPos: Integer); override;
  855. procedure BeginList; override;
  856. procedure EndList; override;
  857. procedure BeginProperty(const PropName: String); override;
  858. procedure EndProperty; override;
  859. procedure WriteBinary(const Buffer; Count: LongInt); override;
  860. procedure WriteBoolean(Value: Boolean); override;
  861. procedure WriteFloat(const Value: Extended); override;
  862. procedure WriteSingle(const Value: Single); override;
  863. {!!!: procedure WriteCurrency(const Value: Currency); override;}
  864. procedure WriteDate(const Value: TDateTime); override;
  865. procedure WriteIdent(const Ident: string); override;
  866. procedure WriteInteger(Value: Int64); override;
  867. procedure WriteMethodName(const Name: String); override;
  868. procedure WriteSet(Value: LongInt; SetType: Pointer); override;
  869. procedure WriteString(const Value: String); override;
  870. end;
  871. TTextObjectWriter = class(TAbstractObjectWriter)
  872. end;
  873. TFindAncestorEvent = procedure (Writer: TWriter; Component: TComponent;
  874. const Name: string; var Ancestor, RootAncestor: TComponent) of object;
  875. TWriteMethodPropertyEvent = procedure (Writer: TWriter; Instance: TPersistent;
  876. PropInfo: PPropInfo; const MethodValue: TMethod;
  877. const DefMethodCodeValue: Pointer; var Handled: boolean) of object;
  878. TWriter = class(TFiler)
  879. private
  880. FDriver: TAbstractObjectWriter;
  881. FDestroyDriver: Boolean;
  882. FRootAncestor: TComponent;
  883. FPropPath: String;
  884. FAncestorList: TList;
  885. FAncestorPos: Integer;
  886. FChildPos: Integer;
  887. FOnFindAncestor: TFindAncestorEvent;
  888. FOnWriteMethodProperty: TWriteMethodPropertyEvent;
  889. procedure AddToAncestorList(Component: TComponent);
  890. procedure WriteComponentData(Instance: TComponent);
  891. protected
  892. procedure SetRoot(ARoot: TComponent); override;
  893. procedure WriteBinary(AWriteData: TStreamProc);
  894. procedure WriteProperty(Instance: TPersistent; PropInfo: Pointer);
  895. procedure WriteProperties(Instance: TPersistent);
  896. public
  897. constructor Create(ADriver: TAbstractObjectWriter);
  898. constructor Create(Stream: TStream; BufSize: Integer);
  899. destructor Destroy; override;
  900. procedure DefineProperty(const Name: string;
  901. ReadData: TReaderProc; AWriteData: TWriterProc;
  902. HasData: Boolean); override;
  903. procedure DefineBinaryProperty(const Name: string;
  904. ReadData, AWriteData: TStreamProc;
  905. HasData: Boolean); override;
  906. procedure WriteBoolean(Value: Boolean);
  907. procedure WriteCollection(Value: TCollection);
  908. procedure WriteComponent(Component: TComponent);
  909. procedure WriteChar(Value: Char);
  910. procedure WriteDescendent(ARoot: TComponent; AAncestor: TComponent);
  911. procedure WriteFloat(const Value: Extended);
  912. procedure WriteSingle(const Value: Single);
  913. {!!!: procedure WriteCurrency(const Value: Currency);}
  914. procedure WriteDate(const Value: TDateTime);
  915. procedure WriteIdent(const Ident: string);
  916. procedure WriteInteger(Value: Longint); overload;
  917. procedure WriteInteger(Value: Int64); overload;
  918. procedure WriteListBegin;
  919. procedure WriteListEnd;
  920. procedure WriteRootComponent(ARoot: TComponent);
  921. procedure WriteString(const Value: string);
  922. {!!!: procedure WriteWideString(const Value: WideString);}
  923. property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
  924. property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor;
  925. property OnWriteMethodProperty: TWriteMethodPropertyEvent read FOnWriteMethodProperty write FOnWriteMethodProperty;
  926. property Driver: TAbstractObjectWriter read FDriver;
  927. end;
  928. { TParser }
  929. TParser = class(TObject)
  930. private
  931. FStream: TStream;
  932. FOrigin: Longint;
  933. FBuffer: PChar;
  934. FBufPtr: PChar;
  935. FBufEnd: PChar;
  936. FSourcePtr: PChar;
  937. FSourceEnd: PChar;
  938. FTokenPtr: PChar;
  939. FStringPtr: PChar;
  940. FSourceLine: Integer;
  941. FSaveChar: Char;
  942. FToken: Char;
  943. procedure ReadBuffer;
  944. procedure SkipBlanks;
  945. public
  946. constructor Create(Stream: TStream);
  947. destructor Destroy; override;
  948. procedure CheckToken(T: Char);
  949. procedure CheckTokenSymbol(const S: string);
  950. procedure Error(const Ident: string);
  951. procedure ErrorFmt(const Ident: string; const Args: array of const);
  952. procedure ErrorStr(const Message: string);
  953. procedure HexToBinary(Stream: TStream);
  954. function NextToken: Char;
  955. function SourcePos: Longint;
  956. function TokenComponentIdent: String;
  957. function TokenFloat: Extended;
  958. function TokenInt: Longint;
  959. function TokenString: string;
  960. function TokenSymbolIs(const S: string): Boolean;
  961. property SourceLine: Integer read FSourceLine;
  962. property Token: Char read FToken;
  963. end;
  964. { TComponent class }
  965. TOperation = (opInsert, opRemove);
  966. TComponentState = set of (csLoading, csReading, csWriting, csDestroying,
  967. csDesigning, csAncestor, csUpdating, csFixups, csFreeNotification,
  968. csInline, csDesignInstance);
  969. TComponentStyle = set of (csInheritable, csCheckPropAvail);
  970. TGetChildProc = procedure (Child: TComponent) of object;
  971. {
  972. TComponentName = type string;
  973. IVCLComObject = interface
  974. function GetTypeInfoCount(out Count: Integer): Integer; stdcall;
  975. function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): Integer; stdcall;
  976. function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  977. NameCount, LocaleID: Integer; DispIDs: Pointer): Integer; stdcall;
  978. function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  979. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): Integer; stdcall;
  980. function SafeCallException(ExceptObject: TObject;
  981. ExceptAddr: Pointer): Integer;
  982. procedure FreeOnRelease;
  983. end;
  984. }
  985. TBasicAction = class;
  986. TComponent = class(TPersistent)
  987. private
  988. FOwner: TComponent;
  989. FName: TComponentName;
  990. FTag: Longint;
  991. FComponents: TList;
  992. FFreeNotifies: TList;
  993. FDesignInfo: Longint;
  994. FVCLComObject: Pointer;
  995. FComponentState: TComponentState;
  996. // function GetComObject: IUnknown;
  997. function GetComponent(AIndex: Integer): TComponent;
  998. function GetComponentCount: Integer;
  999. function GetComponentIndex: Integer;
  1000. procedure Insert(AComponent: TComponent);
  1001. procedure ReadLeft(Reader: TReader);
  1002. procedure ReadTop(Reader: TReader);
  1003. procedure Remove(AComponent: TComponent);
  1004. procedure RemoveNotification(AComponent: TComponent);
  1005. procedure SetComponentIndex(Value: Integer);
  1006. procedure SetReference(Enable: Boolean);
  1007. procedure WriteLeft(Writer: TWriter);
  1008. procedure WriteTop(Writer: TWriter);
  1009. protected
  1010. FComponentStyle: TComponentStyle;
  1011. procedure ChangeName(const NewName: TComponentName);
  1012. procedure DefineProperties(Filer: TFiler); override;
  1013. procedure GetChildren(Proc: TGetChildProc; Root: TComponent); dynamic;
  1014. function GetChildOwner: TComponent; dynamic;
  1015. function GetChildParent: TComponent; dynamic;
  1016. function GetNamePath: string; override;
  1017. function GetOwner: TPersistent; override;
  1018. procedure Loaded; virtual;
  1019. procedure Notification(AComponent: TComponent;
  1020. Operation: TOperation); virtual;
  1021. procedure ReadState(Reader: TReader); virtual;
  1022. procedure SetAncestor(Value: Boolean);
  1023. procedure SetDesigning(Value: Boolean);
  1024. procedure SetName(const NewName: TComponentName); virtual;
  1025. procedure SetChildOrder(Child: TComponent; Order: Integer); dynamic;
  1026. procedure SetParentComponent(Value: TComponent); dynamic;
  1027. procedure Updating; dynamic;
  1028. procedure Updated; dynamic;
  1029. class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); dynamic;
  1030. procedure ValidateRename(AComponent: TComponent;
  1031. const CurName, NewName: string); virtual;
  1032. procedure ValidateContainer(AComponent: TComponent); dynamic;
  1033. procedure ValidateInsert(AComponent: TComponent); dynamic;
  1034. { IUnknown }
  1035. //!!!!! function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
  1036. //!!!! function _AddRef: Integer; stdcall;
  1037. //!!!! function _Release: Integer; stdcall;
  1038. { IDispatch }
  1039. //!!!! function GetTypeInfoCount(out Count: Integer): Integer; stdcall;
  1040. //!!!! function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): Integer; stdcall;
  1041. //!!!! function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  1042. //!!!! NameCount, LocaleID: Integer; DispIDs: Pointer): Integer; stdcall;
  1043. //!!!! function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  1044. //!!!! Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): Integer; stdcall;
  1045. public
  1046. //!! Moved temporary
  1047. procedure WriteState(Writer: TWriter); virtual;
  1048. constructor Create(AOwner: TComponent); virtual;
  1049. destructor Destroy; override;
  1050. procedure DestroyComponents;
  1051. procedure Destroying;
  1052. function ExecuteAction(Action: TBasicAction): Boolean; dynamic;
  1053. function FindComponent(const AName: string): TComponent;
  1054. procedure FreeNotification(AComponent: TComponent);
  1055. procedure RemoveFreeNotification(AComponent: TComponent);
  1056. procedure FreeOnRelease;
  1057. function GetParentComponent: TComponent; dynamic;
  1058. function HasParent: Boolean; dynamic;
  1059. procedure InsertComponent(AComponent: TComponent);
  1060. procedure RemoveComponent(AComponent: TComponent);
  1061. function SafeCallException(ExceptObject: TObject;
  1062. ExceptAddr: Pointer): Integer; override;
  1063. function UpdateAction(Action: TBasicAction): Boolean; dynamic;
  1064. // property ComObject: IUnknown read GetComObject;
  1065. property Components[Index: Integer]: TComponent read GetComponent;
  1066. property ComponentCount: Integer read GetComponentCount;
  1067. property ComponentIndex: Integer read GetComponentIndex write SetComponentIndex;
  1068. property ComponentState: TComponentState read FComponentState;
  1069. property ComponentStyle: TComponentStyle read FComponentStyle;
  1070. property DesignInfo: Longint read FDesignInfo write FDesignInfo;
  1071. property Owner: TComponent read FOwner;
  1072. property VCLComObject: Pointer read FVCLComObject write FVCLComObject;
  1073. published
  1074. property Name: TComponentName read FName write SetName stored False;
  1075. property Tag: Longint read FTag write FTag default 0;
  1076. end;
  1077. { TBasicActionLink }
  1078. TBasicActionLink = class(TObject)
  1079. private
  1080. FOnChange: TNotifyEvent;
  1081. protected
  1082. FAction: TBasicAction;
  1083. procedure AssignClient(AClient: TObject); virtual;
  1084. procedure Change; virtual;
  1085. function IsOnExecuteLinked: Boolean; virtual;
  1086. procedure SetAction(Value: TBasicAction); virtual;
  1087. procedure SetOnExecute(Value: TNotifyEvent); virtual;
  1088. public
  1089. constructor Create(AClient: TObject); virtual;
  1090. destructor Destroy; override;
  1091. function Execute(AComponent: TComponent{$ifndef VER1_0} = nil{$endif}): Boolean; virtual;
  1092. function Update: Boolean; virtual;
  1093. property Action: TBasicAction read FAction write SetAction;
  1094. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  1095. end;
  1096. TBasicActionLinkClass = class of TBasicActionLink;
  1097. { TBasicAction }
  1098. TBasicAction = class(TComponent)
  1099. private
  1100. FActionComponent: TComponent;
  1101. FOnChange: TNotifyEvent;
  1102. FOnExecute: TNotifyEvent;
  1103. FOnUpdate: TNotifyEvent;
  1104. protected
  1105. FClients: TList;
  1106. procedure Change; virtual;
  1107. procedure SetOnExecute(Value: TNotifyEvent); virtual;
  1108. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  1109. public
  1110. constructor Create(AOwner: TComponent); override;
  1111. destructor Destroy; override;
  1112. function HandlesTarget(Target: TObject): Boolean; virtual;
  1113. procedure UpdateTarget(Target: TObject); virtual;
  1114. procedure ExecuteTarget(Target: TObject); virtual;
  1115. function Execute: Boolean; dynamic;
  1116. procedure RegisterChanges(Value: TBasicActionLink);
  1117. procedure UnRegisterChanges(Value: TBasicActionLink);
  1118. function Update: Boolean; virtual;
  1119. property ActionComponent: TComponent read FActionComponent write FActionComponent;
  1120. property OnExecute: TNotifyEvent read FOnExecute write SetOnExecute;
  1121. property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate;
  1122. end;
  1123. { TBasicAction class reference type }
  1124. TBasicActionClass = class of TBasicAction;
  1125. { Component registration handlers }
  1126. TActiveXRegType = (axrComponentOnly, axrIncludeDescendants);
  1127. {$ifdef HASINTF}
  1128. IInterfaceList = interface ['{285DEA8A-B865-11D1-AAA7-00C04FB17A72}']
  1129. function Get(i : Integer) : IUnknown;
  1130. function GetCapacity : Integer;
  1131. function GetCount : Integer;
  1132. procedure Put(i : Integer;item : IUnknown);
  1133. procedure SetCapacity(NewCapacity : Integer);
  1134. procedure SetCount(NewCount : Integer);
  1135. procedure Clear;
  1136. procedure Delete(index : Integer);
  1137. procedure Exchange(index1,index2 : Integer);
  1138. function First : IUnknown;
  1139. function IndexOf(item : IUnknown) : Integer;
  1140. function Add(item : IUnknown) : Integer;
  1141. procedure Insert(i : Integer;item : IUnknown);
  1142. function Last : IUnknown;
  1143. function Remove(item : IUnknown): Integer;
  1144. procedure Lock;
  1145. procedure Unlock;
  1146. property Capacity : Integer read GetCapacity write SetCapacity;
  1147. property Count : Integer read GetCount write SetCount;
  1148. property Items[index : Integer] : IUnknown read Get write Put;default;
  1149. end;
  1150. TInterfaceList = class(TInterfacedObject,IInterfaceList)
  1151. private
  1152. FList : TThreadList;
  1153. protected
  1154. function Get(i : Integer) : IUnknown;
  1155. function GetCapacity : Integer;
  1156. function GetCount : Integer;
  1157. procedure Put(i : Integer;item : IUnknown);
  1158. procedure SetCapacity(NewCapacity : Integer);
  1159. procedure SetCount(NewCount : Integer);
  1160. public
  1161. constructor Create;
  1162. destructor Destroy;
  1163. procedure Clear;
  1164. procedure Delete(index : Integer);
  1165. procedure Exchange(index1,index2 : Integer);
  1166. function First : IUnknown;
  1167. function IndexOf(item : IUnknown) : Integer;
  1168. function Add(item : IUnknown) : Integer;
  1169. procedure Insert(i : Integer;item : IUnknown);
  1170. function Last : IUnknown;
  1171. function Remove(item : IUnknown): Integer;
  1172. procedure Lock;
  1173. procedure Unlock;
  1174. function Expand : TInterfaceList;
  1175. property Capacity : Integer read GetCapacity write SetCapacity;
  1176. property Count : Integer read GetCount write SetCount;
  1177. property Items[Index : Integer] : IUnknown read Get write Put;default;
  1178. end;
  1179. {$endif HASINTF}
  1180. { ---------------------------------------------------------------------
  1181. TDatamodule support
  1182. ---------------------------------------------------------------------}
  1183. TDataModule = class(TComponent)
  1184. private
  1185. FDPos: TPoint;
  1186. FDSize: TPoint;
  1187. FOnCreate: TNotifyEvent;
  1188. FOnDestroy: TNotifyEvent;
  1189. FOldOrder : Boolean;
  1190. Procedure ReadT(Reader: TReader);
  1191. Procedure WriteT(Writer: TWriter);
  1192. Procedure ReadL(Reader: TReader);
  1193. Procedure WriteL(Writer: TWriter);
  1194. Procedure ReadW(Reader: TReader);
  1195. Procedure WriteW(Writer: TWriter);
  1196. Procedure ReadH(Reader: TReader);
  1197. Procedure WriteH(Writer: TWriter);
  1198. protected
  1199. Procedure DoCreate; virtual;
  1200. Procedure DoDestroy; virtual;
  1201. Procedure DefineProperties(Filer: TFiler); override;
  1202. Procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  1203. Function HandleCreateException: Boolean; virtual;
  1204. Procedure ReadState(Reader: TReader); override;
  1205. public
  1206. constructor Create(AOwner: TComponent); override;
  1207. Constructor CreateNew(AOwner: TComponent);
  1208. Constructor CreateNew(AOwner: TComponent; CreateMode: Integer); virtual;
  1209. destructor Destroy; override;
  1210. Procedure AfterConstruction; override;
  1211. Procedure BeforeDestruction; override;
  1212. property DesignOffset: TPoint read FDPos write FDPos;
  1213. property DesignSize: TPoint read FDSize write FDSize;
  1214. published
  1215. property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  1216. property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
  1217. property OldCreateOrder: Boolean read FOldOrder write FOldOrder;
  1218. end;
  1219. var
  1220. // IDE hooks for TDatamodule support.
  1221. AddDataModule : procedure (DataModule: TDataModule) of object;
  1222. RemoveDataModule : procedure (DataModule: TDataModule) of object;
  1223. ApplicationHandleException : procedure (Sender: TObject) of object;
  1224. ApplicationShowException : procedure (E: Exception) of object;
  1225. { ---------------------------------------------------------------------
  1226. General streaming and registration routines
  1227. ---------------------------------------------------------------------}
  1228. var
  1229. RegisterComponentsProc: procedure(const Page: string;
  1230. ComponentClasses: array of TComponentClass);
  1231. RegisterNoIconProc: procedure(ComponentClasses: array of TComponentClass);
  1232. {!!!! RegisterNonActiveXProc: procedure(ComponentClasses: array of TComponentClass;
  1233. AxRegType: TActiveXRegType) = nil;
  1234. CurrentGroup: Integer = -1;
  1235. CreateVCLComObjectProc: procedure(Component: TComponent) = nil;}
  1236. { Point and rectangle constructors }
  1237. function Point(AX, AY: Integer): TPoint;
  1238. function SmallPoint(AX, AY: SmallInt): TSmallPoint;
  1239. function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;
  1240. function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
  1241. { Class registration routines }
  1242. procedure RegisterClass(AClass: TPersistentClass);
  1243. procedure RegisterClasses(AClasses: array of TPersistentClass);
  1244. procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
  1245. procedure UnRegisterClass(AClass: TPersistentClass);
  1246. procedure UnRegisterClasses(AClasses: array of TPersistentClass);
  1247. procedure UnRegisterModuleClasses(Module: HMODULE);
  1248. function FindClass(const AClassName: string): TPersistentClass;
  1249. function GetClass(const AClassName: string): TPersistentClass;
  1250. { Component registration routines }
  1251. procedure RegisterComponents(const Page: string;
  1252. ComponentClasses: array of TComponentClass);
  1253. procedure RegisterNoIcon(ComponentClasses: array of TComponentClass);
  1254. procedure RegisterNonActiveX(ComponentClasses: array of TComponentClass;
  1255. AxRegType: TActiveXRegType);
  1256. {!!!: var
  1257. GlobalNameSpace: TMultiReadExclusiveWriteSynchronizer;}
  1258. { Object filing routines }
  1259. type
  1260. TIdentMapEntry = record
  1261. Value: Integer;
  1262. Name: String;
  1263. end;
  1264. TIdentToInt = function(const Ident: string; var Int: Longint): Boolean;
  1265. TIntToIdent = function(Int: Longint; var Ident: string): Boolean;
  1266. TFindGlobalComponent = function(const Name: string): TComponent;
  1267. TInitComponentHandler = function(Instance: TComponent; RootAncestor : TClass): boolean;
  1268. var
  1269. MainThreadID: THandle;
  1270. FindGlobalComponent: TFindGlobalComponent;
  1271. procedure RegisterIntegerConsts(IntegerType: Pointer; IdentToIntFn: TIdentToInt;
  1272. IntToIdentFn: TIntToIdent);
  1273. function IdentToInt(const Ident: string; var Int: Longint; const Map: array of TIdentMapEntry): Boolean;
  1274. function IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean;
  1275. function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
  1276. function InitComponentRes(const ResName: string; Instance: TComponent): Boolean;
  1277. function ReadComponentRes(const ResName: string; Instance: TComponent): TComponent;
  1278. function ReadComponentResEx(HInstance: THandle; const ResName: string): TComponent;
  1279. function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
  1280. procedure WriteComponentResFile(const FileName: string; Instance: TComponent);
  1281. procedure RegisterInitComponentHandler(ComponentClass: TComponentClass; Handler: TInitComponentHandler);
  1282. procedure GlobalFixupReferences;
  1283. procedure GetFixupReferenceNames(Root: TComponent; Names: TStrings);
  1284. procedure GetFixupInstanceNames(Root: TComponent;
  1285. const ReferenceRootName: string; Names: TStrings);
  1286. procedure RedirectFixupReferences(Root: TComponent; const OldRootName,
  1287. NewRootName: string);
  1288. procedure RemoveFixupReferences(Root: TComponent; const RootName: string);
  1289. procedure RemoveFixups(Instance: TPersistent);
  1290. function FindNestedComponent(Root: TComponent; const NamePath: string): TComponent;
  1291. procedure BeginGlobalLoading;
  1292. procedure NotifyGlobalLoading;
  1293. procedure EndGlobalLoading;
  1294. function CollectionsEqual(C1, C2: TCollection): Boolean;
  1295. { Object conversion routines }
  1296. procedure ObjectBinaryToText(Input, Output: TStream);
  1297. procedure ObjectTextToBinary(Input, Output: TStream);
  1298. procedure ObjectResourceToText(Input, Output: TStream);
  1299. procedure ObjectTextToResource(Input, Output: TStream);
  1300. { Utility routines }
  1301. function LineStart(Buffer, BufPos: PChar): PChar;
  1302. {
  1303. $Log$
  1304. Revision 1.2 2003-10-07 19:41:11 marco
  1305. * 1.0.x compability fix
  1306. Revision 1.1 2003/10/06 20:33:58 peter
  1307. * classes moved to rtl for 1.1
  1308. * classes .inc and classes.pp files moved to fcl/classes for
  1309. backwards 1.0.x compatiblity to have it in the fcl
  1310. Revision 1.25 2003/08/16 15:50:47 michael
  1311. + Fix from Mattias gaertner for IDE support
  1312. Revision 1.24 2003/06/04 15:27:24 michael
  1313. + TDataModule en InitInheritedComponent erbij voor Delphi 6 compatibility
  1314. Revision 1.23 2002/10/14 19:46:50 peter
  1315. * use FPC_THREADING define for removing thread dependent code
  1316. Revision 1.22 2002/09/07 15:15:24 peter
  1317. * old logs removed and tabs fixed
  1318. Revision 1.21 2002/07/16 13:32:51 florian
  1319. + skeleton for TInterfaceList added
  1320. Revision 1.20 2002/07/15 18:35:04 florian
  1321. + IInterfaceList added
  1322. Revision 1.19 2002/03/28 12:08:47 michael
  1323. + Added sstriple and ssquad in shiftstate
  1324. Revision 1.18 2002/01/06 21:54:49 peter
  1325. * action classes added
  1326. }