在 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 上永远不会被调用,为啥?的主要内容,如果未能解决你的问题,请参考以下文章