Почему мой TScrollBox не показывает полосы прокрутки? - PullRequest
6 голосов
/ 27 января 2012

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

Вот ситуация.Мне нужно отобразить переменное количество кадров в части формы.Размер области, в которой отображаются эти кадры, можно изменить с помощью TSplitter или путем изменения размера формы.

Я динамически генерирую кадры на основе записей в базе данных при создании формы.Эти кадры связаны с FlowPanel, которая отвечает за размещение кадров.FlowPanel находится в ScrollBox.

Из-за FlowPanel, когда пользователь использует TSplitter или изменяет размеры формы, кадры могут перестраиваться.Если какой-либо из кадров переместится из вида формы, я ожидаю, что ScrollBox отобразит полосы прокрутки, чтобы пользователь мог прокрутить вниз до этих недоступных кадров.Такого не бывает.Те кадры, которые находятся в области панели потока за пределами размеров поля прокрутки, недоступны.

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

Неважно, выровнена ли панель потока по clClient (поле прокрутки) или закреплена по сторонам прокрутки, или ничего из этого.

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

Что здесь происходит?Я возился со многими различными свойствами прокрутки, но все еще не могу заставить его работать.В чем проблема, и есть ли решение?


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

Вот совок.У меня были ScrollBox и FlowPanel, настроенные так, как предлагал Эве, но я поиграл с рядом других настроек, потому что эта конфигурация не работала.Я почти уверен, что это произошло из-за сложности пользовательского интерфейса формы, который имеет много панелей в панелях, много разделителей, а сама форма заключена в TabSheet of PageControl (я опускал этот факт, так как тестировал форму как подставкуодна форма дала те же результаты).

То, что заставило ее работать, хотя и неуклюже, было предложением Эве выключить и снова включить AutoWrap FlowPanel.Я добавил следующий код в обработчик события OnResize объекта ScrollBox:

procedure TCurrentJobsForm.ScrollBox1Resize(Sender: TObject);
begin
  Flowpanel1.Autowrap := False;
  FlowPanel1.AutoWrap := True;
end;

При изменении размера наблюдается заметное мерцание, но я могу с этим смириться, поскольку он дает желаемый результат.Как только пользователь изменяет размеры формы, она всегда будет воссоздана с использованием этих измерений, поэтому изменение размера - это то, что пользователь будет делать редко.

Ответы [ 4 ]

8 голосов
/ 27 января 2012

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

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

На всякий случай: убедитесь, что свойство Visible вертикальной полосы прокрутки установлено в true.

2 голосов
/ 22 августа 2016

У меня была похожая проблема, и я решил ее, адаптировав код @ Mark.Учитывая, что у вас FlowPanel1 и ScrollBox1 на вашем Form1, вы можете попробовать:

  • Установите для свойства ScrollBox1 Align значение alClient;
  • Поместите FlowPanel1 в ScrollBox1;
  • Установите для свойства FlowPanel1 FlowStyle значение fsLeftRightTopBottom.

Теперь на OnResize событие Form1, просто сделайте:

procedure TForm1.FormShow(Sender: TObject);
var
  I: Integer;
  VButton: TButton;
begin
  for I := 1 to 10 do
  begin
    VButton := TButton.Create(FlowPanel1);
    VButton.Parent := FlowPanel1;
    VButton.Name := 'Button' + I.ToString;
    VButton.Height := 200;
    VButton.Width := 200;
  end;
end;

Смотрите результат на картинке ниже:

FlowPanel with scroll bars

НТН.

2 голосов
/ 10 ноября 2013

У меня нет Autosize true.
У меня есть панель потока на Scrollbox. Для выравнивания плоскости потока установлено значение leftRightTopBottom.

На мероприятии formresize я делаю это:

procedure TForm2.FormResize(Sender: TObject);
var
 i,h:integer;
begin
 h:=0;
 for i:=0 to FlowPanel1.ControlCount - 1 do
  h:=Max(FlowPanel1.Controls[i].BoundsRect.Bottom,h);
 ScrollBox1.VertScrollBar.Range:=h;
end;

Отлично работает.

0 голосов
/ 26 октября 2016

Все попытки заставить работать TScrollBox не увенчались успехом, но я был рад обнаружить, что удаление TFlowPanel с AutoSize и AutoWrap, установленными в true, и его выравнивание, установленное в alTop, в TPageScroller с Orientation = soVertical работали довольно хорошо. Последовала прокрутка.

Возможно, вы захотите встроить ButtonSize в pagecroller, чтобы он выделялся. 18 кажется правильным.

...