-
Похожий контент
-
- 1 ответ
- 1 024 просмотра
-
- 4 ответа
- 2 399 просмотров
-
- 3 ответа
- 1 760 просмотров
-
- 3 ответа
- 2 466 просмотров
-
- 2 ответа
- 1 269 просмотров
-
- 2 ответа
- 1 340 просмотров
-
- 3 ответа
- 1 737 просмотров
-
- 5 ответов
- 1 669 просмотров
-
- 0 ответов
- 2 347 просмотров
-
- 1 ответ
- 2 297 просмотров
-
-
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
Вопрос
AngryOwl
Привет друзья!
Возникла странная ситуация при работе с TListBox. А именно - при попытке прокрутки списка в его конец.
Условно:
- есть список итемов (сообщения чата);
- загрузка сообщений происходит в процедуре "синхронизированной" с главным потоком и заключена в TListBox(listbox1).BeginUpdate и TListBox(listbox1).EndUpdate;
- все замечательно грузится
НО! После загрузки Итемов требуется прокрутить список в его конец. И вот тут начинаются "приколы".
Как только не пытаться прокрутить список в его конец (разные способы, см.ниже) - всегда получается, что список прокручивается до конца, но немного "откатывается" вверх. Размер его автоматического скролла "обратно" зависит от количества Item в TListBox! Чем больше кол-во Item - тем больше назад откатывается скролл.
Способы прокрутки в конец списка - значения не имеют. Всегда одно и то же.
procedure TChatListBoxEx.ScrollToLast; var Item: TListBoxItem; begin // ВАРИАНТ 1 Item := ListItems[Items.Count - 1]; if Assigned(Item) then ScrollToItem(Item); // ВАРИАНТ 2 ViewportPosition:= TPointF.Create(0, Item.ParentedRect.Top); // ВАРИАНТ 3 ScrollBy(0, ViewportPosition.Y - Item.ParentedRect.Top); // ВАРИАНТ 4 BeginUpdate; try ItemIndex := Items.Count - 1; finally EndUpdate; end; end;
Предупреждая ваши вопросы, сразу скажу - пробовал и другие варианты, просто перечислять не стал все. Пробовал и эмитировать нажатие клавиши END при "активном" списке.
Все синхронизируется, типа
TThread.Synchronize(nil, listbox1.ScrollToLast);
Эффект всегда один и тот же...
НО! Если загрузить список, независимо от кол-ва элементов списка, а потом в программе вызвать ScrollToLast, подождав некоторое время, а не сразу, например по нажатию на какую-нибудь кнопку, то список прокрутится в конец НОРМАЛЬНО!
Будьте добры - кто сталкивался с подобной ситуацией, или кто что-то может посоветовать?
Или наши Гуру смогут ответить на этот вопрос?
Видео, чтобы было понятнее что происходит, прилагаю.
RAD Studio 10.1 Berlin (эффект наблюдается на всех версиях Windows - XP, Vista, 7, 8, 10. На других ОС пока не пробовал...)
Заранее благодарен!
P.S. Возник вопрос (как вариант решения проблемы) - как узнать, что произошло событие окончания отрисовки TListBox? А именно - список заполнился, выполнилась отрисовка и можно прокручивать.
Изменено пользователем AlexGСсылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.