...find all classes registered by a form class?

Author: P. Below
Homepage: http://www.teamb.com

Category: Misc

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

 

printed from
www.swissdelphicenter.ch
developers knowledge base