Использование устройства 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).
Вычисление глубины наследования легко, если я знаю, какой класс сначала определил свойство. Для моих целей везде, где свойство сначала получило опубликованную видимость, это место, где оно впервые появилось.
Я использую Delphi 2007. Пожалуйста, дайте мне знать, если требуется более подробная информация. Вся помощь будет оценена.
А ... Я вижу. Надеюсь на более прямой путь (например, возиться с VMT), но это определенно работает. К счастью, эффективность в настоящее время не является моей главной задачей. Спасибо за быстрый ответ - ваше решение, безусловно, находится за пределами * прямого * ящика, в который я застрял. – Atorian