Перейти к содержанию
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;
    }
}
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...