Как сохранить положение вертикального скролбара

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Как сохранить положение вертикального скролбара

Сообщение kibernetics » 07.01.2021 (Чт) 15:34

Hi, guys!
Всех с Новым Годом! :santa:

Ну и вопрос в студию:
пользуюсь листвьюшкой(ucListView), режим Details.
Регулярно, необходимо добавлять элементы, поэтому, происходит заново наполнение контрола. И, если, скажем, скрол был в самом низу, то после нового наполнения всё стартует заново, и скрол оказывается в самом верху.
Это несколько раздражает.

Вопрос, можно ли как-то восстанавливать положение скролбара с момента последнего наполнения?

П.С. Олсо, пробовал
Код: Выделить всё
lvw.ItemEnsureVisible(n)
, но этот метод показывает элемент в середине рабочего окна контрола, хотя до этого, он мог быть по краю верхней границы окна. Иными словами, это не точное его предыдущее место.
Поэтому, и хотелось бы реализовать через восстановление последнего адреса позиции скролбара.

С уважением к форуму и форумчанам.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сохранить положение вертикального скролбара

Сообщение Хакер » 07.01.2021 (Чт) 17:00

Зачем обновлять ListView путём полного опустошения и заполнения с нуля?

Это противоречит принципу лени. Это плохой подход, который заслуживает, чтобы его выжгли калёным железом, даже если бы проблем со скроллбаром не возникало.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как сохранить положение вертикального скролбара

Сообщение kibernetics » 07.01.2021 (Чт) 21:37

Отнюдь, коллега. Работа с сохранением и восстановлением скрола тоже не меньший труд, чем, работа со строками. Так, что тут дело не в лени, а просто в другом подходе. :D

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сохранить положение вертикального скролбара

Сообщение Хакер » 07.01.2021 (Чт) 21:42

Это называется что-то ответил, а что именно хотел сказать — непонятно.

Есть такой грешок за твои кодом, как тотальное очищение списка и последующее заполнение с нуля новыми данными? Есть? Избавляйся, за одно и проблема со скроллом уйдёт.

Я скажу больше: не только скролл, но и выделение будет слетать. Переименование пункта (если оно есть) будет слетать. Контекстное меню, если оно реализовано через индексы или ссылки на элементы, будет слетать. Лень тут при том, что если бы компьютер умел лениться, он бы отказался делать ту фигню, которую вы заставляете его делать своим необдуманным подходом к обновлению списков.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как сохранить положение вертикального скролбара

Сообщение The trick » 07.01.2021 (Чт) 23:16

Не удаляй элементы списка, а просто модифицируй их (удаляй лишние/добавляй новые если количество строк разное). Я бы вообще использовал виртуальный список, там есть и специальные сообщения чтобы скрол не трогать + памяти меньше потребляет.
UA6527P

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как сохранить положение вертикального скролбара

Сообщение kibernetics » 09.01.2021 (Сб) 20:46

Посыл ясен, господа.
Покумекаю, как обойтись без перезагрузки.
А что это за виртуал список?
Типа, коллекции чтото?

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как сохранить положение вертикального скролбара

Сообщение The trick » 09.01.2021 (Сб) 22:15

kibernetics писал(а):А что это за виртуал список?

LVS_OWNERDATA
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сохранить положение вертикального скролбара

Сообщение Хакер » 10.01.2021 (Вс) 2:18

kibernetics писал(а):Покумекаю, как обойтись без перезагрузки.

Что тут кумекать.

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

Сравниваем эти два множества, получаем в результате два списка:
1) Список элементов, которые нужно удалить из ListView.
2) Список элементов, которые нужно добавить в ListView.

А дальше удаляем пару-тройку и добавляем другую пару-тройку, не трогая тысячу тех элементов, которые не нужно трогать.

Для того, чтобы два множества можно было сравнить, вычислив разницу между ними, элементы множеств должны обладать таким качеством как идентифицируемость. Если у каждой сущности есть какой-то уникальный Id или какое-то свойство, которое можно рассматривать как Id, или несколько параметров, которые в совокупности как признак уникальности.

Если так, то оптимальный алгоритм сравнения множеств подразумевает, что составляется два списка (для двух множеств), в которых элементы упорядочены по уникальному признаку. Дальше два «указателя» устанавливаются на начала списков и начинается цикл: если элементы по указателю равны, считается, что элемент есть и в старом множестве и в новом, и с ним ничего делать не надо. В таком случае оба указателя сдвигаются на один элемент вперёд и делается следующая итерация. Если же элементы по указателю не равны, тот указатель, который указывает на меньший элемент, сдвигается на одну позицию вперёд, но перед этим элемент, который был по сдвигаемому указателю, добавляется в один из пары новых списков (в зависимости от того, к какому изначальному списку относился сдвигаемый указатель) — такие итерации делаются до тех пор, пока тернарный (< или = или >) результат сравнения элементов по указателю не сменится. Если один из указателей достиг конца списка, оставшиеся элементы из другого списка добавляются в соответствующий новый список безусловно.

На выходе имеем два новых списка: если исходные списки можно было бы обозначить как X и Y, то два новых будут содержать «список элементов, которые есть в X, но которых нет в Y» и «список элементов, которые есть в Y, но которых нет в X».

Если в реальной задачи на X был старым снапшотом ListView, а Y — новым снапшотом, то первый новый список будет списком элементов, которые надо удалить из ListView, а второй — списком элементов, которые надо добавить.

И когда я говорю «указатели» в рамках данного объяснения, это совершенно не значит, что нужно использовать указатели, дарующие доступ к произвольным участкам памяти, и которых, как считается, в VB6 в прямом и явном виде нет (хотя и их можно). Массив элементов и простая индексная переменная, хранящая индекс элемента массива, прекрасно подходят на роль списка и указателя на элемент списка.
set_diff_algo_2.png
set_diff_algo_2.png (62.92 Кб) Просмотров: 1308
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 48

    TopList