在 delphi XE8 Firemonkey TCheckBox.GetStyleObject 上永远不会被调用,为啥?

Posted

技术标签:

【中文标题】在 delphi XE8 Firemonkey TCheckBox.GetStyleObject 上永远不会被调用,为啥?【英文标题】:On delphi XE8 Firemonkey TCheckBox.GetStyleObject is never called, why?在 delphi XE8 Firemonkey TCheckBox.GetStyleObject 上永远不会被调用,为什么? 【发布时间】:2016-08-18 18:30:55 【问题描述】:

我开发了一个继承的 TCheckBox,需要一些样式修复。

过去,我通过覆盖“GetStyleObject”方法并在原始样式对象上“即时”进行必要的修复,使用其他 firemonkey 控件实现了这一点。

我使用这种“更干净”的方法的目的是允许用户加载任何默认的 firemonkey 样式,并且仍然能够编写我自己版本的一些样式控件。

例如:

type

  TMyCheckBox = class(TCheckBox)
  protected
    function GetStyleObject: TFmxObject; override;
  end;

function TMyCheckBox.GetStyleObject: TFmxObject;
begin
  Result := inherited;
  do the required changes over the returned object
end;

但是,使用此代码,奇怪的是“TMyCheckBox.GetStyleObject”永远不会被调用,但对于其他控件,如自定义“TreeViewItem”,它会......

有什么想法吗?

提前谢谢大家。

【问题讨论】:

ControlType 设置为:样式还是平台? ControlType 设置为:样式化 【参考方案1】:

好的 我遇到了同样的问题,这是我解决它们的方法:

    FMX.Styles添加到uses子句 创建名为的受保护过程

    程序追加样式;

    创建受保护的虚函数:

    函数GetClassStyleName:字符串;虚拟的;

    定义私有变量FStyle : TFMXObject;

解释见下面代码: 这是我的组件的代码:

Procedure TPlayerButton.AppendStyle;
var
  StyleObject : TFmxObject;
  BinStream   : TMemoryStream;
begin
  BinStream := TMemoryStream.Create;
  Try
    StyleObject := GetStyleObject;
      Try
        BinStream.WriteComponent(StyleObject);
        BinStream.Position := 0;
        FStyle := TStyleStreaming.LoadFromStream(BinStream)
      Finally
        StyleObject.Free;
      End;
  Finally
    BinStream.Free
  End;
End;

function TPlayerButton.GetClassStyleName: String;
begin
  Result := GetClassName + 'style';
  Delete(Result, 1, 1);
end;

` 4. 在组件构造函数中添加最后一行:

constructor TPlayerButton.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);
   ...
   FStyle := nil;
   AppendStyle;
   StyleLookup                 := 'PlayerButtonStyle';
End;

记得在析构函数中释放 FStyle;

if 赋值(FStyle) Then FreeAndNil(FStyle);

在任何地方都将 TPlayerButton 替换为组件的类名。

非常重要: 记住当在表单上放置第一个组件时右键单击它并选择 编辑默认样式

当 Delphi 样式编辑器出现时,关闭它们。 现在您的样式定义已添加到样式簿中。 您不需要为放置在表单中的下一个组件执行此操作

希望这会对您有所帮助。

【讨论】:

不是我想要的,我不打算在设计时使用它,只在运行时使用,并且不创建额外的样式来导致更多的 fmx 资源开销,目标是“篡改”或“优化”运行时任何默认对象的默认样式,保持其结构完整性,但努力... ;-)

以上是关于在 delphi XE8 Firemonkey TCheckBox.GetStyleObject 上永远不会被调用,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE8帮助中的REST相关内容。

如何在Delphi FireMonkey中发送iOS的推送通知

DELPHI XE8 远程调试

Delphi - 如何正确注册自 XE8 以来的图形类?

Delphi XE8 TStyleBook的使用

求救,这个delphi xe8要怎么破解