Перейти к содержанию
Fire Monkey от А до Я
  • 0

Установка ScrollViewPos после добавления ListViewItem


Евгений Корепов

Вопрос

Задача в следующем: Динамически заполняю ListView, после заполнения нужно установить ListView.ScrollViewPos в произвольную позицию. Но не выходит по причине того, что в процедуре TCustomListView.SetScrollViewPos(const Value: Single) функция GetMaxScrollViewPos всегда в таком случае возвращает ноль.

 

Подозреваю что после добавления итемов нужно как то передёрнуть ListView, но не знаю как. Пробовал ApplyStyleLookup, Repaint, Resize, RecalcSize - не помогает.

 

Отрисованный и видимый в приложении ListView прекрасно позиционируется с помощью ScrollViewPos. А GetMaxScrollViewPos выдает реальную длину списка.

 

Ткните меня в правильную процедуру.

 

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

ScrollTo и задаешь номер итема. если в конец то Лист.ScrollTo(Лист.ItemsCount-1)

Не подходит. ScrollTo позиционирует Item по нижней границе ListView. Трудно придумать применение этой функции с точки зрения дизайна приложения. Логично позиционировать по верху. Но если высота ListView не кратна ItemHeight, то даже с помощью дополнительных вычислений не возможно этим методом позиционировать нужный итем сверху.

 

Метод ScrollViewPos идеален для этого, но по какой то причине не работает сразу после создания итемов.

Ссылка на комментарий
  • 0

Type
  THackListBox = type TListBox;

Procedure TMainForm.Scroll_ListBox_to_Top;
begin
  THackListBox(MyListBox).VScrollBar.Value:= 0; // Прокрутка к первому Item
end;

 

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

 

Впрочем для вашего случая достаточно и ScrollViewPos, но нужно после создания Item добавлять RecalcSize.

Ссылка на комментарий
  • 0

Type

  THackListBox = type TListBox;

Procedure TMainForm.Scroll_ListBox_to_Top;

begin

  THackListBox(MyListBox).VScrollBar.Value:= 0; // Прокрутка к первому Item

end;

 

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

 

Впрочем для вашего случая достаточно и ScrollViewPos, но нужно после создания Item добавлять RecalcSize.

 

Ветка форума поэтому и называется TListView, что речь идет о TListView, а не ListBox.

 

Кстати заметил странность, после ListView.Resize иногда GetMaxScrollViewPos выдает реальное число а не 0. 

Удалось точно узнать в какой ситуации:

1. Добавляем много итемов, чтоб не помещались в видимую область

2. Удаляем все итемы (ListView.ClearItems;)

3. Опять добавляем итемы и позиционируем ScrollViewPos:=300 - Ура все работает.

Если в 1 пункте все итемы помещаются в видимую область, то в Четвертом пункте ScrollViewPos:=300 не приводит ни к какому результату (GetMaxScrollViewPos  = 0).

 

Остается списать все на очередной косяк Embarcadero, других мыслей нет...

Ссылка на комментарий
  • 0

Вы будете смеяться, но проблема решена. Методом научного тыка.

 

Не работающая установка значения ListView.ScrollViewPos решается следующей строкой   ListView.ItemIndex:=0; (Не важно 0 или любое другое число).

Т.е. для того чтоб заработало делаем так:

  ListView.ItemIndex:=0;
  ListView.ScrollViewPos:=333; // Ура, работает!!!

Почему так работает, я не понял.

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...