Как показать полосы прокрутки в TScrollBox после того, как он снова стал видимым? - PullRequest
3 голосов
/ 18 апреля 2010

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

Я спрятал коробку прокрутки и сгенерировал все элементы управления на ней, что заняло гораздо меньше времени и не мерцало и не было одинаковым. Но вот проблема. Когда я снова показываю поле прокрутки, его полоса прокрутки не появляется, пока я фактически не изменю размер формы. (Выравнивание прокрутки: alClient)

Есть идеи как это исправить?

Пробовал перекрасить, но это не сработало. Обновить тоже не получилось.

Спасибо

EDIT:

TScrollBox(Form1.FindComponent('termai')).Visible:= false;
for I := 0 to mazgas.GrafasPagalVarda(sActiveGrafas).Termai.Count - 1 do
begin
    fNaujasTermas(i,oHook);
end;
TScrollBox(Form1.FindComponent('termai')).Visible := true;

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

Я не уверен насчет того, какое может быть пошаговое объяснение. Просто создайте процедуру, в которой она сгенерирует панель с множеством элементов управления, и установите ScrollBox в качестве родительского элемента. Скройте прокрутку, прежде чем что-либо генерировать, и раскройте ее после того, как все сделано.
О, кстати, панель выровнена alTop. Поэтому каждый раз, когда новая панель создается и помещается в поле прокрутки, она будет отображаться вверху, а все остальные панели будут перемещаться вниз.

Вот так я и создал саму прокрутку

pTermai := TScrollBox.Create(Self);
pTermai.Parent := pLeft;
pTermai.Align := alClient;
pTermai.Name := 'termai';
pTermai.BorderStyle := bsNone;
pTermai.VertScrollBar.Increment := 40;

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

Итак, приведем пример. Допустим, 1 панель имеет высоту 200 пикселей.
Высота ScrollBox составляет 300 пикселей.

Таким образом, после создания 2 панелей высотой до 400 пикселей поле прокрутки не отображает полосы прокрутки, даже если половина второй панели не видна. Если я добавлю еще одну панель = 600 пикселей в целом, на полосе прокрутки будет показана полоса прокрутки, которая выглядит так, как будто она прокручивается только на 2 панели, а не на 3. При попытке прокрутки такого окна значения пересчитываются, и все хорошо отображается.

Итак, основная проблема в том, как сделать так, чтобы полоса прокрутки показывала полосу прокрутки "вовремя", чтобы панели не были обрезаны наполовину?

Ответы [ 2 ]

5 голосов
/ 20 апреля 2010

Вы можете запросить блок прокрутки для пересчета его свойств полосы прокрутки, вызвав метод Realign(), который он наследует от TWinControl. Чтобы свести к минимуму мерцание, вы должны сделать это, пока оно еще невидимо, например:

ScrollBox.Visible := False;
try
  // create your new panel ...
finally
  ScrollBox.Realign;
  ScrollBox.Visible := True;
end;
0 голосов
/ 18 апреля 2010

Как я сказал в комментариях, я не могу воспроизвести проблему. Было бы полезно, если бы вы дали пошаговые инструкции о том, как воспроизвести проблему.

Но если вы скажете, что проблема исчезнет, ​​если вы измените размер формы, почему бы просто не изменить размер формы? Возможно, вы можете попытаться изменить его размер на 0 пикселей, используя SetWindowPos. Вы также можете попробовать ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);.

...