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

Пробежать по компонентам на Layout


Rusland

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

На Layout-е лежат кнопки TButton и один TComboEdit (у всех Align Left или Right).

Когда экран устройства слишком маленький или если перевернуть устройство в портретный режим, то все в Layout не помещается и начинает накладываться друг на друга. Хочу задавать ширину компонент в зависимости от ширины лейаута. Как это сделать?

Пытаюсь делать так:

BtnsWidth:integer;  //суммарная ширина всех кнопок на лейауте
BtnsCnt:integer;   // количество кнопок

  if BtnsWidth>Layout1.Width then
  begin
    BtnsWidth:=Round(Layout1.Width/BtnsCnt); // присваиваю средний размер кнопок
    for i:=0 to Layout1.ComponentCount-1 do
    begin
      if (Layout1.Components[i] is TButton) or
         (Layout1.Components[i] is TComboEdit) then
        if (TControl(Layout1.Components[i]).Visible) then
              TControl(Layout1.Components[i]).Width:=BtnsWidth;
    end;
  end;

Так вот Layout1.ComponentCount равен 0, хотя на нем расположены кнопки и ComboEdit.

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

Переделал

Если сделать вот так, то работает:

    BtnsWidth:=Round(Layout1.Width/BtnsCnt);
    
    for i:=0 to ComponentCount-1 do
    begin
      if (Components[i] is TButton) or
         (Components[i] is TComboEdit) then
        if (TControl(Components[i]).Visible) and
            ((TControl(Components[i]).ParentControl as TLayout)=Layout1) then
              TControl(Components[i]).Width:=BtnsWidth;
    end;

PS. Все-таки не понимаю почему родителем кнопок является не Layout, а форма.

Ссылка на комментарий
27 минут назад, Rusland сказал:

PS. Все-таки не понимаю почему родителем кнопок является не Layout, а форма.

Родителем (Parent) является Layout. А Owner у Ваших контролов - форма. ComponentCount считается для Owner.
Создавая кнопки в runtime можете задать:

aButton := TButton.Create(Layout1);
Layout1.Add(aButton);

и тогда Layout1.ComponentCount уже не будет равно 0.

Для перебора в Parent используйте ChildrenCount
 

  for i:=0 to Layout1.ChildrenCount-1 do
  begin
    if (Layout1.Children[i] is TButton) or
       (Layout1.Children[i] is TLabel) then
      if (TControl(Layout1.Children[i]).Visible) then
              TControl(Layout1.Children[i]).Width:=50;
    end;

 

Изменено пользователем enatechno
Ссылка на комментарий

Накидал компоненты на форму как тебе нравится и задал всем это свойство.

При изменении размеров формы всё пропорционально масштабируется.

Ссылка на комментарий
16 часов назад, POV сказал:

Накидал компоненты на форму как тебе нравится и задал всем это свойство.

При изменении размеров формы всё пропорционально масштабируется.

Align = Scale - удачный выбор, в oldschool Delphi и CBuilder такого не было, в Anchors выставляли руками масштабирование.

Кстати, если кнопки надо изменять только в ширину, то это в Anchors

Изменено пользователем Камышев Александр
Ссылка на комментарий

Попробовал с Align=Scale - работает! Расставил в тестовом проекте  компоненты как нравится, размеры меняются автоматически и никого кода писать не надо.

Хотя в моем случае некоторые кнопки то видны, то нет (меняю свойство Visible). Не знаю как будет в этом случае.

Изменено пользователем Rusland
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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