На 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 ответ
ОК, у меня была такая же проблема, и вот как я их решил:
- Добавьте FMX.Styles к предложению использования
- Создать защищенную процедуру под названием
Процедура AppendStyle;
- Создать защищенную виртуальную функцию:
function GetClassStyleName: String; виртуальный;
- Определить приватную переменную
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, просто закройте их. Теперь ваше определение стиля добавлено в книгу стилей. Вам не нужно делать это для следующих компонентов, размещенных на форме
Надеюсь, что это поможет вам.