{
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;