Delphi - 使用GetPropValue()获取属性值

时间:2017-08-20 19:34:55

标签: delphi firemonkey

我使用Delphi的GetPropValue()函数来获取TControl类型某些对象的某些属性的值。当我获得ValueOpacity等简单的属性值时,一切正常,但是因为我使用firemonkey有一些扩展属性,例如RotationCenter,它有RotationCenter.XRotationCenter.Y,甚至是TextSettings内的文字属性,在这些属性中,子类型我无法获取值。

在这个例子中,我正确地得到了值:

If IsPublishedProp (Component_cc, 'Value') then
  EditValue.Text: = GetPropValue (Component_cc, 'Value', true);

Component_cc:TControl;并且是动态创建的,它也可以是任何类型的Firemonkey组件(到目前为止一切正常,一切正常)。

当我需要使用下面的表格时,它不起作用。

If IsPublishedProp (Component_cc, 'RotationCenter.X') then
  EditRotationCenterX.Text: = GetPropValue (CC_component, 'RotationCenter.X', true);

有没有人知道通过此功能扩展这些属性的方法?

2 个答案:

答案 0 :(得分:6)

首先,CC_component的RotationCenter属性实际上是TPosition类的一个实例,它来自TPersistent

其次,在调用IsPublishedProp时,您不能使用点分表示法。

您可以使用GetObjectProp首先检索内部TPosition实例,然后从那里访问X属性:

(假设一个简单的FMX应用程序,其中一个表单包含名为TButton的{​​{1}}和名为Button1的{​​{1}}。)

TEdit

更新,对于类型为Set的属性:

对于Set type属性,您需要使用EditRotationCenterX检索其序数值。这将是表示当前值中包含哪些元素的位数组。然后,您只需测试是否设置了适当的位。这是我更喜欢的方法。

或者,您可以使用procedure TForm1.Button1Click(Sender: TObject); var CC_component : TComponent; CC_component_RotationCenter : TPosition; begin CC_component := Button1; if IsPublishedProp(CC_component, 'RotationCenter') then begin CC_component_RotationCenter := TPosition(GetObjectProp(CC_component, 'RotationCenter')); EditRotationCenterX.Text := CC_component_RotationCenter.X.ToString; end end; ,它将返回Set的当前值中元素的文本表示。例如,如果Set的值为GetOrdProp,您将返回字符串值“TopRight,BottonLeft”。然后,检查目标元素的名称是否出现在返回的字符串中的任何位置。如果Delphi RTL或FMX库将来发生变化,这种方法很容易失败。

(此示例从上方向简单的FMX应用添加名为GetSetProp的{​​{1}}形状和名为[TCorner.BottonLeft, TCorner.TopRight]的{​​{1}}:)

TRectangle

答案 1 :(得分:5)

在谈到旧的RTTI时,你可以这样做。你需要深入了解结构。要求 X 属性为 X 对象:

var
  O: TObject;
  X: Integer;
begin
  if PropIsType(Component_cc, 'RotationCenter', tkClass) then
  begin
    O := GetObjectProp(Component_cc, 'RotationCenter');
    if Assigned(O) and PropIsType(O, 'X', tkInteger) then
      X := GetOrdProp(O, 'X');
  end;
end;