Установка параметров текста в Fire Monkey 2

by Oct 9, 2012

Среди незаметных, но полезных, на мой взгляд, нововведений в XE3 имеется интерфейс ITextSettings, который описан в модуле FMX.Types.

Часто нам надо изменить некоторые параметры выводимого текста для компонента, класс которого нам заранее неизвестен, например это может быть  TText, или TTextControl у которых есть свойства Color и FontColor. Раньше пришлось бы проверять тип экземпляра и выполнять приведение типов:

if Obj is Ttext then
  TText(Obj).Color := MyColor
else if Obj is TTextControl then
  TTextControl(Obj).FontColor := MyColor;

Можно еще обращаться к публичным свойствам через RTTI, но как-то это меня печалит учитывая, что кроме цвета есть и другие свойства текста…

ITextSettings

Использование интерфейса существенно упростит задачу и сделает решение более универсальным.

var
  Settings: ITextSettings;
  Instance: TComponent;
begin
...
  if IInterface(Instance).QueryInterface(ITextSettings, Settings) = S_OK then
  begin
    // Получен интерфейс ITextSettings для компонента
  end;

Вы можете получить значение интерфейсной переменной Settings разными способами и в случае успеха она будет иметь отличное от nil значение. Что представляет собой Instance в данном случае не важно, главное, что полученный интерфейс содержит следующие свойства:

  • DefaultTextSettings: TTextSettings — умолчательные настройки текста. Для стилизованных контролов это значение устанавливается при загрузке стиля в методе ApplyStyle. Для не стилизованных это тоже самое что и TextSettings (в общем случае всё зависит от реализации конкретного класса, но для TText это так).
  • TextSettings: TTextSettings — настройки текста установленные вручную.
  • StyledSettings: TStyledSettings — это свойство указывает какие текстовые настройки берутся из стиля (см. DefaultTextSettings), а какие устанавливаются вручную (см. TextSettings). Вы можете использовать также две константы:
  • AllStyledSettings — используются все настройки из стиля
  • DefaultStyledSettings — используются некоторые настройки стиля. Это значение обычно задается по-умолчанию.

unit FMX.Types;
type
  TStyledSetting = (ssFamily, ssSize, ssStyle, ssFontColor, ssOther);
  TStyledSettings = set of TStyledSetting;
const
  AllStyledSettings: TStyledSettings = [TStyledSetting.ssFamily, TStyledSetting.ssSize,                                        TStyledSetting.ssStyle, TStyledSetting.ssFontColor,
                                        TStyledSetting.ssOther];
  DefaultStyledSettings: TStyledSettings = [TStyledSetting.ssFamily,
                                            TStyledSetting.ssSize,                                            TStyledSetting.ssFontColor];

 

Важно не забывать, что меняя, например, TextSettings.FontColor, фактическое изменение внешнего вида произойдет, если StyledSettings не содержит значения TStyledSetting.ssFontColor. Наследники TTextControl, такие как TLabel позволяют редактировать свойство StyledSettings в инспекторе объектов. При изменении цвета на значение отличное от умолчательного, свойство ssFontColor автоматически примет значение False. Но это происходит только в Design Time.



Вот часть кода, которая выполняется при изменении свойства влияющего на внешний вид текста:

FTextObject.QueryInterface(ITextSettings, LISettings);
LISettings.TextSettings.Assign(FDefaultTextSettings);
LISettings.TextSettings.AssignNoStyled(TextSettings, FStyledSettings);

Как можно видеть, для внутреннего текстового объекта FTextObject сначала присваиваются все умолчательные значения, затем некоторые значения установленные вручную, при этом учитывается свойство StyledSettings.

TTextSettings

Для настройки внешнего вида текста создан класс TTextSettings, унаследованный от TPersistent. Наследники TTextControl имеют свойство TextSettings в секции public. Т.е. если заранее известен тип компонента, то получать интерфейс не обязательно:

Label1.TextSettings.FontColor := MyColor;

Публичное свойство TLabel.FontColor, на самом деле "поднимает" аналогичное свойство от TextSettings.

Замечу, что не все контролы, в полной мере, поддерживают все свойства TTextSettings, например TButton не может правильно менять цвет текста (т.к. он меняется при наведении мыши), поэтому в секции published объявлены только поддерживаемые свойства, а TextSettings оставлено в public. Однако создавая своих наследников TTextControl вы можете поместить это свойство в секцию published и изменять его в инспекторе объектов.

Рассмотрим кратко что содержит данный класс

  • Equals — эта функция позволяет определить, различаются ли два экземпляра TTextSettings. Если значения всех свойств одинаковы, то возвращается True.
  • DoChanged — этот виртуальный метод вызывается в случае, если произошли какие-то изменения свойств. Вы можете перекрыть этот метод в наследниках и выполнять некоторые действия по обновлению внешнего вида компонента, анализируя свойства IsChanged и IsAdjustChanged. Но не следует вызывать этот метод непосредственно. Для принудительного обновления контрола используйтем метод Change.
  • Change — этот метод устанавливает свойство IsChanged в True, затем в случае, если экземпляр не находится в состоянии обновления вызывается метод DoChanged и сбрасываются свойства IsChanged и IsAdjustChanged.
  • BeginUpdate и EndUpdate — если вам необходимо изменить сразу несколько свойств, то не смысла после каждого изменения перерисовывать компонент. Чтобы этого избежать используйте такой, примерно, код:
TextSettings.BeginUpdate;
try
  TextSettings.FontColor := MyColor;
  TextSettings.Trimming := True;
  ...
finally
  TextSettings.EndUpdate;
end;
  • IsChanged — это свойство принимает значение True, если изменилось любое свойство
  • IsAdjustChanged — это свойство принимает значение True, если изменилось свойство, которое может повлиять на геометрические размеры текста. Например изменения цвета ни как не может повлиять на размер текста, а размер шрифта — может.
  • Assign — этот виртуальный метод присваивает значения всех свойств указанного в качестве параметра экземпляра. Единственный параметр Source должен быть либо экземпляром TTextSettings, либо nil. Если nil, то все свойства принимают умолчательные значения. В конструкторе вызывается Assign(nil), если в наследнике требуется изменить умолчательные значения, перекройте этот метод.
  • AssignNoStyled — этот метод аналогичен Assign, но присваивает только некоторые свойства с учетом параметра StyledSettings.
  • Trimming — если свойство отлично от ttNone и текст не помещается в область перерисовки, то он будет сокращен и в конец видимой части будет добавлено три точки.
  • HorzAlign, VertAlign — выравнивание текста по горизонтали и вертикали.
  • WordWrap — ели это свойство имеет значение True, то текст может автоматически разделяться на несколько строк.
  • FontColor — цвет выводимого текста.
  • Font — шрифт используемый при выводе текста.
  • OnChanged — событие которое происходит при изменении свойств.