如何使用Delphi Seattle将自定义样式应用于自定义Firemonkey组件

时间:2016-04-08 11:09:26

标签: delphi delphi-10-seattle firemonkey-style

我为Firemonkey(fmx)创建了一个自定义Delphi组件。我现在需要将自定义样式应用于组件。样式保存在资源中。以前,这是通过调用GetStyleObjectTStyleManager.LoadFromResource方法中完成的。

此方法(LoadFromResource)在Delphi 10 Seattle中不再存在Firemonkey框架。

我在XE7中的代码正在使用LoadFromResource

function TFMXPic.GetStyleObject: TFmxObject;
var
style : string;
begin
  if (StyleLookup = '') then
  begin
    style := GetClassStyleName;
    Result := TControl(TStyleManager.LoadFromResource(HInstance,
    style, RT_RCDATA));
    Exit;
  end;
  Result := inherited GetStyleObject;
end;

如何在Delphi 10 Seattle实现这一目标?

2 个答案:

答案 0 :(得分:1)

首先,我认为检查StyleLookup是不正确的。此属性告诉组件在样式簿中查找此特定样式名称。

然后,您尝试在组件级别加载样式文件。 FMX确实像这样工作。你有一个样式书,它加载样式文件,然后表单中的每个组件都使用这本书来定位样式名称,由stylelookup值定义。

在我的脑海中,这一行动应该起到作用:

  1. 将样式文件添加到项目资源中,就像您已经完成的那样。假设您的组件有一个名为“mycomponent”的样式

  2. 形式添加样式簿
  3. 在OnCreate表格中,将资源文件加载到TResourceStream,然后使用TStyleBook.LoadFromStream将最后一个加载到样式簿

  4. 现在您可以通过设置组件的StyleLookup ='mycomponent'属性来访问该样式

  5. 希望这会有所帮助。

答案 1 :(得分:0)

我找到了解决方案。谢谢你们在TMS软件。应该使用TStyleStreaming类而不是TStyleManager类。我修改了我的代码如下(一切正在运行)

function TMyComponent.GetStyleObject: TFmxObject;
var
style : string;
begin
  if (StyleLookup = '') then
  begin
    style := GetClassStyleName;
    Result := TControl(TStyleStreaming.LoadFromResource(HInstance,
    style, RT_RCDATA));
    Exit;
  end;
  Result := inherited GetStyleObject;
end;