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