【发布时间】:2019-08-31 21:10:02
【问题描述】:
可能有人已经问过这个问题,但还没有找到,所以问题就出在这里:
我想解析一个组件的 tkSet 属性(在我们的例子中是 Panel1),但我不知道如何正确地做到这一点。我能够使用 rContext.FindType() 找到集合的基本枚举类型,但我几乎可以肯定有一些更优雅/更简单的方法可以做到这一点。从那时起,我完全迷失了。我应该遍历该枚举类型的值,并根据组件的当前属性值检查每个值。
procedure TForm12.GetProperties2;
var
rContext: TRttiContext;
rType: TRttiType;
rProp: TRttiProperty;
begin
rType := rContext.GetType(Panel1.ClassType);
for rProp in rType.GetProperties do
begin
if (rProp.Visibility in [mvPublished]) and (rProp.PropertyType.TypeKind in [tkSet]) and (rProp.Name = 'Anchors') then
begin
Memo1.Lines.Add('Name: ' + rProp.Name);
Memo1.Lines.Add('PropertyType: ' + rProp.PropertyType.ToString);
Memo1.Lines.Add('Value: ' + rProp.GetValue(Panel1).ToString);
Memo1.Lines.Add('QualifiedName: ' + rProp.PropertyType.QualifiedName);
Memo1.Lines.Add('ElementType: ' + rContext.FindType(rProp.PropertyType.QualifiedName).AsSet.ElementType.ToString);
// here comes the desired results
Memo1.Lines.Add('Possible values:');
Memo1.Lines.Add(' 0 > akLeft');
Memo1.Lines.Add(' 1 > akTop');
Memo1.Lines.Add(' 2 > akRight');
Memo1.Lines.Add(' 3 > akBottom');
Memo1.Lines.Add('Present values:');
Memo1.Lines.Add(' 0 > akLeft');
Memo1.Lines.Add(' 1 > akTop');
Memo1.Lines.Add('');
end;
end;
end;
另一个可能的问题是没有基本枚举类型的集合属性,例如,如果您查看 TPanel.StyleElements 属性,您可以看到 TStyleElements 的声明如下:
TStyleElements = set of (seFont, seClient, seBorder);
在这种情况下,ElementType 不起作用。
所以问题是如何解析 tkSet 类型属性以使用 RTTI 上下文获得所需的结果?
【问题讨论】:
-
为什么必须没有 TypInfo 单元?
-
因为我现在想学习 RTTI 功能
-
它是扩展 RTTI。我不认为新的 RTTI 可以完全替代。它至少使用仍然在单元 TypInfo 中的 PTypeInfo。
-
我明白了。那么解决这个问题一定需要 TypInfo 参与?
-
@tcxbalage:如果没有 TypInfo 单元,您不太可能使用 RTTI 实现任何有用的功能。