gpt4 book ai didi

delphi - 发现首次发布具有多个继承级别的属性的类

转载 作者:行者123 更新时间:2023-12-03 14:53:32 26 4
gpt4 key购买 nike

使用 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)。

如果我知道哪个类首先定义了该属性,那么计算继承深度就很容易。就我而言,属性(property)首次获得公开曝光的地方就是它首次出现的地方。

我正在使用 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;

关于delphi - 发现首次发布具有多个继承级别的属性的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com