2010-04-18 2 views
2

Я столкнулся с одной небольшой проблемой. Я динамически генерирую некоторые элементы управления и размещаю их на компоненте TScrollbox. Но я заметил, что если видимость прокрутки видима, пользователь может четко видеть, как каждый из создаваемых и размещаемых элементов управления. Таким образом, похоже, что большая часть работы выполняется, и она медленная.Как показать полосы прокрутки в 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; 

Код выше показывает, как я скрыть и показать scrollbox.
fNaujasTermas создает панель с несколькими трекболами, изображениями и изменениями.

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

Это, как я создал scrollbox сам

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 пикселей, scrollbox покажет полосу прокрутки, которая выглядит так, как будто она будет прокручиваться только на 2 панели, а не 3. При попытке прокрутки такого окна значения пересчитываются, и все отображается хорошо.

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

+0

Я не могу воспроизвести проблему в D2009. –

ответ

4

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

ScrollBox.Visible := False; 
try 
    // create your new panel ... 
finally 
    ScrollBox.Realign; 
    ScrollBox.Visible := True; 
end; 
0

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

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