【问题标题】:Use RTTIField.SetValue to set a Pointer to a Field使用 RTTIField.SetValue 设置指向字段的指针
【发布时间】:2014-11-27 18:03:09
【问题描述】:

我有一个类型:

TControlPointer = ^TControl;

还有一个类中的私有字段:

TMyClass = class(TObject)
  private
  FPointer : TControlPointer;
end;

当我尝试使用 RTTI 设置 FPointer 的值时:

procedure SetControlPointer(pControl : TControlPointer);
[...]
RTTIField.SetValue(Self,pControl);

编译器说 [dcc32 错误] myunit.pas (xxx): E2010 不兼容的类型:'TValue' 和 'TControlPointer'

有什么想法吗?

谢谢

【问题讨论】:

  • 我可以将 TControl 传递给 SetControlPointer(pControl : TControl) 和 SetValue(Self,@pControl)。但我不知道传递整个 TControl 是否是个好主意。
  • TControl(和每个对象)是指针。你真的需要使用指向指针的指针吗?
  • @MBo 如果您想修改对象中的字段,可以这样做

标签: delphi field rtti


【解决方案1】:

错误只是告诉您RTTIField.SetValue 期望传递TValue。所以我猜你只需要将指针放入TValue

TValue.From<TControlPointer>(Self.pControl)

这就是您传递给RTTIField.SetValue 的内容。

你也许可以让编译器推断类型并简单地编写

TValue.From(Self.pControl)

【讨论】:

  • 有效!如何从 RTTIField.GetValue(Self) 取回我的 TControlPointer?
  • 使用AsType&lt;TControlPointer&gt;(...) 传递TValueTValue 是 RTTI 的基础。你需要学习它。
  • TControlPointer.From(RTTIField.GetValue(Self)) 不起作用。
  • 好吧,不。这就产生了一个新的 TValue。
  • 太棒了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 2018-03-03
  • 1970-01-01
  • 2022-10-14
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多