使用Typinfo單元的多層次出版類,很容易枚舉屬性,如下面的代碼片段所示:發現其中一個物業首次與繼承
procedure TYRPropertiesMap.InitFrom(AClass: TClass; InheritLevel: Integer = 0);
var
propInfo: PPropInfo;
propCount: Integer;
propList: PPropList;
propType: PPTypeInfo;
pm: TYRPropertyMap;
classInfo: TClassInfo;
ix: Integer;
begin
ClearMap;
propCount := GetPropList(PTypeInfo(AClass.ClassInfo), propList);
for ix := 0 to propCount - 1 do
begin
propInfo := propList^[ix];
propType := propInfo^.PropType;
if propType^.Kind = tkMethod then
Continue; // Skip methods
{ Need to get GetPropInheritenceIndex to work
if GetPropInheritenceIndex(propInfo) > InheritLevel then
Continue; // Dont include properties deeper than InheritLevel
}
pm := TYRPropertyMap.Create(propInfo.Name);
FList.Add(pm);
end;
end;
不過,我需要的是人物從每個屬性繼承的確切類。 例如在TControl中,Tag屬性來自TComponent,它給它一個1的繼承深度(0是在TControl本身中聲明的屬性,例如Cursor)。
如果我知道哪個類首先定義了屬性,則計算繼承深度很容易。就我的目的而言,無論財產第一次獲得發佈可見性的地方都是它首次出現的地方。
我正在使用德爾福2007年。請讓我知道是否需要更多的細節。所有的幫助將不勝感激。
啊......我明白了。希望有一個更直接的方式(例如與VMT搞混),但這絕對有效。幸運的是效率目前並不是我主要關心的問題。感謝您的快速回答 - 您的解決方案絕對在* direct *框之外,我被卡住了。 – Atorian 2009-10-14 11:32:53