delphi – 发现具有多级继承的属性首次发布的类
发布时间:2020-12-15 04:19:42 所属栏目:大数据 来源:网络整理
导读:使用Typinfo单元,可以轻松枚举属性,如以下代码段所示: procedure TYRPropertiesMap.InitFrom(AClass: TClass; InheritLevel: Integer = 0);var propInfo: PPropInfo; propCount: Integer; propList: PPropList; propType: PPTypeInfo; pm: TYRPropertyMap;
使用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; 但是,我需要的是找出每个属性继承的确切类. 如果我知道哪个类首先定义了属性,那么计算继承深度很容易.就我的目的而言,无论财产首次获得公布的知名度,它都是首次出现的地方. 我正在使用Delphi 2007.如果需要更多详细信息,请告诉我.所有帮助将不胜感激. 解决方法
这对我有用.
关键是从传递的子TypeInfo中获取父类的TypeInfo procedure InheritanceLevel(AClassInfo: PTypeInfo; const AProperty: string; var level: Integer); var propInfo: PPropInfo; propCount: Integer; propList: PPropList; ix: Integer; begin if not Assigned(AClassInfo) then Exit; propCount := GetPropList(AClassInfo,propList); for ix := 0 to propCount - 1 do begin propInfo := propList^[ix]; if propInfo^.Name = AProperty then begin Inc(level); InheritanceLevel(GetTypeData(AClassInfo).ParentInfo^,AProperty,level) end; end; end; procedure TForm1.Button1Click(Sender: TObject); var level: Integer; begin level := 0; InheritanceLevel(PTypeInfo(TForm.ClassInfo),'Tag',level); end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |