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

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

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

Me! писал(а):Antonariy
я снова тебя не понял...
Элементарно, Ватсон :) Плюс - согласие, одобрение. Минус - несогласие. Число - степень.
Лучший способ понять что-то самому — объяснить это другому.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 29.08.2007 (Ср) 14:28

Antonariy, ты бы лучше сказал мерцания уже нет или осталось с этим контролом?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

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

Сообщение Me! » 29.08.2007 (Ср) 14:43

Antonariy
вновь извиняюсь за оффтоп: я знаю что это обозначает, но не понял к чему ты это написал? но уже впрочем неважно

ЗЫ: и действительно хорошо бы узнать, решилась ли твоя проблема?

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

Сообщение Antonariy » 29.08.2007 (Ср) 14:50

Нет, не решилась. Сейчас посмотрю этот листвью и решу, пользоваться им или попробовать SGrid от vbAccelerator.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение kibernetics » 29.08.2007 (Ср) 16:50

этот листвью известного чела под ником Carles P.V.
у него много интересных контролов и всяких реалиазций

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

Сообщение Antonariy » 30.08.2007 (Чт) 12:49

Резюме: как бы ни был гламурен и глянцев SGrid, сортировка в нем живет собственной жизнью.
Код: Выделить всё
Private Sub Timer1_Timer()
    With vbalGrid1
        .AddRow
        .CellText(.Rows, 1) = Timer
        .SortObject.SortColumn(1) = 0
        .SortObject.SortOrder(1) = CCLOrderDescending
        .SortObject.SortType(1) = CCLSortNumeric
        .Sort
    End With
End Sub
При выполнении этого кода меньшее число может оказаться выше большего, "пережить" там пару сортировок и только потом занять свое место. Возможно это связано с неверной индексацией строк. Аналогичный код для листвью чела, широко известного в узких кругах под ником Carles P.V., работает как надо и даже не мигает, если его не разворачивать на весь экран.
Код: Выделить всё
Private Sub Timer1_Timer()
Dim nIdx As Integer
    With ucListView1
        nIdx = .Count
        Call .ItemAdd(nIdx, pvRandomString(3), 0, 1)
        Call .SubItemSet(nIdx, 1, Timer, 0)
        Call .SubItemSet(nIdx, 2, DateSerial(2004, Rnd * 11 + 1, Rnd * 30 + 1), 0)
       
        .Sort 1, soDescending, stNumeric
    End With
End Sub
Но за используемый им сабклассинг нужно бить сапогами по яйцам. Мегакруто, но нихрена не понятно, кроме того, что он формирует windowproc в памяти непосредственно из сырых байтов, делает их исполняемыми, а потом тычет окно носом в начало массива и говорит: "Это твоя процедура! Исполнять!!!". И дальнейшее общение с сабклассингом происходит в той же манере, типа "Ну ты, козел, ...".

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

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

Сообщение Хакер » 30.08.2007 (Чт) 13:02

Мегакруто, но нихрена не понятно, кроме того, что он формирует windowproc в памяти непосредственно из сырых байтов, делает их исполняемыми, а потом тычет окно носом в начало массива и говорит: "Это твоя процедура! Исполнять!!!". И дальнейшее общение с сабклассингом происходит в той же манере, типа "Ну ты, козел, ...".


Black-coding :)
А кстати, этот код DEP-safe ?

ADDED:
Судя по
делает их исполняемыми
- да.
—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 » 30.08.2007 (Чт) 13:07

Позабавил комментарий:
' Self-Subclassing UserControl template (IDE safe).
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Antonariy » 30.08.2007 (Чт) 16:32

Есть вообще возможность перевести оконную процедуру на более цензурный язык?

Я нашел ее и OMG, в ней все парамеры byref! И издевателькая подпись:
Код: Выделить всё
Public Sub zSubclass_Proc(ByVal bBefore As Boolean, ByRef bHandled As Boolean, ByRef lReturn As Long, ByRef lng_hWnd As Long, ByRef uMsg As Long, ByRef wParam As Long, ByRef lParam As Long)
'   If you really know what you're doing, it's possible to change the values of the
'   hWnd, uMsg, wParam and lParam parameters in a 'before' callback so that different
'   values get passed to the default handler.. and optionaly, the 'after' callback
Судя по стилю оформления кода сабклассинга, отличающегося от всего остального, автор его скопипастил тоже не до конца понимая. Повелся на "IDE safe". Раз так, попробую сам.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Antonariy » 06.09.2007 (Чт) 10:50

Как получить структуру NMLISTVIEW в событиях WM_*BUTTONDOWN и WM_CHAR, имея hwnd листвью и индекс выбранного элемента? Это нужно для получения идентификатора (NMLISTVIEW.lParam) элемента.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение tyomitch » 06.09.2007 (Чт) 11:23

Antonariy писал(а):Как получить структуру NMLISTVIEW в событиях WM_*BUTTONDOWN и WM_CHAR

Абсолютно никак. Она ходит только в WM_NOTIFY.
Изображение

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

Сообщение Me! » 08.09.2007 (Сб) 15:08

если я тебя правильно понял, то lParam можно получитть так:
Код: Выделить всё

Public Property Get ItemLParam$(ByVal Item%)
Dim uLVI As LVITEM_lp
If (m_hListView) Then
  uLVI.iItem = Item
  uLVI.mask = LVIF_PARAM
  Call SendMessageA(m_hListView, &H1005, Item, uLVI)
  ItemLParam = uLVI.lParam
End If
End Property

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

Сообщение Antonariy » 12.09.2007 (Ср) 16:30

Именно это! А теперь нужен обратный способ - получение Item по lParam. Или для этого нужно перебирать все индексы вышеуказанным способом?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Antonariy » 02.10.2007 (Вт) 14:00

Многострадальный API__ListView! был избавлен от блэк-кодинга, а заодно от пары багов и фич. После чего, вместе с листбоксом (того же походу автора), оформлен в библиотеку. Налетай...

1. Пропали глюки в дизайн-тайме, когда листвью не перемещался мышью.
2. Забыт, как страшный сон, баг, из-за которого работоспособен был только один инстанс листвью.
3. Перестали работать (и работали ли?) свойства HeaderFixedWidth, ScrollBarFlat, а так же (Оn)SubItemPrepaint, свойство и событие.
4. Удалены события MouseEnter/Leave.
5. Добавлена поддержка идентификаторов записей, методы инициализации спрятаны вовнутрь, Некоторые свойства и методы потеряли некоторые параметры, другие стали опциональными. Ну и так, по мелочи...
Вложения
ucListLib.rar
(93.19 Кб) Скачиваний: 342
Последний раз редактировалось Antonariy 02.10.2007 (Вт) 14:59, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.10.2007 (Вт) 14:35

Ну ты монстр :)
ListView он ведь капризный довольно, хуже него только MonthView и DTPicker.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Antonariy » 02.10.2007 (Вт) 14:58

Капризны только многочисленные инкарнации Comctl32 в разных ocx'ах. Если выкинуть ненужное, сухой остаток ведет себя вполне смирно. Не тормозит и почти не мигает. :) Возможно когда-нибудь добавлю объектную модель как в MS Common Controls.

А с DTPicker'ом я помирился уже много лет назад. :)
Лучший способ понять что-то самому — объяснить это другому.

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 02.10.2007 (Вт) 18:34

Antonariy
Качай, пользуйся и радуйся. :D Никаких грёбаных контролов. Просто Класс. :P
Вложения
APITREEVIEW.ZIP
(35.97 Кб) Скачиваний: 326

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

Сообщение Antonariy » 02.10.2007 (Вт) 20:03

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

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

Сообщение Me! » 06.10.2007 (Сб) 20:38

2. Забыт, как страшный сон, баг, из-за которого работоспособен был только один инстанс листвью.

хм...
достаточно долго уже работаю с этим контролом, но этого бага не замечал никогда...

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

Сообщение Хакер » 07.10.2007 (Вс) 8:56

А эта гадость тоже с блэк-кодингом.

Причём ещё и с кривым, DEP-unsafe блэк-кодингом.
—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 » 09.10.2007 (Вт) 10:37

Решил переделать и добавить в библиотеку этот тривью и наткнулся на проблему - Circular dependencies between modules на ровном месте.
В листвью объявлено:
Код: Выделить всё
Public Enum eBorderStyleConstants
    [bsNone] = 0
    [bsThin] = 1
    [bsThick] = 2
End Enum

этот код одинаковый для листвью и листбокса:
Private m_BorderStyle          As eBorderStyleConstants

Public Property Get BorderStyle() As eBorderStyleConstants
    BorderStyle = m_BorderStyle
End Property

Public Property Let BorderStyle(ByVal New_BorderStyle As eBorderStyleConstants)
    m_BorderStyle = New_BorderStyle
    Call pvSetBorderStyle(UserControl.hWnd, m_BorderStyle)
    Call UserControl_Resize
End Property
Однако добавление того же кода в тривью вызвало указанную выше ошибку. Причем она проявилась не только для этого типа, но и для Private chkState As POINTAPI, объявленного в тривью. Проблему с
POINTAPI решил переносом его объявления в другой модуль. Перенес eBorderStyleConstants из листа в дерево, ошибка исчезла. Что происходит?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Antonariy » 10.10.2007 (Ср) 10:12

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

1. При установке стиля TVS_CHECKBOXES чекбоксы появляются, но при удалении стиля они остаются на местах и перестают реагировать на мышь и пробел.

