Delphi World - Найти все классы, зарегистрированные классом формы
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Найти все классы, зарегистрированные классом формы

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Question: How can I get all classes that are currently registered in my Application? 

  Answer: There is no way to get at classes registered via RegisterClasses, since the 
  list holding these is private to the classes unit.You can get at the classes 
  registered on a Form, however, since those use a Table connected to the Form 
  classes class record.The following is based on some spelunking in the classes unit: 
}

 // defined in classes.pas 
type
   PFieldClassTable = ^TFieldClassTable;
   TFieldClassTable = packed record
     Count: Smallint;
     Classes: array[0..8191] of ^TPersistentClass;
   end;


 function GetFieldClassTable(AClass: TClass): PFieldClassTable; assembler;
 asm
     MOV EAX,[EAX].vmtFieldTable
     OR EAX,EAX
     JE @@1
     MOV EAX,[EAX+2].Integer
     @@1:
 end;
   // end of quote from classes.pas 

procedure TForm1.Button1Click(Sender: TObject);

   procedure Display(const S: string);
   begin
     memo1.Lines.Add(S);
   end;

    var
   pFCT: PFieldClassTable;
   aClass: TClass;
   i: SmallInt;
 begin
   memo1.Clear;
   aClass := Classtype;
   while aClass <> TPersistent do
   begin
     Display('Registered classes for class ' + aClass.ClassName);
     pFCT := GetFieldClasstable(aClass);
     if not Assigned(pFCT) then
       Display(' No classes registered')
     else
     begin
       Display(Format(' %d classes registered', [pFCT^.Count]));
       for i := 0 to pFCT^.Count - 1 do
         Display(' ' + pFCT^.Classes[i]^.ClassName);
     end;
     aClass := aClass.ClassParent;
   end
 end;
Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования