Как показать прокрутки в Tscrollbox после того, как он был сделан видимым снова?

StackOverflow https://stackoverflow.com/questions/2662974

  •  27-09-2019
  •  | 
  •  

Вопрос

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

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

Есть какие нибудь идеи как это починить?

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

Спасибо

РЕДАКТИРОВАТЬ:

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 Создает панель с несколькими трекбарами, изображениями и изменениями.

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

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

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

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

Так что дать пример. Скажем, 1 панель имеет высоту 200px.
Высота прокрутки 300px.

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top