//參數說明:
//AClass: 需要獲取祖先類的類
//ASeries: 是一個字符串列表,用來存放返回的祖先類及其所在單元的名稱
procedure GetInheritanceSeries(AClass: TClass; out ASeries: TStringList);
var
PTD: PTypeData;
PTI: PTypeInfo;
PClass: TClass;
begin
ASeries.Clear;
PClass := TButton;
//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;
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;
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類的派生類纔可以這麼使用,否則會拋出地址訪問錯誤的。