我使用Delphi的GetPropValue()
函数来获取TControl
类型某些对象的某些属性的值。当我获得Value
,Opacity
等简单的属性值时,一切正常,但是因为我使用firemonkey有一些扩展属性,例如RotationCenter
,它有RotationCenter.X
和RotationCenter.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);
有没有人知道通过此功能扩展这些属性的方法?
答案 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;