Выравнивание компонентов на форме

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Выравнивание компонентов на форме

Сообщение alexs »

Вопрос к общественности
Кто как производит выравнивание компонентов на формах?
У меня достаточно часто возникает потребность расположить строк ввода и меток к ним вертикально.
С помощью штатных привязок можно сделать привязку каждой метки к своему полю ввода. Но хочется чтобы выравнивание происходило сразу для всех элементов. Так как я не знаю какая метка будет самая широкая - очень сложно определить - где будут границы.
У меня сейчас возникает идея сделать дополнительный визуальный элемент (что-то вроде контейнера), в котором будут прописаны метки и он будет определять свою ширину в зависимости от максимальной ширины меток. Сам он будет не видимым.

Может есть что проще? И мне не стоит изобретать велосипед.
PS
Хочется именно визуальный метод - кодить такую мелочь каждый раз не вариант.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение mse »

Just as a hint for a possible other approach: in MSEgui captions of widgets are part of the frame property. If tcaptionframe.options cfo_captiondistouter is set, "captiondist" defines the distance of the start of the caption to the widget frame.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Что бы под длину самого длинного лабеля, сложи все лабели на тпанель, им и ей включи авторесайз... тут возникает другая проблема как сопоставить метку и поле ввода(чтоб скажем поле не оказалась напротив не своей метки или между ними).

Я в случаях когда самый длинный лабель не прогнозируется отказываюсь от эстетики и привязываю каждое поле к своему лабелю.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

mse
Это не то что мне надо. Мне надо выровнять все поля ввода относительно самой широкой метки.
Есть 4 поля и 4 метки. Ширина меток разная. Надо поля расположить ровно относительно самой широкой метки.
qivi
Я тоже над этим думал. И пришёл к этому же заключению.
Но хочется чтобы было красиво.

Ладно. Всем откликнувшимся - спасибо. Что либо придумаю. Если будет удачно - включу в RxFPC.
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение mse »

If the labels are elements of the widgets they need not to be aligned. Simply set "captiondist" of the widgets to the same value.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

mse
Мне кажется - ты меня не понял (или я не понял ответа).
Мне надо одинаково выравнять 4 разных Edit-a относительно 4-х разных меток по максимальной ширине меток
т.е. алгоритм такой должен быть:

Код: Выделить всё

  L:=Max(Label1.Width, Label2.Width, Label3.Width, Label4.Width);
  Edit1.Left:=L;
  Edit2.Left:=L;
  Edit3.Left:=L;
  Edit4.Left:=L;
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

alexs писал(а):У меня сейчас возникает идея сделать дополнительный визуальный элемент (что-то вроде контейнера), в котором будут прописаны метки и он будет определять свою ширину в зависимости от максимальной ширины меток. Сам он будет не видимым.

Если Edit будет привязываться к правому краю этого элемента, то думаю, что это неплохой вариант.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Предлагаю свой велосипед:
KMK.7z


Представляет собой визуальный контрол, наследника TWinControl, который будет находиться между контролами длина которых перемена и контролами которым нужно подстроится под самый длинный (из первой группы).

Свойство: AnchorKind - определяет которой стороной контрол будет "липнуть" к самой длинной метке. Далее в Items создаём список контролов длина которых перемена, так же у каждого итема есть свойство AnchorMount - определяет какую сторону контрола (ближнюю или дальнюю относительно AnchorKind) рассматривать для "прилипания". Ну и на последок контролы которые будут выравниваться по самому длинному из списка, привязываем к разделителю.
Вроде всё.

Ах да, там ещё маленькая демочка. Компилировать её нет смысла она наглядно работает в дизайнере форм.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
iN0k
постоялец
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Сообщение iN0k »

Вот согласен
alexs писал(а):Хочется именно визуальный метод - кодить такую мелочь каждый раз не вариант.


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

думал на счет кодоГенерации ... но пока показать нечего :-(
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Но против доп компонент (контейнеров и т.д.). каждый контрол это память


Ну тут уж каждый решает сам. Мне то же как и топикстартеру доставляла неудобства данная проблема, я её решил как смог.
Onyma
незнакомец
Сообщения: 1
Зарегистрирован: 17.05.2017 16:52:36

Сообщение Onyma »

Тема актуальна и будет актуальна еще долго... По этому вот ещё, более стандартное решение:
пкм на компоненте выбираем редактор привязок. там легко разобраться. Основывается это на свойстве визуальных компонентов AnchorSideLeft, AnchorSideTop и т.д.
Ответить