Последняя версия DataExpress 26.9.23

Изображение Скачать | Изображение Что нового? | Демо

выравнивание по высоте

Все вопросы, связанные с работой в дизайнере.
kok80
Эксперт
Сообщения: 618
Зарегистрирован: 02 июл 2018, 21:45
Благодарил (а): 23 раза
Поблагодарили: 156 раз

выравнивание по высоте

Сообщение kok80 » 24 сен 2026, 17:50

Коллеги, а кто как реализует? Я может пропустил чего, но уже устал с зажатым контролом верх-вниз выравнивать.
Не лезть же вручную в редактор DB и в нем задавать вручную TOP у каждого компонента, предварительно рассчитанную.
Как вариант думаю, в run-time выравнивать

Аватара пользователя
k245
Интересующийся
Сообщения: 171
Зарегистрирован: 25 май 2019, 08:02
Откуда: Краснодар
Благодарил (а): 108 раз
Поблагодарили: 24 раза
Контактная информация:

выравнивание по высоте

Сообщение k245 » 24 сен 2026, 18:26

Выравнивание, позиционирование, изменение размера в рантайме - хорошая практика, особенно если цель - адаптивный интерфейс. Опыт в DE у меня небольшой, но для web-приложений такой подход - самое то: в обработчике события onResize переставлять визуальные компоненты в зависимости от размера экрана или текущей ориентации смартфона/планшета. Для десктопа тоже работает, но надо как-то учитывать разницу представлений интерфейса и определять, что сейчас работает: десктоп или веб-сервер.

К примеру, вот код, который ориентируется по классу и названию (суффиксу), где должен находиться элемент 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;             


img-2026-09-24-18-25-00.png
img-2026-09-24-18-25-00.png (22.97 КБ) 337 просмотров

Аватара пользователя
k245
Интересующийся
Сообщения: 171
Зарегистрирован: 25 май 2019, 08:02
Откуда: Краснодар
Благодарил (а): 108 раз
Поблагодарили: 24 раза
Контактная информация:

выравнивание по высоте

Сообщение k245 » 25 сен 2026, 08:57

Приведенный выше код использует константы:

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

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; 


Вернуться в «Дизайнер»