На delphi XE8 Firemonkey TCheckBox.GetStyleObject никогда не вызывается, почему?

Я разработал унаследованный TCheckBox, который требует некоторых стилевых исправлений.

Я достиг этого в прошлом с другими элементами управления firemonkey, переопределив метод "GetStyleObject" и выполнив необходимые исправления "на лету" над исходным объектом стиля.

Мое намерение с этим "более чистым" подходом состоит в том, чтобы позволить пользователю загружать любой стиль 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", это делает...

Какие-нибудь мысли?

Спасибо всем заранее.

1 ответ

ОК, у меня была такая же проблема, и вот как я их решил:

  1. Добавьте FMX.Styles к предложению использования
  2. Создать защищенную процедуру под названием

    Процедура AppendStyle;

  3. Создать защищенную виртуальную функцию:

    function GetClassStyleName: String; виртуальный;

  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, просто закройте их. Теперь ваше определение стиля добавлено в книгу стилей. Вам не нужно делать это для следующих компонентов, размещенных на форме

Надеюсь, что это поможет вам.

Другие вопросы по тегам