Страница 1 из 1

Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 02.02.2019 16:02:11
olegy123
Есть ли документация по этому вопросу?
Подход по размещению объектов в пространстве, изменения размеров и т.п.
В Lazarus-е есть Docking, но не хотелось его разбирать "до винтиков", слишком много кода.
Мне нужен просто алгоритм.

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 02.02.2019 16:32:19
Лекс Айрин
Можно вычислять ручками размер, есть компоненты разделяющие окно на две части, есть привязки... А что именно нужно?

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 02.02.2019 20:49:50
olegy123
допустим в таком формате
linearlayout10.png
linearlayout10.png (1.99 КБ) Просмотров: 22244


Добавлено спустя 2 минуты 49 секунд:
пока я сделал alClient для одного элемента, но когда их больше одного тогда нужно как то все это согласовывать, при этом у каждого может быть MinSize/MaxSize, кто то крепится слева, кто то только сверху.. а кто то должен быть снизу
как их всех растутовать?

Добавлено спустя 6 минут 4 секунды:
в гугле восновном выходят ссылки на css да на android приложение. Как правило у них есть уже вшитый контролер.
А на логику работы его я нигде описание не видел. Да не хотелось бы иметь аналог Layout, как дополнительную прослойку.
Хотелось бы иметь родной свободный delphi/win alLeft/alRight/alTop/alButton/alClient..

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 02.02.2019 21:29:34
Лекс Айрин
olegy123, тут, если верхний компонент изменяется по вертикали можно воспользоваться сплитером (если нет, то задать размер ручками без сплитера) и привязать к сторонам. Нижние компоненты просто размещать вручную высчитывая проценты или тупо деля на три. Можно, при желании, сделать и что-то типа линий привязки. Это если честно, не особо сложно, но геморойно в том плане, что надо четко представлять где можно обойтись привязкой, а где надо обязательно высчитывать размеры вручную.
Допустим, наиболее простым для нижнего ряда будет высчитать размер среднего компонента и выровнять его по горизонтали по центру, а уже относительно него выравнивать остальные два компонента, привязывая к соседним компонентам и краям.
Если ты хочешь создать автоматическую перекомпоновку, то придется использовать линии (точки) привязки.

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 02.02.2019 22:14:59
pupsik

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 03.02.2019 00:03:02
Лекс Айрин
pupsik, ну да, именно это. Плюс немного воображения.
Кстати, я использую только alNone и alClient. Остальные могут в любой момент перекосить компоновку и годятся лишь для самых простых размеров. Но ничего не мешает создать свое множество директив компоновки типа mdLeftTop, mdRightCentered и тому подобное. Конечно, названых по своему.

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 03.02.2019 06:53:49
olegy123
pupsik писал(а):это?

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

Этот вопрос, я думаю, разбирали в 90х, возможно есть описание логики. Сейчас мы используем не задумываясь как оно работает.

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 03.02.2019 08:48:36
Лекс Айрин
olegy123, вообще-то, судя по практике, работает не очень((( А алгоритм в принципе реверсировать из поведения не так уж и сложно.

Re: Выравнивание элементов в контейнере. Алгоритм.

СообщениеДобавлено: 03.02.2019 11:13:37
olegy123
Нашел пока это
Про двумерную упаковку: offline алгоритмы

решил пока частное решение: заполнение и выравнивание только по вертикали или только по горизонтали.

Так:
p1.png
p1.png (11.42 КБ) Просмотров: 22164


Добавлено спустя 13 минут 25 секунд:
еще нужно решить вопрос о изменении размера контейнера(если допускается) при разных размерах входящие в контейнер элементах

p2.png
p2.png (5.96 КБ) Просмотров: 22164