1

我开发了一个继承的 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”,它确实......

有什么想法吗?

谢谢大家。

4

1 回答 1

1

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

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

    程序追加样式;

  3. 创建受保护的虚函数:

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

  4. 定义私有变量
    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;

如果分配(FStyle)然后FreeAndNil(FStyle);

到处用组件的类名替换 TPlayerButton。

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

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

希望这会帮助你。

于 2017-10-07T22:55:50.443 回答