2. Ни в окно UserControl'а ни в окно treeview не приходит событие WM_LBUTTONUP при клике на чекбоксе (или айтеме) из-за чего невозможно сгенерить событие ItemCheck. С пробелом проблем нет.

Причём ещё и с кривым, DEP-unsafe блэк-кодингом.

Теперь естественно без него. Кстати проект с использованием того класса невозможно поставить на паузу или по брейкпоинту - IDE падает.
Из мелочей - подчищен модуль деклараций, разнесены в разные места некоторые типы с целью избежания циклических ссылок, которых нет, некоторые свойства теперь хранятся в пропертибэгах.
Вложения
ucListLib.rar
(114.56 Кб) Скачиваний: 287
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Antonariy » 23.11.2007 (Пт) 11:44

По некоторым просьбам выкладываю продолжение эпопеи "Common Controls своими руками". В библиотеку добавлен тулбар и прогрессбар и выкинут CoolList ибо убожество и к СС не имеет отношения. Однако сам *.ctl в архиве остался.
В листвью вернулось OnSubItemPrepaint, однако вместо рисования через hdc предоставлена возможность лишь менять цвет текста, фона и вид шрифта. Так же добавлено событие OnItemPrepaint, которое запускается не для каждой ячейки, а для целой строки, соответственно переданные в нем параметры распространяются на всю строку. Это дает заметный выигрыш в производительности, когда не нужно раскрашивать каждую ячейку по-своему.

Известные баги:
1. ListView: Вернулся глюк в дизайн-тайме, когда листвью не перемещается мышью.
2. ListView: Иногда при потере фокуса где-то происходит какое-то зацикливание, LV начинает мигать и грузить процессор. Порочный круг разрывается кнопкой "свернуть все окна".
3. ListView: Встроенные иконки для для хедера, которые показывают сортировку, отображаются только в тестовом проекте :(
4. TreeView: При установке стиля TVS_CHECKBOXES чекбоксы появляются, но при удалении стиля они остаются на местах и перестают реагировать на мышь и пробел.
5. TreeView: Ни в окно UserControl'а ни в окно treeview не приходит событие WM_LBUTTONUP при клике на чекбоксе (или айтеме) из-за чего невозможно сгенерить событие ItemCheck. С пробелом проблем нет.
6. Toolbar: Иконки липнут к левому краю кнопок. И вообще кнопки по высоте больше, чем по ширине.

Прогрессбар настолько прост, что не имеет даже сабклассинга, не то что багов.
Вложения
ucComCtl.rar
(110.67 Кб) Скачиваний: 302
Лучший способ понять что-то самому — объяснить это другому.

SCINER
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 27.01.2005 (Чт) 20:46
Откуда: Казань

Сообщение SCINER » 28.11.2007 (Ср) 19:18

Я вот здесь тоже начал собирать =)
http://forum.sources.ru/index.php?showtopic=161257

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 28.11.2007 (Ср) 20:23

SCINER
Кстати, +10 тебе за то, что, что все собрал в одну кучу, и всем тем кто, писал эти контролы, они реально выручают, а то мне стандартные че-та не очень нравятся. Манифест натягивается только на пятую версию, а она почему-то не у всех есть. А здесь все работает. И библиотек лишних таскать с собой не надо, и с манифестом все работает.
Подпись проходит рефакторинг

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

Сообщение kibernetics » 29.11.2007 (Чт) 14:29

Lumen
это точно!
парни молодцы...

Arcady_XQST
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 17.09.2007 (Пн) 1:27
Откуда: Russia, Bryansk

Сообщение Arcady_XQST » 29.11.2007 (Чт) 15:34

Только у этих контролов с фокусом проблемы... Вернее, он на них не передается по TAB. Вот бы написать хорошую функцию для обработки и вставить в те контролы, в которых нужен фокус... :)
// тили-тили, трали-вали
if (jsLoaded) {
// это дело мне по силе, откажусь теперь едва ли
} else {
// это мы не проходили, это нам не задавали
}

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 29.11.2007 (Чт) 16:00

Arcady_XQST
Ты про какие контролы? На которые SCINER дал ссылку? Все там передается, тока фокусная рамка не отображается. В доказательство попробуй обработать у каждого контрола событие GotFocus...
Подпись проходит рефакторинг

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

Сообщение Antonariy » 30.11.2007 (Пт) 15:48

Исправлен баг с фокусом, а также баги 1 и 2 ListView.
Все это было взаимосвязано.
Вложения
ucComCtl.rar
(103.53 Кб) Скачиваний: 282
Последний раз редактировалось Antonariy 03.12.2007 (Пн) 17:08, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение kibernetics » 30.11.2007 (Пт) 15:51

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

Пред.След.

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

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

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

    TopList