cregist.inc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. { Class registration routines }
  11. procedure RegisterClass(AClass: TPersistentClass);
  12. var
  13. aClassname : String;
  14. begin
  15. //Classlist is created during initialization.
  16. with Classlist.Locklist do
  17. try
  18. while Indexof(AClass) = -1 do
  19. begin
  20. aClassname := AClass.ClassName;
  21. if GetClass(aClassName) <> nil then //class alread registered!
  22. Begin
  23. //raise an error
  24. exit;
  25. end;
  26. Add(AClass);
  27. if AClass = TPersistent then break;
  28. AClass := TPersistentClass(AClass.ClassParent);
  29. end;
  30. finally
  31. ClassList.UnlockList;
  32. end;
  33. end;
  34. procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
  35. var
  36. I : integer;
  37. begin
  38. i := ClassAliasList.IndexOf(Alias);
  39. if I = -1 then
  40. ClassAliasList.AddObject( Alias, TObject(AClass) );
  41. end;
  42. procedure RegisterClasses(AClasses: array of TPersistentClass);
  43. var
  44. I : Integer;
  45. begin
  46. for I := low(aClasses) to high(aClasses) do
  47. RegisterClass(aClasses[I]);
  48. end;
  49. procedure UnRegisterClass(AClass: TPersistentClass);
  50. begin
  51. end;
  52. procedure UnRegisterClasses(AClasses: array of TPersistentClass);
  53. begin
  54. end;
  55. procedure UnRegisterModuleClasses(Module: HMODULE);
  56. begin
  57. end;
  58. function FindClass(const AClassName: string): TPersistentClass;
  59. begin
  60. Result := GetClass(AClassName);
  61. if not Assigned(Result) then
  62. raise EClassNotFound.CreateFmt(SClassNotFound, [AClassName]);
  63. end;
  64. function GetClass(const AClassName: string): TPersistentClass;
  65. var
  66. I : Integer;
  67. begin
  68. with ClassList.LockList do
  69. try
  70. for I := 0 to Count-1 do
  71. begin
  72. Result := TPersistentClass(Items[I]);
  73. if Result.ClassNameIs(AClassName) then Exit;
  74. end;
  75. I := ClassAliasList.Indexof(AClassName);
  76. if I >= 0 then //found
  77. Begin
  78. Result := TPersistentClass(ClassAliasList.Objects[i]);
  79. exit;
  80. end;
  81. Result := nil;
  82. finally
  83. ClassList.Unlocklist;
  84. end;
  85. end;
  86. procedure StartClassGroup(AClass: TPersistentClass);
  87. begin
  88. end;
  89. procedure GroupDescendentsWith(AClass, AClassGroup: TPersistentClass);
  90. begin
  91. end;
  92. function ActivateClassGroup(AClass: TPersistentClass): TPersistentClass;
  93. begin
  94. Result:=nil;
  95. end;
  96. function ClassGroupOf(AClass: TPersistentClass): TPersistentClass;
  97. begin
  98. Result:=nil;
  99. end;
  100. function ClassGroupOf(Instance: TPersistent): TPersistentClass;
  101. begin
  102. Result:=nil;
  103. end;
  104. { Component registration routines }
  105. type
  106. TComponentPage = class(TCollectionItem)
  107. public
  108. Name: String;
  109. Classes: TList;
  110. destructor Destroy; override;
  111. end;
  112. { TComponentPage }
  113. destructor TComponentPage.Destroy;
  114. begin
  115. Classes.Free;
  116. inherited Destroy;
  117. end;
  118. var
  119. ComponentPages: TCollection;
  120. procedure InitComponentPages;
  121. begin
  122. ComponentPages := TCollection.Create(TComponentPage);
  123. { Add a empty page which will be used for storing the NoIcon components }
  124. ComponentPages.Add;
  125. end;
  126. procedure RegisterComponents(const Page: string;
  127. ComponentClasses: array of TComponentClass);
  128. var
  129. i: Integer;
  130. pg: TComponentPage;
  131. begin
  132. if Page = '' then exit; { prevent caller from doing nonsense }
  133. pg := nil;
  134. if not Assigned(ComponentPages) then
  135. InitComponentPages
  136. else
  137. for i := 0 to ComponentPages.Count - 1 do
  138. if TComponentPage(ComponentPages.Items[i]).Name = Page then begin
  139. pg := TComponentPage(ComponentPages.Items[i]);
  140. break;
  141. end;
  142. if pg = nil then begin
  143. pg := TComponentPage(ComponentPages.Add);
  144. pg.Name := Page;
  145. end;
  146. if pg.Classes = nil then
  147. pg.Classes := TList.Create;
  148. for i := Low(ComponentClasses) to High(ComponentClasses) do
  149. pg.Classes.Add(ComponentClasses[i]);
  150. if Assigned(RegisterComponentsProc) then
  151. RegisterComponentsProc(Page, ComponentClasses);
  152. end;
  153. procedure RegisterNoIcon(ComponentClasses: array of TComponentClass);
  154. var
  155. pg: TComponentPage;
  156. i: Integer;
  157. begin
  158. if not Assigned(ComponentPages) then
  159. InitComponentPages;
  160. pg := TComponentPage(ComponentPages.Items[0]);
  161. if pg.Classes = nil then
  162. pg.Classes := TList.Create;
  163. for i := Low(ComponentClasses) to High(ComponentClasses) do
  164. pg.Classes.Add(ComponentClasses[i]);
  165. if Assigned(RegisterNoIconProc) then
  166. RegisterNoIconProc(ComponentClasses);
  167. end;
  168. procedure RegisterNonActiveX(ComponentClasses: array of TComponentClass;
  169. AxRegType: TActiveXRegType);
  170. begin
  171. end;