Добавление в ListView и автоскроллинг

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Добавление в ListView и автоскроллинг

Сообщение Antonariy » 27.08.2007 (Пн) 11:06

В LV пятой версии в режиме lvwReport неспеша (1-2 раза в секунду) добавляютcя новые записи. Захотелось сделать так, чтобы записи добвлялись в начало по мере поступления. Надумал добавить невидимое поле, писать в него значения таймера и сортировать по убыванию. Записи добавляются в начало, однако сам список скроллируется в конец, к первой добавленной записи. Плюс непристойно мерцает. Можно ли это победить?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 27.08.2007 (Пн) 11:26

В LV пятой версии в режиме lvwReport неспеша (1-2 раза в секунду) добавляютcя новые записи.

Что есть LV пятой версии? Обёртка из comctl32.ocx что-ли?

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

А зачем? Ради нужного порядка отображения?
Последний раз редактировалось Хакер 27.08.2007 (Пн) 11:35, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 11:30

Обёртка из comctl32.ocx что-ли?
Да.
А зачем? Ради нужного порядка отображения?
Странный вопрос. Разве то, что я написал, можно понять как-то иначе?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 27.08.2007 (Пн) 11:35

Для этого не надо создавать никаких невидимых полей с автосортировкой.

Достаточно делать так:
Dim e As ListItem
Set e = ListView1.ListItems.Add(1, , CStr(Rnd))
DoEvents
e.EnsureVisible


А избавляться от мигания - эксперементальным путём. У меня есть мысли, но озвучивать я их не буду, потому как могу ошибаться.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 11:48

EnsureVisible пробовал, не помогает. Только моргает еще непристойнее. Если пройтись пошагово, то он таки делает видимым добавленный элемент, но в режиме непрерывного выполнения почему-то все равно скроллится в конец.
У меня есть мысли, но озвучивать я их не буду, потому как могу ошибаться.
Все равно буду рад услышать. Потому как у меня вообще никаких.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 27.08.2007 (Пн) 11:54

1) Ты DoEvents между добавлением и EnsureVisible делаешь?

2) LockWindowUpdate. Или сабклассинг внутреннего LV с обламыванеим "лишних" сообщений. Но мне эти способы как-то совсем не нравятся.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.08.2007 (Пн) 11:57

Хакер писал(а):2) LockWindowUpdate. Или сабклассинг внутреннего LV с обламыванеим "лишних" сообщений. Но мне эти способы как-то совсем не нравятся.

WM_SETREDRAW нравится?

А LockWindowUpdate вообще совсем не для этого.
Изображение

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

Сообщение kibernetics » 27.08.2007 (Пн) 12:08

я тоже с этим мерцанием намучался, экспериментировал, и в итоге выставил так:
Код: Выделить всё
LvwName.Visible = False
LvwName.ListItems.Clear
...
LvwName.Add...
...
LvwName.Refresh
LvwName.Visible = True

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 12:21

Хакер
1) Сделал, помогло. Однако теперь любуюсь неспешным скроллингом туда-обратно :)
Добавление происходит при событии от винсока, не думал, что понадобится дополнительное время на раздумья.

tyomitch
Попробую.

kibernetics
Мерцание всего ListView что-то не возбуждает :)
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 12:38

tyomitch
А что с ним делать? Пробовал игнорировать, но эффекта нет.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 27.08.2007 (Пн) 12:43

Antonariy
Его надо слать, а не игнорировать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 13:23

В какой момент слать? У меня сейчас:
Код: Выделить всё
With ListView1.ListItems.Add
    ля-ля-тополя
    DoEvents
    .EnsureVisible
End With
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 27.08.2007 (Пн) 13:36

Antonariy
Слать два раза. Первый раз выключать перерисовку (до добавления), второй раз Включать её (до или после EnsureVisible - определи экспериментально)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 27.08.2007 (Пн) 14:08

SendMessage hListView, WM_SETREDRAW, 0, 0 - выключить обновление
SendMessage hListView, WM_SETREDRAW, 1, 0 - включить

выключаешь перед очисткой списка, включаешь после завершения добавления

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

Сообщение Хакер » 27.08.2007 (Пн) 14:10

Me!
Ты забыл ещё расписать как получить hListView.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 27.08.2007 (Пн) 14:13

