前几天在CSDN社区看到一篇《如何得到自身单元名称》的帖子,其中一位名为sdzeng网友给出了答案。受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称。

// 参数说明:
// AClass:需要获取祖先类的类
// ASeries:是一个字符串列表,用来存放返回的祖先类及其所在单元的名称
procedureGetInheritanceSeries(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;
untilnotPClass.InheritsFrom(TPersistent);
end;

使用举例

// 获取TButton类的所有祖先类及其所在单元名称
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类的派生类才可以这么使用,否则会抛出地址访问错误的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