如何更改FM TSpeedButton的颜色

时间:2013-10-25 15:24:07

标签: delphi button colors firemonkey delphi-xe5

我的应用程序有几个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的颜色?

顺便说一下:有没有办法确定哪种类型的对象确实是返回的?我在调试器中找不到。

2 个答案:

答案 0 :(得分:3)

您链接的问题的答案与矢量样式有关,其中样式完全由形状等构成(例如TRectangle)。

在较新版本的FireMonkey中,“系统”样式(模仿操作系统外观)和其他一些样式使用位图。

如果要编辑位图样式,则需要在样式中找到位图图像,对其进行编辑,然后重新/编辑按钮的样式以使用新图像。 (如果你在移动设备上这可能很难,你甚至不应该尝试它。)

另一种方法是更改​​为Delphi提供的一种位图样式。您可以在Delphi安装的redist / styles / fmx文件夹下找到它们。

对于对象的类,并根据其他注释,检查返回的对象的ClassName属性。

但请记住,并非每种风格都会有一个名为“背景”的物体。对象的名称和它的类可以很容易地在不同的样式之间变化。你真的应该看看你想要从中取出物品的样式,看看那里有什么。 (注意,对象名称('background')将在StyleName属性中。)

答案 1 :(得分:1)

使用TColorButton会更容易,直接暴露Color属性。您可以在组件面板的Colors页面上找到它。以下是IDE表单设计器中新的FMX表单上的两个:

Image of two TColorButtons

就“返回哪种类型的对象”而言,您可以使用调试器或ShowMessage作为返回值的TFMXObject.ClassName

var 
  Obj: TFmxObject; 
begin 
  Obj := Button1.FindResource('background'); 
  if Assigned(Obj) then 
    ShowMessage(Obj.ClassName); 
end;