您的位置:首页 > 编程语言 > Delphi

Delphi中获取某类的祖先类及其所在单元名称

2007-11-17 21:09 267 查看
前几天在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类的派生类才可以这么使用,否则会抛出地址访问错误的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: