Как не допустить, чтобы два элемента выравнивания по нижнему элементу управления поменялись местами?

У меня есть форма с тремя основными компонентами:

  1. FlowPanel, для которой установлено значение Align to Client.
  2. Вторая FlowPanel настроена на выравнивание по низу
  3. StatusBar, установленный для выравнивания по низу.

Все начинает выглядеть великолепно. Но FlowPanel, которая выровнена по низу, также установлена ​​на AutoSize. Он содержит панель, которая может сама развалиться. Внутренняя панель содержит сводную информацию, которую пользователь может решить скрыть. Это уменьшает размер FlowPanel до очень маленького размера, но не полностью исчезает. Еще есть кнопка, где пользователь может снова развернуть панель сводки.

Проблема возникает, когда панель расширяется, что приводит к росту FlowPanel. В это время порядок строки состояния и FlowPanel меняется на противоположный. Они оба по-прежнему настроены для выравнивания дна, но теперь строка состояния находится над моей FlowPanel.

Я могу продублировать это в тестовом приложении без панели Collapsing, просто нажав кнопку на форме, чтобы увидеть высоту нижней панели потока. Если высота увеличивается, порядок меняется. Если оно уменьшается, то все остается в том же порядке. Единственный код в моей тестовой форме:

FlowPanel2.Height := FlowPanel2.Height * 2;

Я также проверил это с нижней панелью, представляющей собой обычный TPanel вместо FlowPanel с теми же результатами.

Любые идеи о том, почему это происходит и как это предотвратить?

Перемещение строки состояния изображения

3 ответа

Решение

Мое решение:

  1. Поместите строку состояния в форму и выровняйте по основанию
  2. Поместите Panel (Container_Panel) в форму и выровняйте по клиенту
  3. Поместите FlowPanel на Container_Panel и выровняйте по низу
  4. Поместите FlowPanel на Container_Panel и выровняйте по клиенту

Теперь у вас не должно быть проблем с этим больше

У меня иногда это тоже есть. Мое решение состоит в том, чтобы установить для верхней части элемента управления, который должен быть в нижней части, "достаточно большое" значение - что-то вроде OtherControl.Top + OtherControl.Height + 1 должен работать или даже MaxInt IIRC.

Если вы готовы потратить немного денег, я бы порекомендовал использовать ExpExpressLayoutControl DevExpress (или что-то подобное). Это отличный инструмент как для простых, так и для сложных форм, и в дополнение к решению таких проблем, как проблема, с которой вы столкнулись, он предлагает множество других преимуществ.

Другие вопросы по тегам