LVM_SORTITEMS + VB6

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

LVM_SORTITEMS + VB6

Сообщение Alexanbar » 15.07.2006 (Сб) 0:46

Есть такое сообщение. Его, в частности, использует и VB6.

В качестве параметров сообщения выступают:
1. адрес функции обратного вызова для сравнения двух элементов (lparam)
2. произвольный параметр, который туда передаётся (wparam).

Возникает желание подменить адрес ф-и сравнения на адрес своей ф-ии.

А для этого хотелось бы знать, что конкретно VB6 передаёт в качестве параметра wparam.

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 15.07.2006 (Сб) 1:00

1. http://www.codeguru.com/forum/archive/i ... 62435.html

2. http://msdn.microsoft.com/library/defau ... titems.asp

3. http://dietmonday.com/windows/WinDoc/ms ... sg13_8.htm

Это Shatter3 - Windows Killer?

Я заинтересован т.к. раньше копал в эту сторону:

http://www.wasm.ru/forum/viewtopic.php?id=8908
--
Очень слежу за дальнейшим развитием!
Удачи!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 15.07.2006 (Сб) 1:15

Это просто файловый менеджер. Для отображения файлов и пр. используется Листвью. Как известно, с сортировкой по датам и размеру возникают проблемы.

Сейчас поставил такой опыт. Подменил ф-ю срвнения на свою, и параметр передаю тот, какой хочу. Как-то вроде работает (Ошибки, видать в моей ф-и сравнения есть). По крайней мере, VB6 не падает.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 15.07.2006 (Сб) 15:47

Исправил ошибки в ф-ии сравнения. Работает, но гораздо медленнее, чем стандартная сортировка.

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re

Сообщение xenomorph » 15.07.2006 (Сб) 16:01

А можно кусочек кода с Callback процедурой посмотреть?
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 15.07.2006 (Сб) 21:05

Там довольно много отягчающих подробностей
Index передаётся как параметр (это индекс у Листвью - у меня их несколько). Прежде всего нужно по известному Lparam получить номер элемента (см. LvwFindItemIndex)
Код: Выделить всё
Public Function autoItemCompare _
    (ByVal lngParam1 As Long, _
     ByVal lngParam2 As Long, _
     ByVal Index As Long) As Long

Dim ItemIndex1 As Long, ItemIndex2 As Long

ItemIndex1 = LvwFindItemIndex(lngParam1, Index)
ItemIndex2 = LvwFindItemIndex(lngParam2, Index)

autoItemCompare = ItemCompare(ItemIndex1, ItemIndex2, Index, _
                   "", "", -1, -1)

End Function

Public Function LvwFindItemIndex _
        (lngParam As Long, _
         Index As Long) As Long
Dim LvwFnd As LV_FINDINFO
Dim hwnd&

hwnd = Form1.ListView1(Index).hwnd
LvwFnd.Flags = LVFI_PARAM
LvwFnd.lParam = lngParam
LvwFindItemIndex = SendMessage(hwnd, LVM_FINDITEM, -1, LvwFnd)
LvwFindItemIndex = LvwFindItemIndex + 1
End Function


Собственно сравнение:
Код: Выделить всё
Public Function ItemCompare _
    (ByVal ItemIndex1 As Long, _
     ByVal ItemIndex2 As Long, _
     ByVal Index As Long, _
     strItem1 As String, _
     strItem2 As String, _
     iIcon1 As Long, _
     iIcon2 As Long) As Long


Dim ColumnNumber As Long
Dim vItem1, vItem2
Dim lngItem1, lngItem2
Dim dtItem1 As Date, dtItem2 As Date



ColumnNumber = Form1.ListView1(Index).SortKey + 1

GetItemData Index, ItemIndex1, strItem1, iIcon1, ColumnNumber - 1 ' strIcon1
GetItemData Index, ItemIndex2, strItem2, iIcon2, ColumnNumber - 1


    Select Case ColumnNumber
        Case 1, 2
           
            ItemCompare = StrComp(strItem1, strItem2, vbTextCompare)
           
            If Form1.ListView1(Index).SortOrder = lvwDescending Then
                ItemCompare = -ItemCompare
            End If
           
         
            Exit Function
       
        Case 3
            'по размеру
           
            lngItem1 = Val(strItem1)

            lngItem2 = Val(strItem2)
           
            If lngItem1 < lngItem2 Then
               ItemCompare = -1
            ElseIf lngItem1 = lngItem2 Then
                ItemCompare = 0
            Else
                ItemCompare = 1
           
            End If
            If Form1.ListView1(Index).SortOrder = lvwDescending Then
                ItemCompare = -ItemCompare
            End If
            Exit Function
 

        Case 4
           
     
            dtItem1 = StrToDate(strItem1)
            dtItem2 = StrToDate(strItem2)
               
            If dtItem1 < dtItem2 Then
               ItemCompare = -1
            ElseIf dtItem1 = dtItem2 Then
                ItemCompare = 0
            Else
                ItemCompare = 1
           
            End If
            If Form1.ListView1(Index).SortOrder = lvwDescending Then
                ItemCompare = -ItemCompare
            End If
            Exit Function
                             
    End Select

End Function



В функции GetItemData Получаем тескт и иконку посылкой LVM_GETITEM и/или LVM_GETITEMTEXT


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

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

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

    TopList