Mega Code Archive

 
Categories / Delphi / Examples
 

Find all classes registered by a form class

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