用來獲取指定類的所有祖先類的名稱及其所在的單元名稱。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章