classesh.inc 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409
  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. { We NEED ansistrings !!}
  12. {$H+}
  13. type
  14. { extra types to compile with FPC }
  15. TRTLCriticalSection = class(TObject);
  16. HRSRC = longint;
  17. THANDLE = longint;
  18. TComponentName = string;
  19. IUnKnown = class(TObject);
  20. TGUID = longint;
  21. HMODULE = longint;
  22. TPoint = record
  23. x,y : integer;
  24. end;
  25. TSmallPoint = record
  26. x,y : smallint;
  27. end;
  28. TRect = record
  29. Left,Right,Top,Bottom : Integer;
  30. end;
  31. const
  32. { Maximum TList size }
  33. MaxListSize = Maxint div 16;
  34. { values for TShortCut }
  35. scShift = $2000;
  36. scCtrl = $4000;
  37. scAlt = $8000;
  38. scNone = 0;
  39. { TStream seek origins }
  40. soFromBeginning = 0;
  41. soFromCurrent = 1;
  42. soFromEnd = 2;
  43. { TFileStream create mode }
  44. fmCreate = $FFFF;
  45. fmOpenRead = 0;
  46. fmOpenWrite = 1;
  47. fmOpenReadWrite = 2;
  48. { TParser special tokens }
  49. toEOF = Char(0);
  50. toSymbol = Char(1);
  51. toString = Char(2);
  52. toInteger = Char(3);
  53. toFloat = Char(4);
  54. Const
  55. FilerSignature : Array[1..4] of char = 'TPF0';
  56. type
  57. { Text alignment types }
  58. TAlignment = (taLeftJustify, taRightJustify, taCenter);
  59. { TLeftRight = taLeftJustify..taRightJustify; }
  60. { Types used by standard events }
  61. TShiftState = set of (ssShift, ssAlt, ssCtrl,
  62. ssLeft, ssRight, ssMiddle, ssDouble,
  63. // Extra additions
  64. ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum, ssScroll);
  65. { THelpContext = -MaxLongint..MaxLongint; }
  66. { Standard events }
  67. TNotifyEvent = procedure(Sender: TObject) of object;
  68. THelpEvent = function (Command: Word; Data: Longint;
  69. var CallHelp: Boolean): Boolean of object;
  70. TGetStrProc = procedure(const S: string) of object;
  71. { Exception classes }
  72. EStreamError = class(Exception);
  73. EFCreateError = class(EStreamError);
  74. EFOpenError = class(EStreamError);
  75. EFilerError = class(EStreamError);
  76. EReadError = class(EFilerError);
  77. EWriteError = class(EFilerError);
  78. EClassNotFound = class(EFilerError);
  79. EMethodNotFound = class(EFilerError);
  80. EInvalidImage = class(EFilerError);
  81. EResNotFound = class(Exception);
  82. EListError = class(Exception);
  83. EBitsError = class(Exception);
  84. EStringListError = class(Exception);
  85. EComponentError = class(Exception);
  86. EParserError = class(Exception);
  87. EOutOfResources = class(EOutOfMemory);
  88. EInvalidOperation = class(Exception);
  89. { Forward class declarations }
  90. TStream = class;
  91. TAbstractFiler = Class;
  92. TAbstractWriter = Class;
  93. TAbstractReader = Class;
  94. TFiler = class;
  95. TReader = class;
  96. TWriter = class;
  97. TComponent = class;
  98. { TList class }
  99. PPointerList = ^TPointerList;
  100. TPointerList = array[0..MaxListSize - 1] of Pointer;
  101. TListSortCompare = function (Item1, Item2: Pointer): Integer;
  102. TList = class(TObject)
  103. private
  104. FList: PPointerList;
  105. FCount: Integer;
  106. FCapacity: Integer;
  107. protected
  108. function Get(Index: Integer): Pointer;
  109. procedure Grow; virtual;
  110. procedure Put(Index: Integer; Item: Pointer);
  111. procedure SetCapacity(NewCapacity: Integer);
  112. procedure SetCount(NewCount: Integer);
  113. public
  114. destructor Destroy; override;
  115. function Add(Item: Pointer): Integer;
  116. procedure Clear;
  117. procedure Delete(Index: Integer);
  118. class procedure Error(const Msg: string; Data: Integer); virtual;
  119. procedure Exchange(Index1, Index2: Integer);
  120. function Expand: TList;
  121. function First: Pointer;
  122. function IndexOf(Item: Pointer): Integer;
  123. procedure Insert(Index: Integer; Item: Pointer);
  124. function Last: Pointer;
  125. procedure Move(CurIndex, NewIndex: Integer);
  126. function Remove(Item: Pointer): Integer;
  127. procedure Pack;
  128. procedure Sort(Compare: TListSortCompare);
  129. property Capacity: Integer read FCapacity write SetCapacity;
  130. property Count: Integer read FCount write SetCount;
  131. property Items[Index: Integer]: Pointer read Get write Put; default;
  132. property List: PPointerList read FList;
  133. end;
  134. { TThreadList class }
  135. TThreadList = class
  136. private
  137. FList: TList;
  138. FLock: TRTLCriticalSection;
  139. public
  140. constructor Create;
  141. destructor Destroy; { override; }
  142. procedure Add(Item: Pointer);
  143. procedure Clear;
  144. function LockList: TList;
  145. procedure Remove(Item: Pointer);
  146. procedure UnlockList;
  147. end;
  148. const
  149. BITSHIFT = 5;
  150. MASK = 31; {for longs that are 32-bit in size}
  151. MaxBitRec = $FFFF Div (SizeOf(longint));
  152. MaxBitFlags = MaxBitRec * 32;
  153. type
  154. TBitArray = array[0..MaxBitRec - 1] of longint;
  155. TBits = class(TObject)
  156. private
  157. { Private declarations }
  158. FBits : ^TBitArray;
  159. FSize : longint; { total longints currently allocated }
  160. findIndex : longint;
  161. findState : boolean;
  162. { functions and properties to match TBits class }
  163. procedure SetBit(bit : longint; value : Boolean);
  164. function getSize : longint;
  165. procedure setSize(value : longint);
  166. public
  167. { Public declarations }
  168. constructor Create(theSize : longint); virtual;
  169. destructor Destroy; override;
  170. function getFSize : longint;
  171. procedure seton(bit : longint);
  172. procedure clear(bit : longint);
  173. procedure clearall;
  174. procedure andbits(bitset : TBits);
  175. procedure orbits(bitset : TBits);
  176. procedure xorbits(bitset : TBits);
  177. procedure notbits(bitset : TBits);
  178. function get(bit : longint) : boolean;
  179. procedure grow(nbit : longint);
  180. function equals(bitset : TBits) : Boolean;
  181. procedure SetIndex(index : longint);
  182. function FindFirstBit(state : boolean) : longint;
  183. function FindNextBit : longint;
  184. function FindPrevBit : longint;
  185. { functions and properties to match TBits class }
  186. function OpenBit: longint;
  187. property Bits[bit: longint]: Boolean read get write SetBit; default;
  188. property Size: longint read getSize write setSize;
  189. end;
  190. { TPersistent abstract class }
  191. {$M+}
  192. TPersistent = class(TObject)
  193. private
  194. procedure AssignError(Source: TPersistent);
  195. protected
  196. procedure AssignTo(Dest: TPersistent); virtual;
  197. procedure DefineProperties(Filer: TFiler); virtual;
  198. function GetOwner: TPersistent; dynamic;
  199. public
  200. destructor Destroy; override;
  201. procedure Assign(Source: TPersistent); virtual;
  202. function GetNamePath: string; virtual; {dynamic;}
  203. end;
  204. {$M-}
  205. { TPersistent class reference type }
  206. TPersistentClass = class of TPersistent;
  207. { TCollection class }
  208. TCollection = class;
  209. TCollectionItem = class(TPersistent)
  210. private
  211. FCollection: TCollection;
  212. FID: Integer;
  213. function GetIndex: Integer;
  214. procedure SetCollection(Value: TCollection);
  215. protected
  216. procedure Changed(AllItems: Boolean);
  217. function GetNamePath: string; override;
  218. function GetOwner: TPersistent; override;
  219. function GetDisplayName: string; virtual;
  220. procedure SetIndex(Value: Integer); virtual;
  221. procedure SetDisplayName(const Value: string); virtual;
  222. public
  223. constructor Create(ACollection: TCollection); virtual;
  224. destructor Destroy; override;
  225. property Collection: TCollection read FCollection write SetCollection;
  226. property ID: Integer read FID;
  227. property Index: Integer read GetIndex write SetIndex;
  228. property DisplayName: string read GetDisplayName write SetDisplayName;
  229. end;
  230. TCollectionItemClass = class of TCollectionItem;
  231. TCollection = class(TPersistent)
  232. private
  233. FItemClass: TCollectionItemClass;
  234. FItems: TList;
  235. FUpdateCount: Integer;
  236. FNextID: Integer;
  237. FPropName: string;
  238. function GetCount: Integer;
  239. function GetPropName: string;
  240. procedure InsertItem(Item: TCollectionItem);
  241. procedure RemoveItem(Item: TCollectionItem);
  242. protected
  243. { Design-time editor support }
  244. function GetAttrCount: Integer; dynamic;
  245. function GetAttr(Index: Integer): string; dynamic;
  246. function GetItemAttr(Index, ItemIndex: Integer): string; dynamic;
  247. function GetNamePath: string; override;
  248. procedure Changed;
  249. function GetItem(Index: Integer): TCollectionItem;
  250. procedure SetItem(Index: Integer; Value: TCollectionItem);
  251. procedure SetItemName(Item: TCollectionItem); virtual;
  252. procedure SetPropName; virtual;
  253. procedure Update(Item: TCollectionItem); virtual;
  254. property PropName: string read GetPropName write FPropName;
  255. public
  256. constructor Create(AItemClass: TCollectionItemClass);
  257. destructor Destroy; override;
  258. function Add: TCollectionItem;
  259. procedure Assign(Source: TPersistent); override;
  260. procedure BeginUpdate;
  261. procedure Clear;
  262. procedure EndUpdate;
  263. function FindItemID(ID: Integer): TCollectionItem;
  264. property Count: Integer read GetCount;
  265. property ItemClass: TCollectionItemClass read FItemClass;
  266. property Items[Index: Integer]: TCollectionItem read GetItem write SetItem;
  267. end;
  268. TStrings = class;
  269. { IStringsAdapter interface }
  270. { Maintains link between TStrings and IStrings implementations }
  271. { !!!! Interfaces aren't supported by FPC
  272. IStringsAdapter = interface
  273. procedure ReferenceStrings(S: TStrings);
  274. procedure ReleaseStrings;
  275. end;
  276. }
  277. IStringsAdapter = class(TObject);
  278. { TStrings class }
  279. TStrings = class(TPersistent)
  280. private
  281. FUpdateCount: Integer;
  282. FAdapter: IStringsAdapter;
  283. function GetCommaText: string;
  284. function GetName(Index: Integer): string;
  285. function GetValue(const Name: string): string;
  286. procedure ReadData(Reader: TReader);
  287. procedure SetCommaText(const Value: string);
  288. procedure SetStringsAdapter(const Value: IStringsAdapter);
  289. procedure SetValue(const Name, Value: string);
  290. procedure WriteData(Writer: TWriter);
  291. protected
  292. procedure DefineProperties(Filer: TFiler); override;
  293. procedure Error(const Msg: string; Data: Integer);
  294. function Get(Index: Integer): string; virtual; abstract;
  295. function GetCapacity: Integer; virtual;
  296. function GetCount: Integer; virtual; abstract;
  297. function GetObject(Index: Integer): TObject; virtual;
  298. function GetTextStr: string; virtual;
  299. procedure Put(Index: Integer; const S: string); virtual;
  300. procedure PutObject(Index: Integer; AObject: TObject); virtual;
  301. procedure SetCapacity(NewCapacity: Integer); virtual;
  302. procedure SetTextStr(const Value: string); virtual;
  303. procedure SetUpdateState(Updating: Boolean); virtual;
  304. public
  305. destructor Destroy; override;
  306. function Add(const S: string): Integer; virtual;
  307. function AddObject(const S: string; AObject: TObject): Integer; virtual;
  308. procedure Append(const S: string);
  309. procedure AddStrings(TheStrings: TStrings); virtual;
  310. procedure Assign(Source: TPersistent); override;
  311. procedure BeginUpdate;
  312. procedure Clear; virtual; abstract;
  313. procedure Delete(Index: Integer); virtual; abstract;
  314. procedure EndUpdate;
  315. function Equals(TheStrings: TStrings): Boolean;
  316. procedure Exchange(Index1, Index2: Integer); virtual;
  317. function GetText: PChar; virtual;
  318. function IndexOf(const S: string): Integer; virtual;
  319. function IndexOfName(const Name: string): Integer;
  320. function IndexOfObject(AObject: TObject): Integer;
  321. procedure Insert(Index: Integer; const S: string); virtual; abstract;
  322. procedure InsertObject(Index: Integer; const S: string;
  323. AObject: TObject);
  324. procedure LoadFromFile(const FileName: string); virtual;
  325. procedure LoadFromStream(Stream: TStream); virtual;
  326. procedure Move(CurIndex, NewIndex: Integer); virtual;
  327. procedure SaveToFile(const FileName: string); virtual;
  328. procedure SaveToStream(Stream: TStream); virtual;
  329. procedure SetText(TheText: PChar); virtual;
  330. property Capacity: Integer read GetCapacity write SetCapacity;
  331. property CommaText: string read GetCommaText write SetCommaText;
  332. property Count: Integer read GetCount;
  333. property Names[Index: Integer]: string read GetName;
  334. property Objects[Index: Integer]: TObject read GetObject write PutObject;
  335. property Values[const Name: string]: string read GetValue write SetValue;
  336. property Strings[Index: Integer]: string read Get write Put; default;
  337. property Text: string read GetTextStr write SetTextStr;
  338. property StringsAdapter: IStringsAdapter read FAdapter write SetStringsAdapter;
  339. end;
  340. { TStringList class }
  341. TDuplicates = (dupIgnore, dupAccept, dupError);
  342. PStringItem = ^TStringItem;
  343. TStringItem = record
  344. FString: string;
  345. FObject: TObject;
  346. end;
  347. PStringItemList = ^TStringItemList;
  348. TStringItemList = array[0..MaxListSize] of TStringItem;
  349. TStringList = class(TStrings)
  350. private
  351. FList: PStringItemList;
  352. FCount: Integer;
  353. FCapacity: Integer;
  354. FSorted: Boolean;
  355. FDuplicates: TDuplicates;
  356. FOnChange: TNotifyEvent;
  357. FOnChanging: TNotifyEvent;
  358. procedure ExchangeItems(Index1, Index2: Integer);
  359. procedure Grow;
  360. procedure QuickSort(L, R: Integer);
  361. procedure InsertItem(Index: Integer; const S: string);
  362. procedure SetSorted(Value: Boolean);
  363. protected
  364. procedure Changed; virtual;
  365. procedure Changing; virtual;
  366. function Get(Index: Integer): string; override;
  367. function GetCapacity: Integer; override;
  368. function GetCount: Integer; override;
  369. function GetObject(Index: Integer): TObject; override;
  370. procedure Put(Index: Integer; const S: string); override;
  371. procedure PutObject(Index: Integer; AObject: TObject); override;
  372. procedure SetCapacity(NewCapacity: Integer); override;
  373. procedure SetUpdateState(Updating: Boolean); override;
  374. public
  375. destructor Destroy; override;
  376. function Add(const S: string): Integer; override;
  377. procedure Clear; override;
  378. procedure Delete(Index: Integer); override;
  379. procedure Exchange(Index1, Index2: Integer); override;
  380. function Find(const S: string; var Index: Integer): Boolean; virtual;
  381. function IndexOf(const S: string): Integer; override;
  382. procedure Insert(Index: Integer; const S: string); override;
  383. procedure Sort; virtual;
  384. property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  385. property Sorted: Boolean read FSorted write SetSorted;
  386. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  387. property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  388. end;
  389. { TStream abstract class }
  390. TStream = class(TObject)
  391. private
  392. function GetPosition: Longint;
  393. procedure SetPosition(Pos: Longint);
  394. function GetSize: Longint;
  395. protected
  396. procedure SetSize(NewSize: Longint); virtual;
  397. public
  398. function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
  399. function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
  400. function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;
  401. procedure ReadBuffer(var Buffer; Count: Longint);
  402. procedure WriteBuffer(const Buffer; Count: Longint);
  403. function CopyFrom(Source: TStream; Count: Longint): Longint;
  404. function ReadComponent(Instance: TComponent): TComponent;
  405. function ReadComponentRes(Instance: TComponent): TComponent;
  406. procedure WriteComponent(Instance: TComponent);
  407. procedure WriteComponentRes(const ResName: string; Instance: TComponent);
  408. procedure WriteDescendent(Instance, Ancestor: TComponent);
  409. procedure WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent);
  410. procedure ReadResHeader;
  411. function ReadByte : Byte;
  412. function ReadWord : Word;
  413. function ReadDWord : Cardinal;
  414. function ReadAnsiString : String;
  415. procedure WriteByte(b : Byte);
  416. procedure WriteWord(w : Word);
  417. procedure WriteDWord(d : Cardinal);
  418. Procedure WriteAnsiString (S : String);
  419. property Position: Longint read GetPosition write SetPosition;
  420. property Size: Longint read GetSize write SetSize;
  421. end;
  422. { THandleStream class }
  423. THandleStream = class(TStream)
  424. private
  425. FHandle: Integer;
  426. public
  427. constructor Create(AHandle: Integer);
  428. function Read(var Buffer; Count: Longint): Longint; override;
  429. function Write(const Buffer; Count: Longint): Longint; override;
  430. property Handle: Integer read FHandle;
  431. end;
  432. { TFileStream class }
  433. TFileStream = class(THandleStream)
  434. Private
  435. FFileName : String;
  436. protected
  437. procedure SetSize(NewSize: Longint); override;
  438. public
  439. constructor Create(const AFileName: string; Mode: Word);
  440. destructor Destroy; override;
  441. function Seek(Offset: Longint; Origin: Word): Longint; override;
  442. property FileName : String Read FFilename;
  443. end;
  444. { TCustomMemoryStream abstract class }
  445. TCustomMemoryStream = class(TStream)
  446. private
  447. FMemory: Pointer;
  448. FSize, FPosition: Longint;
  449. protected
  450. procedure SetPointer(Ptr: Pointer; ASize: Longint);
  451. public
  452. function Read(var Buffer; Count: Longint): Longint; override;
  453. function Seek(Offset: Longint; Origin: Word): Longint; override;
  454. procedure SaveToStream(Stream: TStream);
  455. procedure SaveToFile(const FileName: string);
  456. property Memory: Pointer read FMemory;
  457. end;
  458. { TMemoryStream }
  459. TMemoryStream = class(TCustomMemoryStream)
  460. private
  461. FCapacity: Longint;
  462. procedure SetCapacity(NewCapacity: Longint);
  463. protected
  464. function Realloc(var NewCapacity: Longint): Pointer; virtual;
  465. property Capacity: Longint read FCapacity write SetCapacity;
  466. public
  467. destructor Destroy; override;
  468. procedure Clear;
  469. procedure LoadFromStream(Stream: TStream);
  470. procedure LoadFromFile(const FileName: string);
  471. procedure SetSize(NewSize: Longint); override;
  472. function Write(const Buffer; Count: Longint): Longint; override;
  473. end;
  474. { TStringStream }
  475. TStringStream = class(TStream)
  476. private
  477. FDataString: string;
  478. FPosition: Integer;
  479. protected
  480. procedure SetSize(NewSize: Longint); override;
  481. public
  482. constructor Create(const AString: string);
  483. function Read(var Buffer; Count: Longint): Longint; override;
  484. function ReadString(Count: Longint): string;
  485. function Seek(Offset: Longint; Origin: Word): Longint; override;
  486. function Write(const Buffer; Count: Longint): Longint; override;
  487. procedure WriteString(const AString: string);
  488. property DataString: string read FDataString;
  489. end;
  490. { TResourceStream }
  491. TResourceStream = class(TCustomMemoryStream)
  492. private
  493. HResInfo: HRSRC;
  494. HGlobal: THandle;
  495. procedure Initialize(Instance: THandle; Name, ResType: PChar);
  496. public
  497. constructor Create(Instance: THandle; const ResName: string; ResType: PChar);
  498. constructor CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);
  499. destructor Destroy; override;
  500. function Write(const Buffer; Count: Longint): Longint; override;
  501. end;
  502. { TStreamAdapter }
  503. { Implements OLE IStream on VCL TStream }
  504. { we don't need that yet
  505. TStreamAdapter = class(TInterfacedObject, IStream)
  506. private
  507. FStream: TStream;
  508. public
  509. constructor Create(Stream: TStream);
  510. function Read(pv: Pointer; cb: Longint;
  511. pcbRead: PLongint): HResult; stdcall;
  512. function Write(pv: Pointer; cb: Longint;
  513. pcbWritten: PLongint): HResult; stdcall;
  514. function Seek(dlibMove: Largeint; dwOrigin: Longint;
  515. out libNewPosition: Largeint): HResult; stdcall;
  516. function SetSize(libNewSize: Largeint): HResult; stdcall;
  517. function CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint;
  518. out cbWritten: Largeint): HResult; stdcall;
  519. function Commit(grfCommitFlags: Longint): HResult; stdcall;
  520. function Revert: HResult; stdcall;
  521. function LockRegion(libOffset: Largeint; cb: Largeint;
  522. dwLockType: Longint): HResult; stdcall;
  523. function UnlockRegion(libOffset: Largeint; cb: Largeint;
  524. dwLockType: Longint): HResult; stdcall;
  525. function Stat(out statstg: TStatStg;
  526. grfStatFlag: Longint): HResult; stdcall;
  527. function Clone(out stm: IStream): HResult; stdcall;
  528. end;
  529. }
  530. { TFiler }
  531. TValueType = (vaNull, vaList, vaInt8, vaInt16, vaInt32, vaExtended,
  532. vaString, vaIdent, vaFalse, vaTrue, vaBinary, vaSet, vaLString,
  533. vaNil, vaCollection);
  534. TFilerFlag = (ffInherited, ffChildPos);
  535. TFilerFlags = set of TFilerFlag;
  536. (*
  537. TReaderProc = procedure(Reader: TReader) of object;
  538. TWriterProc = procedure(Writer: TWriter) of object;
  539. TStreamProc = procedure(Stream: TStream) of object;
  540. *)
  541. TReaderProc = procedure(Reader: TAbstractReader) of object;
  542. TWriterProc = procedure(Writer: TAbstractWriter) of object;
  543. TStreamProc = procedure(Stream: TStream) of object;
  544. TAbstractFiler = class(TObject)
  545. private
  546. FRoot: TComponent;
  547. FAncestor: TPersistent;
  548. FIgnoreChildren: Boolean;
  549. FPrefix : String;
  550. public
  551. procedure DefineProperty(const Name: string;
  552. ReadData: TReaderProc; WriteData: TWriterProc;
  553. HasData: Boolean); virtual; abstract;
  554. procedure DefineBinaryProperty(const Name: string;
  555. ReadData, WriteData: TStreamProc;
  556. HasData: Boolean); virtual; abstract;
  557. property Root: TComponent read FRoot write FRoot;
  558. property Ancestor: TPersistent read FAncestor write FAncestor;
  559. property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;
  560. end;
  561. { TReader }
  562. TFindMethodEvent = procedure(Reader: TReader; const MethodName: string;
  563. var Address: Pointer; var Error: Boolean) of object;
  564. TSetNameEvent = procedure(Reader: TReader; Component: TComponent;
  565. var Name: string) of object;
  566. TReferenceNameEvent = procedure(Reader: TReader; var Name: string) of object;
  567. TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string;
  568. ComponentClass: TPersistentClass; var Component: TComponent) of object;
  569. TReadComponentsProc = procedure(Component: TComponent) of object;
  570. TReaderError = procedure(Reader: TReader; const Message: string; var Handled: Boolean) of object;
  571. TAbstractReader = class(TAbstractFiler);
  572. (* private
  573. protected
  574. function Error(const Message: string): Boolean; virtual;
  575. function FindMethod(ARoot: TComponent; const AMethodName: string): Pointer; virtual;
  576. procedure SetName(Component: TComponent; var Name: string); virtual;
  577. procedure ReferenceName(var Name: string); virtual;
  578. function FindAncestorComponent(const Name: string;
  579. ComponentClass: TPersistentClass): TComponent; virtual;
  580. public
  581. destructor Destroy; override;
  582. procedure BeginReferences;
  583. procedure DefineProperty(const Name: string;
  584. rd : TReaderProc; wd : TWriterProc;
  585. HasData: Boolean); override;
  586. procedure DefineBinaryProperty(const Name: string;
  587. rd, wd: TStreamProc;
  588. HasData: Boolean); override;
  589. function EndOfList: Boolean;
  590. procedure EndReferences;
  591. procedure FixupReferences;
  592. procedure FlushBuffer; override;
  593. function NextValue: TValueType;
  594. procedure ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer);
  595. procedure ReadCollection(Collection: TCollection);
  596. function ReadComponent(Component: TComponent): TComponent;
  597. procedure ReadComponents(AOwner, AParent: TComponent;
  598. Proc: TReadComponentsProc);
  599. function ReadRootComponent(ARoot: TComponent): TComponent;
  600. { Abstract methods }
  601. procedure ReadSignature;
  602. function ReadBoolean: Boolean; abstract;
  603. function ReadChar: Char; abstract;
  604. function ReadFloat: Extended;
  605. function ReadIdent: string;
  606. function ReadInteger: Longint;
  607. procedure ReadListBegin;
  608. procedure ReadListEnd;
  609. function ReadStr: string;
  610. function ReadString: string;
  611. function ReadValue: TValueType;
  612. procedure CopyValue(Writer: TWriter);
  613. {!!!}
  614. property Owner: TComponent read FOwner write FOwner;
  615. property Parent: TComponent read FParent write FParent;
  616. property Position: Longint read GetPosition write SetPosition;
  617. property OnError: TReaderError read FOnError write FOnError;
  618. property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;
  619. property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;
  620. property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;
  621. property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;
  622. end;
  623. *)
  624. { TAbstractWriter }
  625. TAbstractWriter = class(TAbstractFiler)
  626. private
  627. FRootAncestor: TComponent;
  628. FPropPath: string;
  629. FAncestorList: TList;
  630. FAncestorPos: Integer;
  631. FChildPos: Integer;
  632. procedure AddAncestor(Component: TComponent);
  633. procedure WriteData(Instance: TComponent); // linker optimization
  634. procedure WriteProperty(Instance: TPersistent; PropInfo: Pointer);
  635. procedure WriteProperties(Instance: TPersistent);
  636. Procedure DoOrdinalProp(Instance : TPersistent;Propinfo :PPropInfo);
  637. Procedure DoStringProp(Instance : TPersistent;Propinfo :PPropInfo);
  638. Procedure DoFloatProp(Instance : TPersistent;Propinfo :PPropInfo);
  639. Procedure DoCollectionProp(Name: ShortString; Value : TCollection);
  640. Procedure DoClassProp(Instance : TPersistent;Propinfo :PPropInfo);
  641. Procedure DoMethodProp(Instance : TPersistent;Propinfo :PPropInfo);
  642. protected
  643. procedure WritePrefix(Flags: TFilerFlags; AChildPos: Integer);Virtual;Abstract;
  644. Procedure StartObject(Const AClassName,AName : String);Virtual;abstract;
  645. Procedure EndObject;Virtual;Abstract;
  646. Procedure StartCollection(Const Name : String);Virtual;abstract;
  647. Procedure EndCollection;Virtual;Abstract;
  648. Procedure StartCollectionItem;Virtual;abstract;
  649. Procedure EndCollectionItem;Virtual;Abstract;
  650. public
  651. destructor Destroy; override;
  652. procedure DefineProperty(const Name: string;
  653. rd : TReaderProc; wd : TWriterProc;
  654. HasData: Boolean); override;
  655. procedure DefineBinaryProperty(const Name: string;
  656. rd, wd: TStreamProc;
  657. HasData: Boolean); override;
  658. procedure WriteDescendent(ARoot: TComponent; AAncestor: TComponent);
  659. procedure WriteRootComponent(ARoot: TComponent);
  660. procedure WriteComponent(Component: TComponent);virtual;
  661. { Abstract }
  662. Procedure WriteIntegerProperty(Const Name : Shortstring;Value : Longint);virtual;abstract;
  663. Procedure WriteSetProperty (Const Name : ShortString;Value : longint; BaseType : TTypeInfo);virtual;abstract;
  664. Procedure WriteEnumerationProperty (Const Name : ShortString;Value : Longint; Const EnumName : ShortSTring);virtual;abstract;
  665. Procedure WriteStringProperty(Const Name : ShortString; Const Value : String);virtual;abstract;
  666. Procedure WriteFloatProperty(Const Name : ShortString; Value : Extended);virtual;abstract;
  667. Procedure WriteCollectionProperty(Const Name : ShortString;Value : TCollection);virtual;abstract;
  668. Procedure WriteClassProperty(Instance : TPersistent;Propinfo :PPropInfo);virtual;abstract;
  669. Procedure WriteComponentProperty(Const Name : ShortString;Value : TComponent);virtual;abstract;
  670. Procedure WriteNilProperty(Const Name : Shortstring);virtual; abstract;
  671. Procedure WriteMethodProperty(Const Name,AMethodName : ShortString);virtual;abstract;
  672. Procedure WriteBinaryProperty(Const Name; Value : TStream);Virtual;Abstract;
  673. (*
  674. { Abstract compatibility methods}
  675. Procedure WriteValue(Value : TValueType);virtual;abstract;
  676. procedure Write(const Buf; Count: Longint);virtual;abstract;
  677. procedure WriteBoolean(Value: Boolean);virtual;abstract;
  678. procedure WriteCollection(Value: TCollection);virtual;abstract;
  679. procedure WriteComponent(Component: TComponent);virtual;abstract;
  680. procedure WriteChar(Value: Char);virtual;abstract;
  681. procedure WriteFloat(Value: Extended);virtual;abstract;
  682. procedure WriteIdent(const Ident: string);virtual;abstract;
  683. procedure WriteInteger(Value: Longint);virtual;abstract;
  684. procedure WriteListBegin;virtual;abstract;
  685. procedure WriteListEnd;virtual;abstract;
  686. procedure WriteSignature;virtual;abstract;
  687. procedure WriteStr(const Value: string);virtual;abstract;
  688. procedure WriteString(const Value: string);virtual;abstract;
  689. *)
  690. property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
  691. end;
  692. TWriter = class(TAbstractWriter)
  693. Private
  694. FStream : TStream;
  695. function GetPosition: Longint;
  696. procedure SetPosition(Value: Longint);
  697. procedure WritePropName(const PropName: string);
  698. protected
  699. procedure WriteBinary(wd : TStreamProc);
  700. public
  701. Constructor Create(S : TStream);
  702. destructor Destroy; override;
  703. { Compatibility }
  704. procedure WriteBuffer;
  705. Procedure FlushBuffer;
  706. { Abstract }
  707. Procedure WriteIntegerProperty(Const Name : Shortstring;Value : Longint);override;
  708. Procedure WriteSetProperty (Const Name : ShortString;Value : longint; BaseType : TTypeInfo);override;
  709. Procedure WriteEnumerationProperty (Const Name : ShortString;Value : Longint; Const EnumName : ShortSTring);override;
  710. Procedure WriteStringProperty(Const Name : ShortString; Const Value : String);override;
  711. Procedure WriteFloatProperty(Const Name : ShortString; Value : Extended);override;
  712. Procedure WriteCollectionProperty(Const Name : ShortString;Value : TCollection);override;
  713. Procedure WriteClassProperty(Instance : TPersistent;Propinfo :PPropInfo);override;
  714. Procedure WriteComponentProperty(Const Name : ShortSTring; Value : TComponent);override;
  715. Procedure WriteNilProperty(Const Name : Shortstring);override;
  716. Procedure WriteMethodProperty(Const Name,AMethodName : ShortString);override;
  717. { Abstract compatibility methods}
  718. procedure WritePrefix(Flags: TFilerFlags; AChildPos: Integer); virtual;
  719. Procedure WriteValue(Value : TValueType);virtual;
  720. procedure Write(const Buf; Count: Longint);virtual;
  721. procedure WriteBoolean(Value: Boolean);virtual;
  722. procedure WriteCollection(Value: TCollection);virtual;
  723. procedure WriteChar(Value: Char);virtual;
  724. procedure WriteFloat(Value: Extended);virtual;
  725. procedure WriteIdent(const Ident: string);virtual;
  726. procedure WriteInteger(Value: Longint);virtual;
  727. procedure WriteListBegin;virtual;
  728. procedure WriteListEnd;virtual;
  729. procedure WriteSignature;virtual;
  730. procedure WriteStr(const Value: string);virtual;
  731. procedure WriteString(const Value: string);virtual;
  732. procedure DefineProperty(const Name: string;
  733. rd : TReaderProc; wd : TWriterProc;
  734. HasData: Boolean); override;
  735. procedure DefineBinaryProperty(const Name: string;
  736. rd, wd: TStreamProc;
  737. HasData: Boolean); override;
  738. property Position: Longint read GetPosition write SetPosition;
  739. end;
  740. TTextWriter = class(TAbstractWriter)
  741. Private
  742. FStream : TStream;
  743. Procedure Write(Const Msg : String);
  744. Procedure WriteLn(Const Msg : String);
  745. Procedure WriteFmt(Fmt : String; Args : Array of const);
  746. procedure WritePropName(const PropName: string);
  747. protected
  748. Procedure StartCollection(Const AName : String);
  749. Procedure StartCollectionItem;
  750. Procedure EndCollectionItem;
  751. Procedure EndCollection;
  752. public
  753. Constructor Create(S : TStream);
  754. destructor Destroy; override;
  755. { Abstract }
  756. Procedure StartObject(Const AClassName,AName : String);override;
  757. Procedure EndObject;Virtual;override;
  758. Procedure WriteIntegerProperty(Const Name : Shortstring;Value : Longint);override;
  759. Procedure WriteSetProperty (Const Name : ShortString;Value : longint; BaseType : TTypeInfo);override;
  760. Procedure WriteEnumerationProperty (Const Name : ShortString;Value : Longint; Const EnumName : ShortSTring);override;
  761. Procedure WriteStringProperty(Const Name : ShortString; Const Value : String);override;
  762. Procedure WriteFloatProperty(Const Name : ShortString; Value : Extended);override;
  763. Procedure WriteCollectionProperty(Const Name : ShortString;Value : TCollection);override;
  764. Procedure WriteClassProperty(Instance : TPersistent;Propinfo :PPropInfo);override;
  765. Procedure WriteComponentProperty(Const Name : ShortSTring; Value : TComponent);override;
  766. Procedure WriteNilProperty(Const Name : Shortstring);override;
  767. Procedure WriteMethodProperty(Const Name,AMethodName : ShortString);override;
  768. end;
  769. TFiler = Class(TAbstractFiler);
  770. TReader = Class(TWriter);
  771. (*
  772. TFiler = class(TObject)
  773. private
  774. FStream: TStream;
  775. FBuffer: Pointer;
  776. FBufSize: Integer;
  777. FBufPos: Integer;
  778. FBufEnd: Integer;
  779. FRoot: TComponent;
  780. FAncestor: TPersistent;
  781. FIgnoreChildren: Boolean;
  782. public
  783. constructor Create(Stream: TStream; BufSize: Integer);
  784. destructor Destroy; override;
  785. procedure DefineProperty(const Name: string;
  786. ReadData: TReaderProc; WriteData: TWriterProc;
  787. HasData: Boolean); virtual; abstract;
  788. procedure DefineBinaryProperty(const Name: string;
  789. ReadData, WriteData: TStreamProc;
  790. HasData: Boolean); virtual; abstract;
  791. procedure FlushBuffer; virtual; abstract;
  792. property Root: TComponent read FRoot write FRoot;
  793. property Ancestor: TPersistent read FAncestor write FAncestor;
  794. property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;
  795. end;
  796. { TReader }
  797. TFindMethodEvent = procedure(Reader: TReader; const MethodName: string;
  798. var Address: Pointer; var Error: Boolean) of object;
  799. TSetNameEvent = procedure(Reader: TReader; Component: TComponent;
  800. var Name: string) of object;
  801. TReferenceNameEvent = procedure(Reader: TReader; var Name: string) of object;
  802. TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string;
  803. ComponentClass: TPersistentClass; var Component: TComponent) of object;
  804. TReadComponentsProc = procedure(Component: TComponent) of object;
  805. TReaderError = procedure(Reader: TReader; const Message: string; var Handled: Boolean) of object;
  806. TReader = class(TFiler)
  807. private
  808. FOwner: TComponent;
  809. FParent: TComponent;
  810. FFixups: TList;
  811. FLoaded: TList;
  812. FOnFindMethod: TFindMethodEvent;
  813. FOnSetName: TSetNameEvent;
  814. FOnReferenceName: TReferenceNameEvent;
  815. FOnAncestorNotFound: TAncestorNotFoundEvent;
  816. FOnError: TReaderError;
  817. FCanHandleExcepts: Boolean;
  818. FPropName: string;
  819. procedure CheckValue(Value: TValueType);
  820. procedure DoFixupReferences;
  821. procedure FreeFixups;
  822. function GetPosition: Longint;
  823. procedure PropertyError;
  824. procedure ReadBuffer;
  825. procedure ReadData(Instance: TComponent);
  826. procedure ReadDataInner(Instance: TComponent);
  827. procedure ReadProperty(AInstance: TPersistent);
  828. procedure ReadPropValue(Instance: TPersistent; PropInfo: Pointer);
  829. function ReadSet(SetType: Pointer): Integer;
  830. procedure SetPosition(Value: Longint);
  831. procedure SkipSetBody;
  832. procedure SkipValue;
  833. procedure SkipProperty;
  834. procedure SkipComponent(SkipHeader: Boolean);
  835. protected
  836. function Error(const Message: string): Boolean; virtual;
  837. function FindMethod(ARoot: TComponent; const AMethodName: string): Pointer; virtual;
  838. procedure SetName(Component: TComponent; var Name: string); virtual;
  839. procedure ReferenceName(var Name: string); virtual;
  840. function FindAncestorComponent(const Name: string;
  841. ComponentClass: TPersistentClass): TComponent; virtual;
  842. public
  843. destructor Destroy; override;
  844. procedure BeginReferences;
  845. procedure DefineProperty(const Name: string;
  846. rd : TReaderProc; wd : TWriterProc;
  847. HasData: Boolean); override;
  848. procedure DefineBinaryProperty(const Name: string;
  849. rd, wd: TStreamProc;
  850. HasData: Boolean); override;
  851. function EndOfList: Boolean;
  852. procedure EndReferences;
  853. procedure FixupReferences;
  854. procedure FlushBuffer; override;
  855. function NextValue: TValueType;
  856. procedure Read(var Buf; Count: Longint);
  857. function ReadBoolean: Boolean;
  858. function ReadChar: Char;
  859. procedure ReadCollection(Collection: TCollection);
  860. function ReadComponent(Component: TComponent): TComponent;
  861. procedure ReadComponents(AOwner, AParent: TComponent;
  862. Proc: TReadComponentsProc);
  863. function ReadFloat: Extended;
  864. function ReadIdent: string;
  865. function ReadInteger: Longint;
  866. procedure ReadListBegin;
  867. procedure ReadListEnd;
  868. procedure ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer);
  869. function ReadRootComponent(ARoot: TComponent): TComponent;
  870. procedure ReadSignature;
  871. function ReadStr: string;
  872. function ReadString: string;
  873. function ReadValue: TValueType;
  874. procedure CopyValue(Writer: TWriter); {!!!}
  875. property Owner: TComponent read FOwner write FOwner;
  876. property Parent: TComponent read FParent write FParent;
  877. property Position: Longint read GetPosition write SetPosition;
  878. property OnError: TReaderError read FOnError write FOnError;
  879. property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;
  880. property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;
  881. property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;
  882. property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;
  883. end;
  884. { TWriter }
  885. TWriter = class(TFiler)
  886. private
  887. FRootAncestor: TComponent;
  888. FPropPath: string;
  889. FAncestorList: TList;
  890. FAncestorPos: Integer;
  891. FChildPos: Integer;
  892. procedure AddAncestor(Component: TComponent);
  893. function GetPosition: Longint;
  894. procedure SetPosition(Value: Longint);
  895. procedure WriteBuffer;
  896. procedure WriteData(Instance: TComponent);
  897. procedure WriteProperty(Instance: TPersistent; PropInfo: Pointer);
  898. procedure WriteProperties(Instance: TPersistent);
  899. procedure WritePropName(const PropName: string);
  900. protected
  901. procedure WriteBinary(wd : TStreamProc);
  902. procedure WritePrefix(Flags: TFilerFlags; AChildPos: Integer);
  903. procedure WriteValue(Value: TValueType);
  904. public
  905. destructor Destroy; override;
  906. procedure DefineProperty(const Name: string;
  907. rd : TReaderProc; wd : TWriterProc;
  908. HasData: Boolean); override;
  909. procedure DefineBinaryProperty(const Name: string;
  910. rd, wd: TStreamProc;
  911. HasData: Boolean); override;
  912. procedure FlushBuffer; override;
  913. procedure Write(const Buf; Count: Longint);
  914. procedure WriteBoolean(Value: Boolean);
  915. procedure WriteCollection(Value: TCollection);
  916. procedure WriteComponent(Component: TComponent);
  917. procedure WriteChar(Value: Char);
  918. procedure WriteDescendent(ARoot: TComponent; AAncestor: TComponent);
  919. procedure WriteFloat(Value: Extended);
  920. procedure WriteIdent(const Ident: string);
  921. procedure WriteInteger(Value: Longint);
  922. procedure WriteListBegin;
  923. procedure WriteListEnd;
  924. procedure WriteRootComponent(ARoot: TComponent);
  925. procedure WriteSignature;
  926. procedure WriteStr(const Value: string);
  927. procedure WriteString(const Value: string);
  928. property Position: Longint read GetPosition write SetPosition;
  929. property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
  930. end;
  931. *)
  932. { TParser }
  933. TParser = class(TObject)
  934. private
  935. FStream: TStream;
  936. FOrigin: Longint;
  937. FBuffer: PChar;
  938. FBufPtr: PChar;
  939. FBufEnd: PChar;
  940. FSourcePtr: PChar;
  941. FSourceEnd: PChar;
  942. FTokenPtr: PChar;
  943. FStringPtr: PChar;
  944. FSourceLine: Integer;
  945. FSaveChar: Char;
  946. FToken: Char;
  947. procedure ReadBuffer;
  948. procedure SkipBlanks;
  949. public
  950. constructor Create(Stream: TStream);
  951. destructor Destroy; override;
  952. procedure CheckToken(T: Char);
  953. procedure CheckTokenSymbol(const S: string);
  954. procedure Error(const Ident: string);
  955. procedure ErrorFmt(const Ident: string; const Args: array of const);
  956. procedure ErrorStr(const Message: string);
  957. procedure HexToBinary(Stream: TStream);
  958. function NextToken: Char;
  959. function SourcePos: Longint;
  960. function TokenComponentIdent: String;
  961. function TokenFloat: Extended;
  962. function TokenInt: Longint;
  963. function TokenString: string;
  964. function TokenSymbolIs(const S: string): Boolean;
  965. property SourceLine: Integer read FSourceLine;
  966. property Token: Char read FToken;
  967. end;
  968. { TThread }
  969. EThread = class(Exception);
  970. TThreadMethod = procedure of object;
  971. TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
  972. tpTimeCritical);
  973. TThread = class
  974. private
  975. FHandle: THandle;
  976. FThreadID: THandle;
  977. FTerminated: Boolean;
  978. FSuspended: Boolean;
  979. FFreeOnTerminate: Boolean;
  980. FFinished: Boolean;
  981. FReturnValue: Integer;
  982. FOnTerminate: TNotifyEvent;
  983. FMethod: TThreadMethod;
  984. FSynchronizeException: TObject;
  985. procedure CallOnTerminate;
  986. function GetPriority: TThreadPriority;
  987. procedure SetPriority(Value: TThreadPriority);
  988. procedure SetSuspended(Value: Boolean);
  989. protected
  990. procedure DoTerminate; virtual;
  991. procedure Execute; virtual; abstract;
  992. procedure Synchronize(Method: TThreadMethod);
  993. property ReturnValue: Integer read FReturnValue write FReturnValue;
  994. property Terminated: Boolean read FTerminated;
  995. public
  996. {$ifdef linux}
  997. { Needed for linux }
  998. FStackPointer : integer;
  999. FStackSize : integer;
  1000. FCallExitProcess : boolean;
  1001. {$endif}
  1002. constructor Create(CreateSuspended: Boolean);
  1003. destructor Destroy; { override; }
  1004. procedure Resume;
  1005. procedure Suspend;
  1006. procedure Terminate;
  1007. function WaitFor: Integer;
  1008. property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate;
  1009. property Handle: THandle read FHandle;
  1010. property Priority: TThreadPriority read GetPriority write SetPriority;
  1011. property Suspended: Boolean read FSuspended write SetSuspended;
  1012. property ThreadID: THandle read FThreadID;
  1013. property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate;
  1014. end;
  1015. { TComponent class }
  1016. TOperation = (opInsert, opRemove);
  1017. TComponentState = set of (csLoading, csReading, csWriting, csDestroying,
  1018. csDesigning, csAncestor, csUpdating, csFixups);
  1019. TComponentStyle = set of (csInheritable, csCheckPropAvail);
  1020. TGetChildProc = procedure (Child: TComponent) of object;
  1021. {
  1022. TComponentName = type string;
  1023. IVCLComObject = interface
  1024. function GetTypeInfoCount(out Count: Integer): Integer; stdcall;
  1025. function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): Integer; stdcall;
  1026. function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  1027. NameCount, LocaleID: Integer; DispIDs: Pointer): Integer; stdcall;
  1028. function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  1029. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): Integer; stdcall;
  1030. function SafeCallException(ExceptObject: TObject;
  1031. ExceptAddr: Pointer): Integer;
  1032. procedure FreeOnRelease;
  1033. end;
  1034. }
  1035. TComponent = class(TPersistent)
  1036. private
  1037. FOwner: TComponent;
  1038. FName: TComponentName;
  1039. FTag: Longint;
  1040. FComponents: TList;
  1041. FFreeNotifies: TList;
  1042. FDesignInfo: Longint;
  1043. FVCLComObject: Pointer;
  1044. FComponentState: TComponentState;
  1045. // function GetComObject: IUnknown;
  1046. function GetComponent(AIndex: Integer): TComponent;
  1047. function GetComponentCount: Integer;
  1048. function GetComponentIndex: Integer;
  1049. procedure Insert(AComponent: TComponent);
  1050. procedure ReadLeft(Reader: TReader);
  1051. procedure ReadTop(Reader: TReader);
  1052. procedure Remove(AComponent: TComponent);
  1053. procedure SetComponentIndex(Value: Integer);
  1054. procedure SetReference(Enable: Boolean);
  1055. procedure WriteLeft(Writer: TWriter);
  1056. procedure WriteTop(Writer: TWriter);
  1057. protected
  1058. FComponentStyle: TComponentStyle;
  1059. procedure ChangeName(const NewName: TComponentName);
  1060. procedure DefineProperties(Filer: TFiler); override;
  1061. procedure GetChildren(Proc: TGetChildProc; Root: TComponent); dynamic;
  1062. function GetChildOwner: TComponent; dynamic;
  1063. function GetChildParent: TComponent; dynamic;
  1064. function GetNamePath: string; override;
  1065. function GetOwner: TPersistent; override;
  1066. procedure Loaded; virtual;
  1067. procedure Notification(AComponent: TComponent;
  1068. Operation: TOperation); virtual;
  1069. procedure ReadState(Reader: TAbstractReader); virtual;
  1070. procedure SetAncestor(Value: Boolean);
  1071. procedure SetDesigning(Value: Boolean);
  1072. procedure SetName(const NewName: TComponentName); virtual;
  1073. procedure SetChildOrder(Child: TComponent; Order: Integer); dynamic;
  1074. procedure SetParentComponent(Value: TComponent); dynamic;
  1075. procedure Updating; dynamic;
  1076. procedure Updated; dynamic;
  1077. class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); dynamic;
  1078. procedure ValidateRename(AComponent: TComponent;
  1079. const CurName, NewName: string); virtual;
  1080. procedure ValidateContainer(AComponent: TComponent); dynamic;
  1081. procedure ValidateInsert(AComponent: TComponent); dynamic;
  1082. { IUnknown }
  1083. //!!!!! function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
  1084. //!!!! function _AddRef: Integer; stdcall;
  1085. //!!!! function _Release: Integer; stdcall;
  1086. { IDispatch }
  1087. //!!!! function GetTypeInfoCount(out Count: Integer): Integer; stdcall;
  1088. //!!!! function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): Integer; stdcall;
  1089. //!!!! function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  1090. //!!!! NameCount, LocaleID: Integer; DispIDs: Pointer): Integer; stdcall;
  1091. //!!!! function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  1092. //!!!! Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): Integer; stdcall;
  1093. public
  1094. //!! Moved temporary
  1095. procedure WriteState(Writer: TAbstractWriter); virtual;
  1096. constructor Create(AOwner: TComponent); virtual;
  1097. destructor Destroy; override;
  1098. procedure DestroyComponents;
  1099. procedure Destroying;
  1100. function FindComponent(const AName: string): TComponent;
  1101. procedure FreeNotification(AComponent: TComponent);
  1102. procedure FreeOnRelease;
  1103. function GetParentComponent: TComponent; dynamic;
  1104. function HasParent: Boolean; dynamic;
  1105. procedure InsertComponent(AComponent: TComponent);
  1106. procedure RemoveComponent(AComponent: TComponent);
  1107. function SafeCallException(ExceptObject: TObject;
  1108. ExceptAddr: Pointer): Integer; override;
  1109. // property ComObject: IUnknown read GetComObject;
  1110. property Components[Index: Integer]: TComponent read GetComponent;
  1111. property ComponentCount: Integer read GetComponentCount;
  1112. property ComponentIndex: Integer read GetComponentIndex write SetComponentIndex;
  1113. property ComponentState: TComponentState read FComponentState;
  1114. property ComponentStyle: TComponentStyle read FComponentStyle;
  1115. property DesignInfo: Longint read FDesignInfo write FDesignInfo;
  1116. property Owner: TComponent read FOwner;
  1117. property VCLComObject: Pointer read FVCLComObject write FVCLComObject;
  1118. //!! published
  1119. property Name: TComponentName read FName write SetName ; // stored False;
  1120. property Tag: Longint read FTag write FTag ; // default 0;
  1121. end;
  1122. { TComponent class reference type }
  1123. TComponentClass = class of TComponent;
  1124. { Component registration handlers }
  1125. TActiveXRegType = (axrComponentOnly, axrIncludeDescendants);
  1126. var
  1127. RegisterComponentsProc: procedure(const Page: string;
  1128. ComponentClasses: array of TComponentClass);
  1129. RegisterNoIconProc: procedure(ComponentClasses: array of TComponentClass);
  1130. {!!!! RegisterNonActiveXProc: procedure(ComponentClasses: array of TComponentClass;
  1131. AxRegType: TActiveXRegType) = nil;
  1132. CurrentGroup: Integer = -1;
  1133. CreateVCLComObjectProc: procedure(Component: TComponent) = nil;}
  1134. { Point and rectangle constructors }
  1135. function Point(AX, AY: Integer): TPoint;
  1136. function SmallPoint(AX, AY: SmallInt): TSmallPoint;
  1137. function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;
  1138. function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
  1139. { Class registration routines }
  1140. procedure RegisterClass(AClass: TPersistentClass);
  1141. procedure RegisterClasses(AClasses: array of TPersistentClass);
  1142. procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
  1143. procedure UnRegisterClass(AClass: TPersistentClass);
  1144. procedure UnRegisterClasses(AClasses: array of TPersistentClass);
  1145. procedure UnRegisterModuleClasses(Module: HMODULE);
  1146. function FindClass(const ClassName: string): TPersistentClass;
  1147. function GetClass(const ClassName: string): TPersistentClass;
  1148. { Component registration routines }
  1149. procedure RegisterComponents(const Page: string;
  1150. ComponentClasses: array of TComponentClass);
  1151. procedure RegisterNoIcon(ComponentClasses: array of TComponentClass);
  1152. procedure RegisterNonActiveX(ComponentClasses: array of TComponentClass;
  1153. AxRegType: TActiveXRegType);
  1154. { Object filing routines }
  1155. type
  1156. TIdentMapEntry = record
  1157. Value: Integer;
  1158. Name: String;
  1159. end;
  1160. TIdentToInt = function(const Ident: string; var Int: Longint): Boolean;
  1161. TIntToIdent = function(Int: Longint; var Ident: string): Boolean;
  1162. TFindGlobalComponent = function(const Name: string): TComponent;
  1163. var
  1164. MainThreadID: THandle;
  1165. FindGlobalComponent: TFindGlobalComponent;
  1166. procedure RegisterIntegerConsts(IntegerType: Pointer; IdentToInt: TIdentToInt;
  1167. IntToIdent: TIntToIdent);
  1168. function IdentToInt(const Ident: string; var Int: Longint; const Map: array of TIdentMapEntry): Boolean;
  1169. function IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean;
  1170. function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
  1171. function InitComponentRes(const ResName: string; Instance: TComponent): Boolean;
  1172. function ReadComponentRes(const ResName: string; Instance: TComponent): TComponent;
  1173. function ReadComponentResEx(HInstance: THandle; const ResName: string): TComponent;
  1174. function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
  1175. procedure WriteComponentResFile(const FileName: string; Instance: TComponent);
  1176. procedure GlobalFixupReferences;
  1177. procedure GetFixupReferenceNames(Root: TComponent; Names: TStrings);
  1178. procedure GetFixupInstanceNames(Root: TComponent;
  1179. const ReferenceRootName: string; Names: TStrings);
  1180. procedure RedirectFixupReferences(Root: TComponent; const OldRootName,
  1181. NewRootName: string);
  1182. procedure RemoveFixupReferences(Root: TComponent; const RootName: string);
  1183. procedure RemoveFixups(Instance: TPersistent);
  1184. procedure BeginGlobalLoading;
  1185. procedure NotifyGlobalLoading;
  1186. procedure EndGlobalLoading;
  1187. function CollectionsEqual(C1, C2: TCollection): Boolean;
  1188. { Object conversion routines }
  1189. procedure ObjectBinaryToText(Input, Output: TStream);
  1190. procedure ObjectTextToBinary(Input, Output: TStream);
  1191. procedure ObjectResourceToText(Input, Output: TStream);
  1192. procedure ObjectTextToResource(Input, Output: TStream);
  1193. { Utility routines }
  1194. function LineStart(Buffer, BufPos: PChar): PChar;
  1195. {
  1196. $Log$
  1197. Revision 1.21 2000-01-07 01:24:33 peter
  1198. * updated copyright to 2000
  1199. Revision 1.20 2000/01/06 01:20:32 peter
  1200. * moved out of packages/ back to topdir
  1201. Revision 1.3 2000/01/05 11:05:29 michael
  1202. + Better collection support
  1203. Revision 1.2 2000/01/04 18:07:16 michael
  1204. + Streaming implemented
  1205. Revision 1.1 2000/01/03 19:33:07 peter
  1206. * moved to packages dir
  1207. Revision 1.18 1999/11/30 15:28:38 michael
  1208. + Added FileNAme property for filestreams
  1209. Revision 1.17 1999/10/20 20:24:21 florian
  1210. + sc* constants added as suggested by Shane Miller
  1211. Revision 1.16 1999/09/13 08:35:16 fcl
  1212. * Changed some argument names (Root->ARoot etc.) because the new compiler
  1213. now performs more ambiguity checks (sg)
  1214. Revision 1.15 1999/09/11 22:01:03 fcl
  1215. * Activated component registration callbacks (sg)
  1216. Revision 1.14 1999/08/26 21:11:25 peter
  1217. * ShiftState extended
  1218. Revision 1.13 1999/05/31 12:43:10 peter
  1219. * fixed tthread for linux additions
  1220. Revision 1.12 1999/05/14 17:52:53 peter
  1221. * removed wrong destroy overrides (gave errors with the new compiler)
  1222. Revision 1.11 1999/04/09 12:13:30 michael
  1223. + Changed TBits to TbitsPlus from Michael A. Hess (renamed to Tbits)
  1224. Revision 1.10 1998/10/30 14:52:49 michael
  1225. + Added format in interface
  1226. + Some errors in parser fixed, it uses exceptions now
  1227. + Strings now has no more syntax errors.
  1228. Revision 1.9 1998/10/24 13:45:35 michael
  1229. + Implemented stringlist. Untested, since classes broken.
  1230. Revision 1.8 1998/09/23 07:47:41 michael
  1231. + Some changes by TSE
  1232. Revision 1.7 1998/08/22 10:41:00 michael
  1233. + Some adaptations for changed comment and published handling
  1234. Revision 1.6 1998/06/11 13:46:32 michael
  1235. + Fixed some functions. TFileStream OK.
  1236. Revision 1.5 1998/06/10 21:53:06 michael
  1237. + Implemented Handle/FileStreams
  1238. Revision 1.4 1998/05/27 11:41:43 michael
  1239. Implemented TCollection and TCollectionItem
  1240. Revision 1.3 1998/05/06 12:58:35 michael
  1241. + Added WriteAnsiString method to TStream
  1242. Revision 1.2 1998/05/04 14:30:11 michael
  1243. * Split file according to Class; implemented dummys for all methods, so unit compiles.
  1244. Revision 1.1 1998/05/04 12:16:01 florian
  1245. + Initial revisions after making a new directory structure
  1246. }