cregist.inc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. {
  2. $Id$
  3. This file is part of the Free Component Library (FCL)
  4. Copyright (c) 1999-2000 by the Free Pascal development team
  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. { Class registration routines }
  12. procedure RegisterClass(AClass: TPersistentClass);
  13. var
  14. aClassname : String;
  15. begin
  16. //Classlist is created during initialization.
  17. with Classlist.Locklist do
  18. try
  19. while Indexof(AClass) = -1 do
  20. begin
  21. aClassname := AClass.ClassName;
  22. if GetClass(aClassName) <> nil then //class alread registered!
  23. Begin
  24. //raise an error
  25. exit;
  26. end;
  27. Add(AClass);
  28. if AClass = TPersistent then break;
  29. AClass := TPersistentClass(AClass.ClassParent);
  30. end;
  31. finally
  32. ClassList.UnlockList;
  33. end;
  34. end;
  35. procedure RegisterClasses(AClasses: array of TPersistentClass);
  36. var
  37. I : Integer;
  38. begin
  39. for I := low(aClasses) to high(aClasses) do
  40. RegisterClass(aClasses[I]);
  41. end;
  42. procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
  43. begin
  44. end;
  45. procedure UnRegisterClass(AClass: TPersistentClass);
  46. begin
  47. end;
  48. procedure UnRegisterClasses(AClasses: array of TPersistentClass);
  49. begin
  50. end;
  51. procedure UnRegisterModuleClasses(Module: HMODULE);
  52. begin
  53. end;
  54. function FindClass(const AClassName: string): TPersistentClass;
  55. begin
  56. Result := GetClass(AClassName);
  57. if not Assigned(Result) then
  58. raise EClassNotFound.CreateFmt(SClassNotFound, [AClassName]);
  59. end;
  60. function GetClass(const AClassName: string): TPersistentClass;
  61. var
  62. I : Integer;
  63. begin
  64. with ClassList.LockList do
  65. try
  66. for I := 0 to Count-1 do
  67. begin
  68. Result := TPersistentClass(Items[I]);
  69. if Result.ClassNameIs(AClassName) then Exit;
  70. end;
  71. I := ClassAliasList.Indexof(AClassName);
  72. if I >= 0 then //found
  73. Begin
  74. Result := TPersistentClass(ClassAliasList.Objects[i]);
  75. exit;
  76. end;
  77. Result := nil;
  78. finally
  79. ClassList.Unlocklist;
  80. end;
  81. end;
  82. { Component registration routines }
  83. type
  84. TComponentPage = class(TCollectionItem)
  85. public
  86. Name: String;
  87. Classes: TList;
  88. destructor Destroy; override;
  89. end;
  90. { TComponentPage }
  91. destructor TComponentPage.Destroy;
  92. begin
  93. Classes.Free;
  94. inherited Destroy;
  95. end;
  96. var
  97. ComponentPages: TCollection;
  98. procedure InitComponentPages;
  99. begin
  100. ComponentPages := TCollection.Create(TComponentPage);
  101. { Add a empty page which will be used for storing the NoIcon components }
  102. ComponentPages.Add;
  103. end;
  104. procedure RegisterComponents(const Page: string;
  105. ComponentClasses: array of TComponentClass);
  106. var
  107. i: Integer;
  108. pg: TComponentPage;
  109. begin
  110. if Page = '' then exit; { prevent caller from doing nonsense }
  111. pg := nil;
  112. if not Assigned(ComponentPages) then
  113. InitComponentPages
  114. else
  115. for i := 0 to ComponentPages.Count - 1 do
  116. if TComponentPage(ComponentPages.Items[i]).Name = Page then begin
  117. pg := TComponentPage(ComponentPages.Items[i]);
  118. break;
  119. end;
  120. if pg = nil then begin
  121. pg := TComponentPage(ComponentPages.Add);
  122. pg.Name := Page;
  123. end;
  124. if pg.Classes = nil then
  125. pg.Classes := TList.Create;
  126. for i := Low(ComponentClasses) to High(ComponentClasses) do
  127. pg.Classes.Add(ComponentClasses[i]);
  128. if Assigned(RegisterComponentsProc) then
  129. RegisterComponentsProc(Page, ComponentClasses);
  130. end;
  131. procedure RegisterNoIcon(ComponentClasses: array of TComponentClass);
  132. var
  133. pg: TComponentPage;
  134. i: Integer;
  135. begin
  136. if not Assigned(ComponentPages) then
  137. InitComponentPages;
  138. pg := TComponentPage(ComponentPages.Items[0]);
  139. if pg.Classes = nil then
  140. pg.Classes := TList.Create;
  141. for i := Low(ComponentClasses) to High(ComponentClasses) do
  142. pg.Classes.Add(ComponentClasses[i]);
  143. if Assigned(RegisterNoIconProc) then
  144. RegisterNoIconProc(ComponentClasses);
  145. end;
  146. procedure RegisterNonActiveX(ComponentClasses: array of TComponentClass;
  147. AxRegType: TActiveXRegType);
  148. begin
  149. end;
  150. {
  151. $Log$
  152. Revision 1.1 2003-10-06 21:01:06 peter
  153. * moved classes unit to rtl
  154. Revision 1.5 2003/04/19 14:29:25 michael
  155. + Fix from Mattias Gaertner, closes memory leak
  156. Revision 1.4 2002/09/07 15:15:24 peter
  157. * old logs removed and tabs fixed
  158. }