Как заставить TForm показывать полосы прокрутки, когда BorderStyle=bsNone?

Когда для их BorderStyle установлено значение bsNone, TForms обычно не будут отображать полосы прокрутки, даже если AutoScroll имеет значение True, а позиции некоторых дочерних элементов управления превышают значения ClientWidth/ClientHeight.

Итак, есть ли какой-либо метод/хак, чтобы «заставить» TForm показывать полосы прокрутки (при необходимости), даже если для его BorderStyle установлено значение bsNone?


person Luthfi    schedule 27.06.2011    source источник


Ответы (1)


Поместите TScrollBox в форму, сделайте ее Align=Client, поместите все ваши элементы управления в поле прокрутки.

Я всегда использую TScrollBox, потому что он очень гибкий. Вы можете добавить в форму панель с выравниванием по верхнему краю (вне поля прокрутки), и у вас будет область без прокрутки. Полная прокрутка формы не всегда полезна и почти никогда не выглядит хорошо.

person Cosmin Prund    schedule 27.06.2011
comment
Еще лучше: вместо этого поместите ваши (дочерние) формы внутрь фреймов. Тогда ваша основная форма будет пустой формой с TScrollbox (выровненной с клиентом), а любая дочерняя форма будет загружена внутри полосы прокрутки. - person Wim ten Brink; 27.06.2011
comment
@ Вим, я не понимаю твоего совета. Кто говорит о дочерних формах? - person Cosmin Prund; 27.06.2011
comment
Даже в проекте с одной формой практично использовать фрейм для основной формы. Рамку можно поместить в полосу прокрутки, обычную форму или что-то еще, что вы предпочитаете. Это позволяет повторно использовать форму, поэтому фрейм может быть в какой-то момент внутри формы и где-то еще в полосе прокрутки как часть большего экрана. Таким образом, еще более гибко... - person Wim ten Brink; 27.06.2011
comment
@Cosmin: Спасибо, но на самом деле это мое текущее решение. Настоящая проблема заключается в том, что мне нужно переключаться между отображением TImage в полноэкранном режиме и в обычном режиме, и я хочу сэкономить немного ресурсов, избегая использования TScrollbars, поскольку содержащая форма уже может отображать полосы прокрутки. - person Luthfi; 27.06.2011
comment
@Вим, я все еще не понимаю. Я предполагаю, что форма main является наименее вероятным кандидатом для повторного использования, потому что у вас будет только один, поэтому замена всей формы фреймом, который затем встраивается в начальный форма не кажется практичной идеей. Я поддерживаю использование фреймов в целом, но просто не понимаю, какое отношение они имеют к этому вопросу. - person Cosmin Prund; 27.06.2011
comment
@Wim ten Brink: да, я хочу встроить дочернюю форму в другую форму, но иногда я хочу, чтобы эта дочерняя форма стала бесплатной (при отображении в полноэкранном режиме). Поэтому я думаю, что использование TFrame не нужно. - person Luthfi; 27.06.2011
comment
@DonnVall, сохраните существующее решение. Вы практически ничего не сэкономите, не включая ScrollBox в форму. Какой ресурс вы надеетесь сэкономить? - person Cosmin Prund; 27.06.2011
comment
@DonnVall, на самом деле, используя фреймы, вы можете использовать две формы: одну основную форму с границами и вторую форму без границ для полноэкранного просмотра. Затем вы можете перемещать рамку между формами. Обычная форма была бы нормальной, полноэкранная форма использует bsNone и имеет дополнительную полосу прокрутки. - person Wim ten Brink; 27.06.2011
comment
@Cosmin: Лол, конечно. С текущим решением проблем нет. Я просто ищу возможный способ избежать использования TScrollbar, который кажется избыточным. Это просто для оптимизации (поскольку текущее решение в порядке), я хочу сохранить только тот дескриптор окна, который требуется для TScrollBar, и, возможно, некоторые накладные расходы на рисование. Ничего критичного, просто чтобы посмотреть, смогу ли я легко избежать TScrollBar. - person Luthfi; 27.06.2011
comment
@Wim ten Brink: в обоих режимах (в полноэкранном и обычном) BorderStyle дочерней формы остается в bsNone. В обычном режиме он встроен в TTabSheet в основной форме. В полноэкранном режиме я просто позволяю ему быть свободным (я имею в виду, что он не привязан к какому-либо родителю, как в: Form1.Parent := nil;). Таким образом, я мог переключаться между обычным и полноэкранным режимом, просто устанавливая свойство Parent формы. - person Luthfi; 27.06.2011
comment
@DonnVall, если он не сломан, не чини его. Одна оконная ручка действительно того не стоит. - person Cosmin Prund; 27.06.2011
comment
В обычном режиме фрейм будет потомком TTabsheet. В полноэкранном режиме это дочерний элемент простой и новой формы без полей. На самом деле вы можете перемещать рамку из вкладки в полноэкранную форму и обратно, поэтому не нужно слишком много ручек. Вы бы просто переключили родителя с одной формы на другую... - person Wim ten Brink; 27.06.2011