前几天在CSDN社区看到一篇《
如何得到自身单元名称
》的帖子,其中一位名为
sdzeng
网友给出了答案。受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称。
//
参数说明:
// AClass: 需要获取祖先类的类
// ASeries: 是一个字符串列表,用来存放返回的祖先类及其所在单元的名称
procedure GetInheritanceSeries(AClass: TClass; out ASeries: TStringList);
var
PTD: PTypeData;
PTI: PTypeInfo;
PClass: TClass;
begin
ASeries.Clear;
PClass : = TButton;
// AClass: 需要获取祖先类的类
// ASeries: 是一个字符串列表,用来存放返回的祖先类及其所在单元的名称
procedure GetInheritanceSeries(AClass: TClass; out ASeries: TStringList);
var
PTD: PTypeData;
PTI: PTypeInfo;
PClass: TClass;
begin
ASeries.Clear;
PClass : = TButton;
if not PClass.InheritsFrom(TPersistent) then Exit;
PTD : = GetTypeData(PClass.ClassInfo);
ASeries.Add(Format( ' %s(%s) ' , [PClass.ClassName, PTD.UnitName]));
repeat
PTD : = GetTypeData(PClass.ClassInfo);
PTI : = PTD.ParentInfo ^ ;
ASeries.Insert( 0 , Format( ' %s(%s) ' , [PTI ^ .Name, PTD.UnitName]));
PClass : = PClass.ClassParent;
until not PClass.InheritsFrom(TPersistent);
end;
PTD : = GetTypeData(PClass.ClassInfo);
ASeries.Add(Format( ' %s(%s) ' , [PClass.ClassName, PTD.UnitName]));
repeat
PTD : = GetTypeData(PClass.ClassInfo);
PTI : = PTD.ParentInfo ^ ;
ASeries.Insert( 0 , Format( ' %s(%s) ' , [PTI ^ .Name, PTD.UnitName]));
PClass : = PClass.ClassParent;
until not PClass.InheritsFrom(TPersistent);
end;
使用举例
//
获取TButton类的所有祖先类及其所在单元名称
var
sl: TStringList;
begin
sl : = TStringList.Create;
try
GetInheritanceSeries(TButton, sl);
Memo1.Lines.AddStrings(sl);
finally
sl.Free;
end;
end;
var
sl: TStringList;
begin
sl : = TStringList.Create;
try
GetInheritanceSeries(TButton, sl);
Memo1.Lines.AddStrings(sl);
finally
sl.Free;
end;
end;
返回结果如下:
TObject(Classes)
TPersistent(Classes)
TComponent(Controls)
TControl(Controls)
TWinControl(StdCtrls)
TButtonControl(StdCtrls)
TButton(StdCtrls)
补充说明
注意上术代码中GetTypeData(PClass.ClassInfo);的使用,必须保证该类是从TPersistent类的派生类才可以这么使用,否则会抛出地址访问错误的。