我的应用程序有几个TSpeedButtons
用于选择颜色,我希望每个选项都以TSpeedButton
的颜色显示。
我在Stackoverflow上找到了关于如何更改TButton
颜色的this answer。第二个答案(动态改变颜色)似乎是我正在寻找的解决方案。内容如下:
var r: TRectangle;
begin
// Find the background TRectangle style element for the button
r := (Button1.FindStyleResource('background') as TRectangle);
if Assigned(r) then
begin
r.Fill.Color := claBlue;
end;
end;
这不再起作用了(我使用XE5,这是XE2?)。它在r := ...
语句中生成一个异常:
"illegal cast".
FindStyleResource返回一个FMXObject。
TRectangle是TShape-> TControl-> TFMXObject。
我可以投射到TControl,但不能投射到TShape。如果你想知道,Button1是一个TButton。
有谁知道我如何更改TSpeedButton
的颜色?
顺便说一下:有没有办法确定哪种类型的对象确实是返回的?我在调试器中找不到。
答案 0 :(得分:3)
您链接的问题的答案与矢量样式有关,其中样式完全由形状等构成(例如TRectangle)。
在较新版本的FireMonkey中,“系统”样式(模仿操作系统外观)和其他一些样式使用位图。
如果要编辑位图样式,则需要在样式中找到位图图像,对其进行编辑,然后重新/编辑按钮的样式以使用新图像。 (如果你在移动设备上这可能很难,你甚至不应该尝试它。)
另一种方法是更改为Delphi提供的一种位图样式。您可以在Delphi安装的redist / styles / fmx文件夹下找到它们。
对于对象的类,并根据其他注释,检查返回的对象的ClassName属性。
但请记住,并非每种风格都会有一个名为“背景”的物体。对象的名称和它的类可以很容易地在不同的样式之间变化。你真的应该看看你想要从中取出物品的样式,看看那里有什么。 (注意,对象名称('background')将在StyleName属性中。)
答案 1 :(得分:1)
使用TColorButton
会更容易,直接暴露Color
属性。您可以在组件面板的Colors
页面上找到它。以下是IDE表单设计器中新的FMX表单上的两个:
就“返回哪种类型的对象”而言,您可以使用调试器或ShowMessage
作为返回值的TFMXObject.ClassName
:
var
Obj: TFmxObject;
begin
Obj := Button1.FindResource('background');
if Assigned(Obj) then
ShowMessage(Obj.ClassName);
end;