用来获取指定类的所有祖先类的名称及其所在的单元名称。

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

使用举例

// 获取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类的派生类才可以这么使用,否则会抛出地址访问错误的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值