前幾天在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類的派生類才可以這麼使用,否則會拋出地址訪問錯誤的。