1

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

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

我在 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 中实现这一目标?

4

2 回答 2

1

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

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

在我的脑海中,这一系列的行动应该可以完成这项工作:

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

  2. 在表单中添加样式书

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

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

希望这可以帮助。

于 2016-04-08T14:30:11.353 回答
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;
于 2016-04-11T10:49:52.943 回答