为什么自定义 FireMonkey 组件的"Edit custom style"会导致 TStyleBook 中的空样式?



我在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;

这种方法的实施完全正确吗?

组件供应商使用您用于加载样式的方法,即重写GetStyleObject,因为它使最终用户更容易安装和使用其组件。事实上,一旦你完成了自己的组件的开发,这可能是一种部署它们的有用方法,因为它可以解决FireMonkey在样式管理方面的一些不足。然而,它也绕过了样式系统的一些默认行为,这些行为在开发和编辑样式时非常有用。

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

为了编辑样式,您需要将其加载到样式书组件中。首先,您需要将样式包装在一个TLayout中,

object TLayout
  ...Your style here
end

(不用担心压痕)。

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

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

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

现在我们来谈谈部署问题。

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

最新更新