我有一个类,其中包含一些我想列出的已发布属性。 属性为TcxCustomStyle类型,来自DevExpress样式。 我使用以下代码将名称添加到memdata表中,如果我删除所有相关的TcxCustomStyle,它就可以正常工作。
问题是如何获取TcxCustomStyle类型的属性的值?
很可能这是我身边的简单错误 - 但我无法弄清楚是什么。
procedure TfrmMain.ListProperties;
var
ctx: TRttiContext;
rType: TRttiType;
rProp: TRttiProperty;
i: integer;
Value: TcxCustomStyle;
begin
i := 1;
memProperties.DisableControls;
try
memProperties.Close;
memProperties.Open;
rType := ctx.GetType(Settings.Styling.ClassType);
for rProp in rType.GetProperties do
begin
Value := TcxCustomStyle(rProp.GetValue(Self).AsObject);
memProperties.AppendRecord([i, rProp.Name, Value.Name]);
Inc(i);
end;
finally
ctx.Free;
memProperties.EnableControls;
end;
end;
答案 0 :(得分:1)
有点难以确定是什么问题,因为我们缺少很多细节。尤其是您没有包含有关类型的信息,也没有错误消息。
跳出来的是你将rType
设置为Settings.Styling.ClassType
指定的类型。然后,遍历其属性并从类型为Self
的实例TfrmMain
中读取它们。那看起来不对。传递给GetValue
的参数必须是Settings.Styling.ClassType
类型。我希望你需要将另一个实例传递给GetValue
。
我还会质疑使用未经检查的演员TcxCustomStyle(...)
。这对你来说很难。使用经过检查的演员:... as TcxCustomStyle
。
您的代码还假定Settings.Styling.ClassType
的所有属性都属于TcxCustomStyle
类型。也许这是一个合理的假设,我不知道。
答案 1 :(得分:0)
花了一些时间查看旧代码后,我将该函数重写为以下工作代码。 现在我只想弄清楚如何在类中存储每个属性的描述 - 我已经看到完成了。我需要TcxCustomStyle值和我可以显示的描述。但这是另一个问题。
procedure TfrmMain.ListProperties;
var
ctx : TRttiContext;
lType : TRttiType;
lProperty : TRttiProperty;
i : integer;
Value : TcxCustomStyle;
begin
i := 1;
memProperties.DisableControls;
ctx := TRttiContext.Create;
try
memProperties.Close;
memProperties.Open;
lType := ctx.GetType(Settings.Styling.ClassType);
for lProperty in lType.GetProperties do
begin
Value := TcxCustomStyle(lProperty.GetValue(Settings.Styling).AsObject);
memProperties.AppendRecord([i, lProperty.Name, Value.Name]);
Inc(i);
end;
finally
ctx.Free;
memProperties.EnableControls;
end;
end;