En utilisant l'unité TypInfo, il est facile d'énumérer les propriétés comme on le voit dans l'extrait suivant:Découverte de la classe où une propriété est d'abord publié avec plusieurs niveaux d'héritage
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;
Cependant, ce que je dois est à la figure la classe exacte à partir de laquelle chaque propriété hérite. Par exemple dans TControl, la propriété Tag provient de TComponent, ce qui lui donne une profondeur d'héritage de 1 (0 étant une propriété déclarée dans TControl lui-même, tel que Cursor).
Il est facile de calculer la profondeur d'héritage si je sais quelle classe a défini la propriété en premier. Pour mes buts, partout où une propriété a d'abord gagné la visibilité publiée est l'endroit où elle est apparue. J'utilise Delphi 2007. S'il vous plaît laissez-moi savoir si plus de détails sont nécessaires. Toute aide sera appréciée.
Ah ... je vois. Espérait un moyen plus direct (par exemple, avec le VMT), mais cela fonctionne définitivement. Heureusement, l'efficacité n'est pas ma principale préoccupation en ce moment. Merci pour la réponse rapide - votre solution est définitivement en dehors de la boîte * direct * dans laquelle j'ai été coincé. – Atorian