Ну, если просите:
hListView = ListView1.hWnd

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

Сообщение Хакер » 27.08.2007 (Пн) 14:16

ListView1.hWnd - это обёртка ListViewWndClass. А нам нужен SysListView32 :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 14:24

Удалось частично победить таким способом:
Код: Выделить всё

        DoEvents
        .EnsureVisible
        SendMessage ListView1.hwnd, WM_SETREDRAW, 1, 0


Private Function LVProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case uMsg
        Case WM_CLOSE
            SetWindowLong hw, GWL_WNDPROC, lpListViewProc
        Case WM_SETREDRAW
            If wParam = 1 And lParam = 0 Then Exit Function
            'WM_SETREDRAW и так шлется, в первый раз 0 при Add, второй раз 1 при DoEvents
            'Вот этот второй раз и нужно проигнорировать.
            'При SendMessage lParam приходит равным 1307854
    End Select
    LVProc = CallWindowProc(lpListViewProc, hw, uMsg, wParam, lParam)
End Function
А частично потому, что пока скроллбар не сократится до размера в половину видимого списка, гуляние оного вверх-вниз продолжается. Можно даже уменьшить размер листвью - при сокращении скроллбара все непристойности тут же прекращаются.
Что бы это значило? :scratch:
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 15:21

Еще это как-то связано с выделенным элементом. Когда он сползает за пределы видимой части списка, начинаются тормоза с перерисовкой, но после какого-то момента вдруг прекращаются. Если выделить видимый элемент, то тоже прекращаются, пока выделение вновь не уползет.
Вложения
lv.rar
(4.16 Кб) Скачиваний: 326
Лучший способ понять что-то самому — объяснить это другому.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 27.08.2007 (Пн) 15:27

по-моему, проще написать ListView контрол самому с нуля на апишках, чем изучать все глюки враппера.

гуглением находил подобный пример контрола - работает отлично, поддерживает все возможности ListView из MSCOMCTL и работает не в пример быстрее!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.08.2007 (Пн) 16:00

это на vbaccelerator что ли? ;-)
Изображение

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 27.08.2007 (Пн) 20:04

нет, тот мне не понравился.
нашёл разработку какого-то индивидуума

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

Сообщение kibernetics » 28.08.2007 (Вт) 16:39

Me!
так может на всеобщее обозрение чудо-контрол?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.08.2007 (Вт) 17:15

+1
Лучший способ понять что-то самому — объяснить это другому.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 28.08.2007 (Вт) 19:59

дык запросто, вот оригинал контрола:

ЗЫ: Antonariy, а в чём смысл твоего последнего поста? так и я смогу сообщения понабивать себе!
Вложения
API__ListView!.rar
API_ListView
(25.19 Кб) Скачиваний: 334

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

Сообщение Хакер » 28.08.2007 (Вт) 20:27

Это такой инкремент счётчика желающих также как и kibernetics вглянуть на контрол.

Настоящие программисты правда пишут "++" :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 28.08.2007 (Вт) 20:54

извиняюсь за оффтоп, но AFAIK "+1" ставят как знак того, что высказывание того, кому ставят этот +, заслуживает инкрементирования рейтинга на форуме. здесь он, имхо, не к месту...
но это всего лишь имхо

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

Сообщение kibernetics » 29.08.2007 (Ср) 11:00

надо отметить контрол добротный

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.08.2007 (Ср) 12:27

Это такой инкремент счётчика желающих также как и kibernetics вглянуть на контрол.
+1
извиняюсь за оффтоп, но AFAIK "+1" ставят как знак того, что высказывание того, кому ставят этот +, заслуживает инкрементирования рейтинга на форуме. здесь он, имхо, не к месту...
-1

:D
Лучший способ понять что-то самому — объяснить это другому.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 29.08.2007 (Ср) 13:23

Antonariy
я снова тебя не понял...

кстати: в том контроле нет некоторых фич, присутствующих в ListView из MSCOMCTL, например LV.SelectedItem (получение номера выделенного item'а.), но я думаю добавление оного не составит затруднений.

Примечательно в этом контроле то, что корректно обрабатывает получение/потерю фокуса при нажатии Tab, в отличии от контрола на vbaccelerator

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList