首页  编辑  

获取窗体上面所有控件的Class?

Tags: /超级猛料/VCL/Form,窗体/   Date Created:

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;

img_20044.bmp (147.7KB)