Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как массово задать размер шрифта у всех контролов?


antarey

Вопрос

Подскажите как программно поменять шрифт на всех котролах формы и его размер

Желательно в реализации с++

На ВСЛ в принципе было достаточно поменять размер шрифта формы, а в обезьяне пока не знаю как.

Через стили не желательно, но как вариант для развития тоже подойдет.

спасибо

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Добрый день,

 

В RAD Studio XE5 для поддержки возможности массово менять настройки текста для любых контролов был введен специальный интерфейс ITextSettings. Каждый контрол, который поддерживает настройку параметров текста, реализует этот интерфейс. Поэтому, чтобы массово поменять настройки текста можно использовать, например, следующий код (Delphi, он легко переводится на C++). Этот код Для всех наследников, которые не используют размер шрифта из стиля, задает размер шрифта:

var
  Settings: ITextSettings;
  Instance: TComponent;
  I: Integer;
begin
  for I := 0 to ChildrenCount - 1 do
  begin
    Instance := Children[I];
    if IInterface(Instance).QueryInterface(ITextSettings, Settings) = S_OK then
    begin
      // using ITextSettings methods and properties:
      //   TextSettings: TTextSettings,
      //   DefaultTextSettings,
      //   StyledSettings
      // to change properties of text objects
      Settings.TextSettings.BeginUpdate;
      try
        Settings.TextSettings.Font.Size := 18;
        if TStyledSetting.ssSize in Settings.StyledSettings then
          Settings.StyledSettings := Settings.StyledSettings - [TStyledSetting.ssSize]
            // show Font.Size := 18  
        else
          Settings.StyledSettings := Settings.StyledSettings + [TStyledSetting.ssSize];
            // restore showing Font.Size loaded from a style  
      finally
        Settings.TextSettings.EndUpdate;
      end;
    end;
  end;
end;
Ссылка на комментарий
  • 0

по коду есть пара вопросов

Instance := Button1;

это от балды любой контрол?

 

Судя по коду ищутся дочерние объекты только чьи? Button1 или формы? или это просто инициализация переменной?
Ссылка на комментарий
  • 0
  • Администраторы

Код подправил. Строчка с 

Instance := Button1;

лишняя. 

 

Да, по коду ищутся дочерние контролы. В коде не видно, но это дочерние узлы формы. В вашем случае нужно код исправить на рекурсию, чтобы пробежаться не только по контролам первого уровня, но и по всем узлам дерева контролов до листьев.

Ссылка на комментарий
  • 0
  • Администраторы

Чтобы код упростить и не писать свою рекурсию. Можете использовать метод TControl.EnumControls. Он позволяет пробежаться по всем узлам дерева и выполнить код для каждого контрола.

Ссылка на комментарий
  • 0

Вот код на билдере - но одна проблема - не меняет шрифт на мемо - подскажите что не так

for(int i = 0; i < ComponentCount; i++)
{
    if (TTextControl *txt=dynamic_cast<TTextControl*>(Components[i]))
    {
        txt->Font->Size=22;
        txt->StyledSettings=txt->StyledSettings>>TStyledSetting::ssSize;
    }
    if (TText *txt1=dynamic_cast<TText*>(Components[i]))
    {
        txt1->Font->Size=22;
        txt1->StyledSettings=txt1->StyledSettings>>TStyledSetting::ssSize;
    }
}
Ссылка на комментарий
  • 0

Блин, как все просто

 

for(int i = 0; i < ComponentCount; i++)
{
    _di_ITextSettings Settings;
    if(Components[i]->GetInterface(Settings))
    {
        Settings->TextSettings->Font->Size = 18;
        Settings->StyledSettings=Settings->StyledSettings>>TStyledSetting::ssSize;
    }
}
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...