Коллеги, а кто как реализует? Я может пропустил чего, но уже устал с зажатым контролом верх-вниз выравнивать.
Не лезть же вручную в редактор DB и в нем задавать вручную TOP у каждого компонента, предварительно рассчитанную.
Как вариант думаю, в run-time выравнивать
выравнивание по высоте
- k245
- Интересующийся
- Сообщения: 171
- Зарегистрирован: 25 май 2019, 08:02
- Откуда: Краснодар
- Благодарил (а): 108 раз
- Поблагодарили: 24 раза
- Контактная информация:
выравнивание по высоте
Выравнивание, позиционирование, изменение размера в рантайме - хорошая практика, особенно если цель - адаптивный интерфейс. Опыт в DE у меня небольшой, но для web-приложений такой подход - самое то: в обработчике события onResize переставлять визуальные компоненты в зависимости от размера экрана или текущей ориентации смартфона/планшета. Для десктопа тоже работает, но надо как-то учитывать разницу представлений интерфейса и определять, что сейчас работает: десктоп или веб-сервер.
К примеру, вот код, который ориентируется по классу и названию (суффиксу), где должен находиться элемент UI.
К примеру, вот код, который ориентируется по классу и названию (суффиксу), где должен находиться элемент UI.
Код: Выделить всё
procedure AlignComponents( Sender:TObject );
// выравнивание компонентов в зависимости от ширины экрана
// применяется для веб-сервера
var
i: integer;
c: TComponent;
lineNum: integer;
col: integer;
row: integer;
aForm: TdxForm;
maxCol: integer;
begin
aForm := TdxForm(Sender);
maxCol := (aForm.width - MARG) div (MARG+LAB_WIDTH+FIELD_WIDTH);
if maxCol = 0 then // если экран узкий, то делаем в одну колонку
maxCol := 1;
for i:=0 to aForm.ComponentCount-1 do
begin
c := aForm.Components[i];
if TryStrToInt(GetSuffix(c.Name),lineNum) then
begin
// номер строки и колонки зависит от ширины экрана
col := lineNum mod maxCol;
row := lineNum div maxCol;
if c is TdxLabel then with TdxLabel(c) do
begin
top := row * (LINE_HEIGHT+MARG) + ((LINE_HEIGHT - Height) div 2);
// выровнять по правому краю
left := col*(MARG+LAB_WIDTH+FIELD_WIDTH) + LAB_WIDTH -width - MARG ;
end;
if c is TdxButton then with TdxButton(c) do
begin
top := 0;
left := lineNum*(MARG+BUT_WIDTH);
width := BUT_WIDTH;
height := LINE_HEIGHT;
end;
if c is TdxPanel then with TdxPanel(c) do
begin
top := row * (LINE_HEIGHT+MARG);
left := MARG + col*(MARG+LAB_WIDTH+FIELD_WIDTH);
if col = maxCol - 1 then
width := aForm.Width - MARG - Left - LINE_HEIGHT
else
width := FIELD_WIDTH + LAB_WIDTH;
height := LINE_HEIGHT;
end;
if c is TdxQueryGrid then with TdxQueryGrid(c) do
begin
// таблица всегда начинается с нулевой колонки
if col <> 0 then
row := row + 1;
top := row * (LINE_HEIGHT+MARG);
left := 0;
width := aForm.Width;
height := aForm.height - top;
end;
if c is TdxGrid then with TdxGrid(c) do
begin
// таблица всегда начинается с нулевой колонки
if col <> 0 then
row := row + 1;
top := row * (LINE_HEIGHT+MARG);
left := 0;
width := aForm.Width;
height := aForm.height - top;
end;
if c is TdxPageControl then with TdxPageControl(c) do
begin
// всегда начинается с нулевой колонки
if col <> 0 then
row := row + 1;
top := row * (LINE_HEIGHT+MARG);
left := 0;
width := aForm.Width;
height := aForm.height - top;
end;
if c is TdxLookupComboBox then with TdxLookupComboBox(c) do
begin
top := row * (LINE_HEIGHT+MARG);
left := MARG + LAB_WIDTH + col*(MARG+LAB_WIDTH+FIELD_WIDTH);
if col = maxCol - 1 then
width := aForm.Width - MARG - Left - LINE_HEIGHT
else
width := FIELD_WIDTH - LINE_HEIGHT;
height := LINE_HEIGHT;
end;
if c is TdxDateEdit then with TdxDateEdit(c) do
begin
top := row * (LINE_HEIGHT+MARG);
left := MARG + LAB_WIDTH + col*(MARG+LAB_WIDTH+FIELD_WIDTH);
if col = maxCol - 1 then
width := aForm.Width - MARG - Left - LINE_HEIGHT
else
width := FIELD_WIDTH - LINE_HEIGHT;
height := LINE_HEIGHT;
end;
if c is TdxEdit then with TdxEdit(c) do
begin
top := row * (LINE_HEIGHT+MARG);
left := MARG + LAB_WIDTH + col*(MARG+LAB_WIDTH+FIELD_WIDTH);
if col = maxCol - 1 then
width := aForm.Width - MARG - Left
else
width := FIELD_WIDTH;
height := LINE_HEIGHT;
end;
if c is TdxCheckBox then with TdxCheckBox(c) do
begin
top := row * (LINE_HEIGHT+MARG);
left := MARG + LAB_WIDTH + col*(MARG+LAB_WIDTH+FIELD_WIDTH);
if col = maxCol - 1 then
width := aForm.Width - MARG - Left
else
width := FIELD_WIDTH;
height := LINE_HEIGHT;
end;
end;
end;
end; - k245
- Интересующийся
- Сообщения: 171
- Зарегистрирован: 25 май 2019, 08:02
- Откуда: Краснодар
- Благодарил (а): 108 раз
- Поблагодарили: 24 раза
- Контактная информация:
выравнивание по высоте
Приведенный выше код использует константы:
Пример использования (веб-модули формы), WebExt - Модуль пользователя:
Код: Выделить всё
const
MARG = 3; // отступ
LAB_WIDTH = 80; // ширина подписи
BUT_WIDTH = 40;
FIELD_WIDTH = 220; // минимальная ширина поля
LINE_HEIGHT = 29; // высота строки Пример использования (веб-модули формы), WebExt - Модуль пользователя:
Код: Выделить всё
{$I WebExt}
procedure Form_Create;
begin
self.OnResize :=@ AlignComponents;
end;