Перейти к содержанию
  • 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

я параллельно слежу за двумя темами но в этой  не могу задать вопрос - Вы не могли бы переделать пример на билдер?

Поделиться сообщением


Ссылка на сообщение
  • 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;
    }
}

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От dnekrasov
      Механизм, который позволяет использовать иконку символьного шрифта вместо картинки на кнопках.
      Уж очень мне не нравится стандартный механизм добавления картинки на кнопку, поэтому, пару лет назад, начал искать альтернативу и остановился на символьных шрифтах (таких как FontAwesome). Вот что из этого получилось:

      IconicFontGlyph.zip 
      Под Windows работает без проблем - на других системах не пробовал.
      Как это работает
      Добавляем в проект модуль UIExt.IconicFont.pas Добавляем в проект модули описания шрифтов, которые будут использоваться (см. ниже) Описываем символ, который будет использоваться в качестве иконки (см. ниже) В обработчике  события OnApplyStyleLookup кнопки пишем одну строчку - TIconicFont.ApplyButtonStyle(TCustomButton(Sender)); Модули описания шрифтов
      UIExt.IconicFont.FA.pas -  Font Awesome UIExt.IconicFont.IM.pas - IcoMoon UIExt.IconicFont.IML.pas - IcoMoon Lindua UIExt.IconicFont.IMLN.pas - IcoMoon Linear UIExt.IconicFont.MDI.pas - Material Design Icons UIExt.IconicFont.WHHG.pas - WebHostingHub Glyphs Описание символа
      Для описания символа используется свойство StyleName (не знаю как остальные - лично я его нигде не использую). Само описание - это строка в определённом формате:
      [Короткое имя шрифта];[код символа];[размер шрифта];[цвет]
      2 первых поля - обязательны. Короткое имя шрифта можно увидеть в его модуле описания (TIconicFont.Short)
      Примеры можно увидеть на скриншотах выше (текст над кнопками).
      Ну и напоследок - небольшая демка IconicFontDemo.zip
    • От zekelive
      Добрый день, друзья. Подскажите, есть ли возможность в firemonkey открыть форму как представлено на картинке ниже? Если да, то подскажите в какую сторону копать. Спасибо.

    • От denprox
      Доброго времени суток! Подскажите, как узнать оригинальный размер картинки, загруженной в TImage ?
    • От rakhmet
      TListView, как внезапно выяснилось, напрочь игнорирует системный размер шрифта и в iOS, и в Android. Есть решение, как его можно заставить соответствовать системным настройкам, или же никто не грузит себя этой ерундой?
      Наверняка и многие другие компоненты не утруждают себя соответствием системным настройкам, но меня пока интересует только TListView.
    • От Кривяков Виталий
      Добрый день!
      Столкнулся с проблемой вывода текста разного размера по одной линии. Не получается использовать BaseLine доступную для Firemonkey. 
      Baseline -   воображаемая прямая линия, проходящая по нижнему краю прямых знаков без учёта свисаний и нижних выносных элементов. В строке символы текста стоят на базовой линии, а нижние выносные элементы текста «свисают» с неё.
      Из описанного выше ясно, что выводимые символы должны лежать на это линии, но в реале как то все некорректно выводится.
      Сделал два примера VCL (черный фонт) и FireMonkey(черный полупрозрачный фонт), оказалось, что вывод текста осуществляется по разному, при одном и том же значении размера шрифта. Базовая линия в обоих примерах 356.
      Совмещаем отображение символов: GlyphsEqual.png Символы совпали, но базовая линия смещена.
      Совмещаем базовую линию: PosEqual.png Базовая линия совпала, как и верхний край контролов, а вот текст (серый) значительно ниже.
      А теперь собственно вопрос вопрос, где ошибка? Как рассчитать базовую линию для FMX?
       
      P.S.
      Про attributes у TTextLayout знаю.


      BaseLine.rar

    • От Martifan
      Доброго времени сутки.
      Хочу в приложение использовать FontAwesome шрифт, но как в примере указана я все так делаю проект деплоится но когда собираюсь записывать телефоне то выдаёт ошибку.
      может кто нибудь знает в чем проблема?
      заранее благодарю
       

    • От Error
      *** Небольшой обмен опытом ***
      Вижу что вопросы о размере текста довольно частые, поделюсь своими наработками.
      function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF;
      Функция для расчета размера прямоугольника, занимаемого однострочным текстом.
      Параметры:
      Text - Текст Font - Шрифт с которым будет выводиться текст Size - если 0, то Font.Size будет использоваться из Font, иначе из данного параметра Исходный код:
      uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF; var TextLayout: TTextLayout; begin TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.Text := Text; TextLayout.MaxSize := TPointF.Create(9999, 9999); TextLayout.Font.Assign(Font); if not SameValue(0, Size) then begin TextLayout.Font.Size := Size; end; TextLayout.WordWrap := False; TextLayout.Trimming := TTextTrimming.None; TextLayout.HorizontalAlign := TTextAlign.Leading; TextLayout.VerticalAlign := TTextAlign.Leading; finally TextLayout.EndUpdate; end; Result.Width := TextLayout.Width; Result.Height := TextLayout.Height; finally TextLayout.Free; end; end;   function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer;
      Функция возвращающая максимально возможный размер шрифта, для текста вписанного в заданный прямоугольник.
      Параметры:
      Text - Текст Font - Шрифт с которым будет выводиться текст Width, Height - Ширина и высота прямоугольника MaxFontSize - Максимально возможный размер шрифта Исходный код:
      uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; const cMaxFontSize = 512; function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer; var Size, Max, Min, MaxIterations: Integer; Current: TSizeF; begin Max := Trunc(MaxFontSize); Min := 0; MaxIterations := 20; repeat Size := (Max + Min) div 2; Current := CalcTextSize(Text, Font, Size); if ((Abs(Width - Current.Width) < 1) and (Width >= Current.Width)) and ((Abs(Height - Current.Height) < 1) and (Height >= Current.Height)) then break else if (Width < Current.Width) or (Height < Current.Height) then Max := Size else Min := Size; Dec(MaxIterations); until MaxIterations = 0; Result := Size; end; ---
      Также данные функции можно найти в этом юните
    • От Axbor
      Как исправит такой косяк с отображением текста TText? Если видно, там остатки от текста отображаются. Платформа андроид, Rad Studio XE 10.

    • От Равиль Зарипов (ZuBy)
      Шаблон проекта с кастомным шрифтом FontAwesome
      Намного удобней и менее затратно использовать Шрифт с Иконками, чем заботиться о качестве картинок, скейлах, их хранении и загрузке
      Поэтому давно перешел на шрифты, пару скриншотов (без использования картинок)

      Seattle CustomFont.7z
      Berlin CustomFont(Berlin).zip
       
      WINDOWS/MACOS - установить шрифт в систему
      IOS - в деплой добавить шрифт и с помощью IOS9Fix прописать в .plist следующее:
      ANDROID - в деплой добавить шрифт (Remote Path -> assets\internal) и подключить к проекту измененные файлы FMX.FontGlyphs.Android.pas, FMX.FontGlyphs.pas
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...