0

我有一个类,其中包含一些我想列出的已发布属性。这些属性是来自 DevExpress 样式的 TcxCustomStyle 类型。我使用以下代码将名称添加到 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;
4

2 回答 2

1

很难确定哪里出了问题,因为我们遗漏了很多细节。尤其是您没有包含有关类型的任何信息,也没有包含错误消息。

让我大吃一惊的是,您将其设置rType为指定的类型Settings.Styling.ClassTypeSelf然后你遍历它的属性并从一个类型为的实例中读取它们TfrmMain。那看起来不对。您传递给的参数GetValue必须是类型Settings.Styling.ClassType。我希望您需要将不同的实例传递给GetValue.

我也会质疑使用 unchecked cast TcxCustomStyle(...)。这对你来说很难。使用检查演员表:... as TcxCustomStyle.

您的代码还假定 的所有属性Settings.Styling.ClassType都是 type TcxCustomStyle。也许这是一个合理的假设,我不知道。

于 2013-06-16T17:20:14.240 回答
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;
于 2013-06-16T19:42:24.557 回答