为什么自定义FireMonkey组件的“编辑自定义样式”导致TStyleBook中的空样式?

时间:2013-11-27 17:33:49

标签: delphi firemonkey delphi-xe5

我在FireMonkey(Delphi XE5)中编写了一个自定义组件(TGMailLabel),一切似乎都没问题但是当我在FireMonkey(桌面)表单上有一个组件实例并尝试“编辑自定义样式”时,IDE会放置正确地在我的表单上的TStyleBook实例并打开样式设计器但没有项目。

如果你做同样的事情,但试图“编辑默认样式”,它可以工作......

您可以在http://blog.delphiedintorni.it/2013/11/tgmaillabel-un-esempio-di-custom.html的博文中找到完整的源代码 (文章末尾有完整源代码zip的链接)

function TGMailLabel.GetStyleObject(const Clone: Boolean): TFmxObject;`
begin
  if (StyleLookup = '') then
    Result := TFmxObject(TStyleManager.LoadFromResource(HInstance, GMailLabelStyleName, RT_RCDATA))
  else
    Result := inherited GetStyleObject(Clone);
end;

此方法实现完全正确吗?

1 个答案:

答案 0 :(得分:0)

组件供应商使用加载样式的方法,即重写GetStyleObject,因为它使最终用户更容易安装和使用它们的组件。实际上,在完成开发后,它可以是部署自己的组件的有用方法,因为它解决了FireMonkey管理样式的一些不足之处。但是,它还绕过了样式系统的一些默认行为,这些行为在开发和编辑样式时非常有用。

通常,FireMonkey会根据组件类名称或StyleLookup属性在活动样式和任何样式书中搜索合适的样式。您正在使用的代码直接从资源加载它的样式,并忽略活动样式和样式书中的任何内容,但如果设置了StyleLookup,它会保留默认行为。

要编辑样式,您需要将其加载到样式簿组件中。首先,您需要将样式包装在TLayout中,

object TLayout
  ...Your style here
end

(不要担心缩进)。

现在,您可以双击样式簿并打开文件。

通过获取组件的类名,删除T并附加“style”,设置样式的StyleName(它的“root”对象)。例如。 TMyEdit将成为'myeditstyle'。

注释掉你的GetStyleObject例程,你的组件应该选择样式。

现在你遇到了部署问题。

  • 您可以恢复为GetStyleObject方法。
  • 您可以将样式加载到要在其上使用的每个表单上的样式簿中。
  • 您可以创建一个全局样式书并将每个表单的StyleBook属性指向它(确保在释放每个表单之前取消该属性)。
  • 您可以编辑用于包含它的默认样式(系统样式不可用)。
  • 或者,我还没有尝试通过将样式元素的Parent设置为TStyleManager.ActiveStyle返回的对象,将样式元素注入活动样式。