Гибкая компоновка форм в Delphi

Мы разработали программное обеспечение. В этом программном обеспечении мы показываем и скрываем несколько элементов управления на различных экранах ввода в зависимости от различных ситуаций.

Когда мы скрыли элемент управления, происходит то, что пространство, занимаемое этим элементом управления, остается таким, какое оно есть, и макет временами выглядит очень плохо, особенно. на экранах с большим количеством элементов управления. Нашему клиенту это не нравится, и он попросил нас что-то с этим сделать.

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

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

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


person Yogi Yang 007    schedule 23.11.2009    source источник


Ответы (5)


Я думаю, что ваш лучший вариант — использовать компонент, который обрабатывает макет ваших элементов управления vcl в вашей форме во время выполнения (в зависимости от определяемых вами условий). Я рекомендую вам попробовать Devexpress ExpressLayout Control

здесь вы можете найти два отличных демо-видео

alt text
(источник: devexpress.com)

Вы можете проверить эти функции.

Автоматическое управление. Группы управления и отдельные элементы управления автоматически управляются элементом управления макетом. Вы никогда не беспокоитесь о попиксельном позиционировании.

Автоматический размер формы. Форма может автоматически изменяться в соответствии с ее содержимым.

Пока.

person RRUZ    schedule 23.11.2009
comment
Позволит ли этот компонент нам иметь собственный макет экрана, будет ли он ограничивать нас в создании наших макетов? - person Yogi Yang 007; 23.11.2009
comment
После изучения деталей ExpressLayout кажется, что это своего рода интерфейс, позволяющий конечным пользователям настраивать макет в соответствии со своими потребностями. Это не то, что мне нужно. Конечные пользователи не смогут ничего изменить. Макет должен автоматически подстраиваться, когда какой-либо элемент управления скрыт или показан. - person Yogi Yang 007; 23.11.2009
comment
@Yogi Yang 007, этот компонент позволяет конечным пользователям настраивать макет, это правильно, но это не единственная особенность этого элемента управления и не причина, по которой я его рекомендую. - person RRUZ; 23.11.2009
comment
+1 за (новый) LayoutControl! Вы также можете управлять его поведением с помощью кода. Если вы скроете элемент управления, другие элементы управления заполнят пространство. Все наши формы всегда идеально выровнены с помощью этого элемента управления. - person Birger; 23.11.2009
comment
+1 за LayoutControl от DevExpress. Я не думаю, что есть что-то, что вы хотите сделать, что не может быть сделано. - person yozey; 24.11.2009

Теперь я не уверен, насколько сложный макет у вас есть, но я думаю, вы можете использовать для этого TFlowPanel и/или TGridPanel. Flowpanel имеет хорошую обработку компонентов, которые меняют видимость. Я не уверен, насколько хорошо gridpanel справляется с тем же...

person Vegar    schedule 23.11.2009
comment
Программное обеспечение для врачей. Он содержит множество элементов управления вводом, некоторые из экранов очень сложны, где элементы управления отображаются и скрываются в зависимости от различных вариантов выбора в верхней части экрана, а также прав пользователя. - person Yogi Yang 007; 23.11.2009
comment
Я бы выбрал панель потока. Попробуйте сгруппировать связанные компоненты в панели или фреймы и поместите эту панель в панель потока вместе с другими панелями. Теперь, когда вы скроете одну панель, другая панель будет использовать доступное пространство. GridPanel может быть ограничен для этого использования. - person Vegar; 23.11.2009
comment
Спасибо за подсказку. Я посмотрю на это. - person Yogi Yang 007; 25.11.2009

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

Я не знаю, так ли это просто: разместите элементы управления на панелях и используйте align alTop/alClient/alBottom. Когда вы скрываете панель, все остальные панели автоматически перемещаются вверх. Однако есть одна проблема: если вы хотите снова показать панель, порядок панелей иногда может быть нарушен... Это можно исправить, вручную установив свойство .Top, или «скрыть», установив .Height := 1;

person André    schedule 23.11.2009
comment
Это то, с чем Flowpanel справляется лучше, чем обычная панель с дочерними элементами, выровненными по верхнему краю. ;-) - person Vegar; 23.11.2009
comment
Да вы правы, а флоупанель это D2007+? Мы не знаем, какую версию Delphi он использует... - person André; 23.11.2009
comment
Мы используем Delphi 6 и 2006. Не обновлялись до других версий и не планируем делать это в ближайшем будущем. - person Yogi Yang 007; 23.11.2009

Что бы я сделал со сложным макетом, так это разделил бы его на несколько вкладок. Это имеет два преимущества. Это упрощает макет формы и позволяет отображать и скрывать целые вкладки в зависимости от выбора, сделанного на других вкладках.

person Steve    schedule 24.11.2009

Компоненты Raize имеют компонент пользовательского интерфейса TRzFlowPanel. Делает именно то, что вам нужно.

Используйте TRzFlowPanel, чтобы поместить пустую панель потока в форму. Основное различие между традиционной панелью и панелью потока заключается в способе размещения элементов управления. На традиционной панели вы размещаете элемент управления (например, кнопку) в определенном месте. Вы можете свободно перемещать этот элемент управления в любое место на панели с помощью мыши. На панели потока каждый элемент управления размещается в определенном месте, независимо от того, куда вы поместили его с помощью мыши. Автоматическое расположение управляется свойством FlowStyle. Например, при использовании свойства FlowStyle по умолчанию LeftRightTopBottom первый элемент управления, который вы добавляете на панель потока, привязывается к верхнему левому углу. Второй элемент управления, который вы добавляете, привязывается к первому элементу управления и так далее.

person Community    schedule 25.11.2009