powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сортировка в ListView
15 сообщений из 15, страница 1 из 1
Сортировка в ListView
    #32175238
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите pls как сортировать по дате в ListView.
При использовании стандартных SortKey и SortOrder
даты сортируются как строки, а как сделать по-человечески ?????
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175253
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щас придет Сенин Виктор
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175283
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я ничего не понимаю в ListView, но для того, чтобы сортировка строк годилась для сортировки дат, можно отформатировать даты как YYYYMMDD. Тогда при сортировке по алфавиту как раз и получатся более ранние даты раньше, чем более поздние.
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175286
pv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 sasha_1:
А порпобуй их записать в формате гггг.мм.дд, тогда и как строки пройдет.
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175298
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я здесь

Сразу скажу - сортировка на больших значениях (тысячи записей) работает мееедлееееееноооооооо. В десятки раз быстрее сортировать дату по формату yyyy-mm-dd . Единственное, что хорошо - эта функция правильно отсортирует и такую дату "01 февраля, 2003", т.е. отформатированную и если DateValue сможет это форматирование распознать.
Так же в этом модуле сортировка чисел, процентов и ден. единиц.
Если бы этот гадский компонент позволял сортировать по выбору значения из key, text, tag - то таких проблем бы не было. А так ...
P.S. Пример не мой. Многое мне не понятно. есть еще пример от Микрософт (дан ниже), но там еще хуже - сполошь не докуметированные функции. Хотя оба примера основаны на одном и том же принцепе.
P.S.S
Сам дату не сортиурю - пользуюсь форматом yyyymmdd. Сортирую только денежную цифирь. Так же медленно , но что сделаешь... :(


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
'Make sure the module name is
'mLVSort.  Set this in
'your properties window


Public objFind   As LV_FINDINFO
Public objItem   As LV_ITEM

'variable to hold the sort order (ascending or descending)
Public sOrder    As Boolean
'variable to hold sort column
Public sColumn   As Long

Public Type POINT
    x            As Long
    y            As Long
End Type

Public Type LV_FINDINFO
    flags        As Long
    psz          As String
    lParam       As Long
    pt           As POINT
    vkDirection  As Long
End Type

Public Type LV_ITEM
    mask         As Long
    iItem        As Long
    iSubItem     As Long
    state        As Long
    stateMask    As Long
    pszText      As String
    cchTextMax   As Long
    iImage       As Long
    lParam       As Long
    iIndent      As Long
End Type

'Constants
Public Const LVFI_PARAM =  1 
Public Const LVIF_TEXT = &H1

Public Const LVM_FIRST = &H1000
Public Const LVM_FINDITEM = LVM_FIRST +  13 
Public Const LVM_GETITEMTEXT = LVM_FIRST +  45 
Public Const LVM_SORTITEMS = LVM_FIRST +  48 

'API declarations
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" ( _
                                                                           ByVal hWnd As Long, _
                                                                           ByVal wMsg As Long, _
                                                                           ByVal wParam As Long, _
                                                                           ByVal lParam As Long) As Long

Public Declare Function SendMessageAny Lib "user32" Alias "SendMessageA" ( _
                                                                          ByVal hWnd As Long, _
                                                                          ByVal wMsg As Long, _
                                                                          ByVal wParam As Long, _
                                                                          lParam As Any) As Long
Public Function CompareDates(ByVal lParam1 As Long, _
                             ByVal lParam2 As Long, _
                             ByVal hWnd As Long) As Long

'CompareDates: This is the sorting routine that gets passed to the
'ListView control to provide the comparison test for date values.

'Compare returns:
' 0 = Less Than
'  1  = Equal
' 2 = Greater Than

    Dim dDate1 As Date, dDate2 As Date, dE As Boolean, d2E As Boolean
    On Error GoTo CDERR

    'Obtain the item names and dates corresponding to the
    'input parameters
    dDate1 = ListView_GetItemDate(hWnd, lParam1)
    dDate2 = ListView_GetItemDate(hWnd, lParam2)

    'based on the Public variable sOrder set in the
    'columnheader click sub, sort the dates appropriately:
    Select Case sOrder
        Case True:    'sort descending

            If dDate1 < dDate2 Then
                CompareDates =  0 
            ElseIf dDate1 = dDate2 Then
                CompareDates =  1 
            Else
                CompareDates =  2 
            End If

        Case Else:    'sort ascending

            If dDate1 > dDate2 Then
                CompareDates = 0
            ElseIf dDate1 = dDate2 Then
                CompareDates = 1
            Else
                CompareDates = 2
            End If

    End Select
    Exit Function
CDERR:
    CompareDates = 1
End Function


Public Function CompareValues(ByVal lParam1 As Long, _
                              ByVal lParam2 As Long, _
                              ByVal hWnd As Long) As Long

'CompareValues: This is the sorting routine that gets passed to the
'ListView control to provide the comparison test for numeric values.

'Compare returns:
' 0 = Less Than
'  1  = Equal
' 2 = Greater Than

    Dim val1 As Long, val2 As Long
    On Error GoTo CDERR
    'Obtain the item names and values corresponding
    'to the input parameters
    val1 = ListView_GetItemValueStr(hWnd, lParam1)
    val2 = ListView_GetItemValueStr(hWnd, lParam2)

    'based on the Public variable sOrder set in the
    'columnheader click sub, sort the values appropriately:
    Select Case sOrder
        Case True    'sort descending

            If val1 < val2 Then
                CompareValues =  0 
            ElseIf val1 = val2 Then
                CompareValues =  1 
            Else
                CompareValues =  2 
            End If

        Case Else    'sort ascending

            If val1 > val2 Then
                CompareValues = 0
            ElseIf val1 = val2 Then
                CompareValues = 1
            Else
                CompareValues = 2
            End If

    End Select
    Exit Function
CDERR:
    CompareValues = 1
End Function

Public Function CompareCurrency(ByVal lParam1 As Long, _
                                ByVal lParam2 As Long, _
                                ByVal hWnd As Long) As Long

'CompareValues: This is the sorting routine that gets passed to the
'ListView control to provide the comparison test for numeric values.

'Compare returns:
' 0 = Less Than
'  1  = Equal
' 2 = Greater Than

    Dim val1 As Currency, val2 As Currency
    On Error GoTo CDERR
    'Obtain the item names and values corresponding
    'to the input parameters
    val1 = ListView_GetItemCurrency(hWnd, lParam1)
    val2 = ListView_GetItemCurrency(hWnd, lParam2)

    'based on the Public variable sOrder set in the
    'columnheader click sub, sort the values appropriately:
    Select Case sOrder
        Case True:    'sort descending

            If val1 < val2 Then
                CompareCurrency =  0 
            ElseIf val1 = val2 Then
                CompareCurrency =  1 
            Else
                CompareCurrency =  2 
            End If

        Case Else:    'sort ascending

            If val1 > val2 Then
                CompareCurrency = 0
            ElseIf val1 = val2 Then
                CompareCurrency = 1
            Else
                CompareCurrency = 2
            End If

    End Select
    Exit Function
CDERR:
    CompareCurrency = 1
End Function

Public Function ComparePercent(ByVal lParam1 As Long, _
                               ByVal lParam2 As Long, _
                               ByVal hWnd As Long) As Long

'CompareValues: This is the sorting routine that gets passed to the
'ListView control to provide the comparison test for numeric values.

'Compare returns:
' 0 = Less Than
'  1  = Equal
' 2 = Greater Than

    Dim val1 As Single, val2 As Single
    On Error GoTo CDERR
    'Obtain the item names and values corresponding
    'to the input parameters
    val1 = ListView_GetItemPercent(hWnd, lParam1)
    val2 = ListView_GetItemPercent(hWnd, lParam2)

    'based on the Public variable sOrder set in the
    'columnheader click sub, sort the values appropriately:
    Select Case sOrder
        Case True:    'sort descending

            If val1 < val2 Then
                ComparePercent =  0 
            ElseIf val1 = val2 Then
                ComparePercent =  1 
            Else
                ComparePercent =  2 
            End If

        Case Else:    'sort ascending

            If val1 > val2 Then
                ComparePercent = 0
            ElseIf val1 = val2 Then
                ComparePercent = 1
            Else
                ComparePercent = 2
            End If

    End Select
    Exit Function
CDERR:
    ComparePercent = 1
End Function

Private Function ListView_GetItemDate(hWnd As Long, lParam As Long) As Date
    Dim r As Long, hIndex As Long, tmpdate As Date
    'Convert the input parameter to an index in the list view
    objFind.flags = LVFI_PARAM
    objFind.lParam = lParam
    hIndex = SendMessageAny(hWnd, LVM_FINDITEM, - 1 , objFind)

    'Obtain the value of the specified list view item.
    'The objItem.iSubItem member is set to the index
    'of the column that is being retrieved.
    objItem.mask = LVIF_TEXT
    objItem.iSubItem = sColumn
    objItem.pszText = Space$(32)
    objItem.cchTextMax = Len(objItem.pszText)

    'get the string at subitem  1 
    r = SendMessageAny(hWnd, LVM_GETITEMTEXT, hIndex, objItem)

    'and convert it into a date and exit
    On Error Resume Next
    If r > 0 Then
        tmpdate = DateValue(objItem.pszText)
        If err.Number = 13 Or Not IsDate(tmpdate) Then
            'dateValue  237 ; 229 ;  239 ; 229 ; 240 ; 229 ; 224 ; 240 ; 232 ; 226 ; 224 ; 229 ; 242 ;  239 ; 243 ; 241 ; 242 ; 251 ; 229 ;  231 ; 237 ; 224 ; 247 ; 229 ; 237 ; 232 ; 255 ;  232 ;  237 ; 229 ;  241 ; 242 ; 224 ; 237 ; 228 ; 224 ; 240 ; 242 ; 237 ; 238 ;  238 ; 242 ; 244 ; 238 ; 240 ; 236 ; 224 ; 242 ; 232 ; 240 ; 238 ; 226 ; 224 ; 237 ; 251 ; 229 ;  231 ; 237 ; 224 ; 247 ; 229 ; 237 ; 232 ; 255 ;
            ListView_GetItemDate = DateSerial( 4501 ,  1 ,  1 )
            err.Clear
        Else
            ListView_GetItemDate = CDate(tmpdate)    'CDate(Left$(objItem.pszText, r))
        End If
    End If
End Function


Public Function ListView_GetItemValueStr(hWnd As Long, lParam As Long) As Long
    Dim r As Long, hIndex As Long
    'Convert the input parameter to an index in the list view
    objFind.flags = LVFI_PARAM
    objFind.lParam = lParam
    hIndex = SendMessageAny(hWnd, LVM_FINDITEM, - 1 , objFind)

    'Obtain the value of the specified list view item.
    'The objItem.iSubItem member is set to the index
    'of the column that is being retrieved.
    objItem.mask = LVIF_TEXT
    objItem.iSubItem = sColumn
    objItem.pszText = Space$(32)
    objItem.cchTextMax = Len(objItem.pszText)

    'get the string at subitem  2 
    r = SendMessageAny(hWnd, LVM_GETITEMTEXT, hIndex, objItem)

    'and convert it into a long
    If r > 0 Then
        ListView_GetItemValueStr = CLng(Left$(objItem.pszText, r))
    End If
End Function

Public Function ListView_GetItemCurrency(hWnd As Long, lParam As Long) As Currency
    Dim r As Long, hIndex As Long
    'Convert the input parameter to an index in the list view
    objFind.flags = LVFI_PARAM
    objFind.lParam = lParam
    hIndex = SendMessageAny(hWnd, LVM_FINDITEM, - 1 , objFind)

    'Obtain the value of the specified list view item.
    'The objItem.iSubItem member is set to the index
    'of the column that is being retrieved.
    objItem.mask = LVIF_TEXT
    objItem.iSubItem = sColumn
    objItem.pszText = Space$(32)
    objItem.cchTextMax = 32    ' Len(objItem.pszText)

    'get the string at subitem 2
    r = SendMessageAny(hWnd, LVM_GETITEMTEXT, hIndex, objItem)

    'and convert it into a long
    If r >  0  Then
        ListView_GetItemCurrency = CCur(Val(objItem.pszText))    ' êîïåéêè íå ó÷èòûâàþòñÿ!! 12,25 =12,99 !!!
    End If
End Function

Public Function ListView_GetItemPercent(hWnd As Long, lParam As Long) As Long
    Dim r As Long, hIndex As Long, temp As String
    'Convert the input parameter to an index in the list view
    objFind.flags = LVFI_PARAM
    objFind.lParam = lParam
    hIndex = SendMessageAny(hWnd, LVM_FINDITEM, - 1 , objFind)

    'Obtain the value of the specified list view item.
    'The objItem.iSubItem member is set to the index
    'of the column that is being retrieved.
    objItem.mask = LVIF_TEXT
    objItem.iSubItem = sColumn
    objItem.pszText = Space$(32)
    objItem.cchTextMax = Len(objItem.pszText)

    'get the string at subitem  2 
    r = SendMessageAny(hWnd, LVM_GETITEMTEXT, hIndex, objItem)

    'and convert it into a long
    If r >  0  Then
        temp = Left$(objItem.pszText, r)
        If Right$(temp,  1 ) =  "%"  Then
            temp = Left$(temp, Len(temp) -  1 )
        End If
        ListView_GetItemPercent = CSng(temp)
    End If
End Function

Public Sub SortLvwOnDate(lvw As MSComctlLib.ListView, ColIndex As Long)
    If lvw.Sorted = True Then lvw.Sorted = False
    If lvw.SortKey = ColIndex -  1  Then
        If lvw.SortOrder = lvwAscending Then
            lvw.SortOrder = lvwDescending
        Else
            lvw.SortOrder = lvwAscending
        End If
    Else
        lvw.SortKey = ColIndex -  1 
        lvw.SortOrder = lvwAscending
    End If
    mLVSort.sColumn = ColIndex -  1 
    mLVSort.sOrder = (lvw.SortOrder = lvwAscending)
    SendMessageLong lvw.hWnd, LVM_SORTITEMS, lvw.hWnd, AddressOf CompareDates
End Sub

Public Sub SortLvwOnLong(lvw As ListView, ColIndex As Long)
    If lvw.Sorted = True Then lvw.Sorted = False
    If lvw.SortKey = ColIndex -  1  Then
        If lvw.SortOrder = lvwAscending Then
            lvw.SortOrder = lvwDescending
        Else
            lvw.SortOrder = lvwAscending
        End If
    Else
        lvw.SortKey = ColIndex -  1 
        lvw.SortOrder = lvwAscending
    End If
    mLVSort.sColumn = ColIndex -  1 
    mLVSort.sOrder = (lvw.SortOrder = lvwAscending)
    SendMessageLong lvw.hWnd, LVM_SORTITEMS, lvw.hWnd, AddressOf CompareValues
End Sub

Public Sub SortLvwOnCurrency(lvw As ListView, ColIndex As Long)
    If lvw.Sorted = True Then lvw.Sorted = False
    If lvw.SortKey = ColIndex -  1  Then
        If lvw.SortOrder = lvwAscending Then
            lvw.SortOrder = lvwDescending
        Else
            lvw.SortOrder = lvwAscending
        End If
    Else
        lvw.SortKey = ColIndex -  1 
        lvw.SortOrder = lvwAscending
    End If
    mLVSort.sColumn = ColIndex -  1 
    mLVSort.sOrder = (lvw.SortOrder = lvwAscending)
    SendMessageLong lvw.hWnd, LVM_SORTITEMS, lvw.hWnd, AddressOf CompareCurrency
End Sub

Public Sub SortLvwOnPercent(lvw As ListView, ColIndex As Long)
    If lvw.Sorted = True Then lvw.Sorted = False
    If lvw.SortKey = ColIndex -  1  Then
        If lvw.SortOrder = lvwAscending Then
            lvw.SortOrder = lvwDescending
        Else
            lvw.SortOrder = lvwAscending
        End If
    Else
        lvw.SortKey = ColIndex -  1 
        lvw.SortOrder = lvwAscending
    End If
    mLVSort.sColumn = ColIndex -  1 
    mLVSort.sOrder = (lvw.SortOrder = lvwAscending)
    SendMessageLong lvw.hWnd, LVM_SORTITEMS, lvw.hWnd, AddressOf ComparePercent
End Sub



От микрософт...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
''Structures
'
'Public Type POINT
'    x            As Long
'    y            As Long
'End Type
'
'Public Type LV_FINDINFO
'    flags        As Long
'    psz          As String
'    lParam       As Long
'    pt           As POINT
'    vkDirection  As Long
'End Type
'
'Public Type LV_ITEM
'    mask         As Long
'    iItem        As Long
'    iSubItem     As Long
'    State        As Long
'    stateMask    As Long
'    pszText      As Long
'    cchTextMax   As Long
'    iImage       As Long
'    lParam       As Long
'    iIndent      As Long
'End Type
'
''Constants
'Private Const LVFI_PARAM =  1 
'Private Const LVIF_TEXT = &H1
'
'Private Const LVM_FIRST = &H1000
'Private Const LVM_FINDITEM = LVM_FIRST +  13 
'Private Const LVM_GETITEMTEXT = LVM_FIRST + 45
'Public Const LVM_SORTITEMS = LVM_FIRST +  48 
'
''API declarations
'
'Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
 '                                                                ByVal hWnd As Long, _
 '                                                                ByVal wMsg As Long, _
 '                                                                ByVal wParam As Long, _
 '                                                                ByVal lParam As Long) As Long
'
''Module Functions and Procedures
'
''CompareDates: This is the sorting routine that gets passed to the
''ListView control to provide the comparison test for date values.
'
'Public Function CompareDatesAsc(ByVal lngParam1 As Long, _
 '                                ByVal lngParam2 As Long, _
 '                                ByVal hWnd As Long) As Long
'
'    Dim strName1 As String
'    Dim strName2 As String
'    Dim dDate1   As Date
'    Dim dDate2   As Date
'
'    'Obtain the item names and dates corresponding to the
'    'input parameters
'
'    ListView_GetItemData lngParam1, hWnd, strName1, dDate1
'    ListView_GetItemData lngParam2, hWnd, strName2, dDate2
'
'    'Compare the dates
'    'Return 0 ==> Less Than
'    '       1 ==> Equal
'    '       2 ==> Greater Than
'
'    If dDate1 < dDate2 Then
'        CompareDatesAsc =  2 
'    ElseIf dDate1 = dDate2 Then
'        CompareDatesAsc =  1 
'    Else
'        CompareDatesAsc =  0 
'    End If
'
'End Function
'Public Function CompareDatesDesc(ByVal lngParam1 As Long, _
 '                                 ByVal lngParam2 As Long, _
 '                                 ByVal hWnd As Long) As Long
'
'    Dim strName1 As String
'    Dim strName2 As String
'    Dim dDate1   As Date
'    Dim dDate2   As Date
'
'    'Obtain the item names and dates corresponding to the
'    'input parameters
'
'    ListView_GetItemData lngParam1, hWnd, strName1, dDate1
'    ListView_GetItemData lngParam2, hWnd, strName2, dDate2
'
'    'Compare the dates
'    'Return  0  ==> Less Than
'    '        1  ==> Equal
'    '        2  ==> Greater Than
'
'    If dDate1 < dDate2 Then
'        CompareDatesDesc = 0
'    ElseIf dDate1 = dDate2 Then
'        CompareDatesDesc = 1
'    Else
'        CompareDatesDesc = 2
'    End If
'
'End Function            'GetItemData - Given Retrieves
'
'Public Sub ListView_GetItemData(lngParam As Long, _
 '                                hWnd As Long, _
 '                                strName As String, _
 '                                dDate As Date)
'    Dim objFind  As LV_FINDINFO
'    Dim lngIndex As Long
'    Dim objItem  As LV_ITEM
'    Dim baBuffer( 32 ) As Byte
'    Dim lngLength As Long
'
'    '
'    ' Convert the input parameter to an index in the list view
'    '
'    objFind.flags = LVFI_PARAM
'    objFind.lParam = lngParam
'    lngIndex = SendMessage(hWnd, LVM_FINDITEM, -1, VarPtr(objFind))
'
'    '
'    ' Obtain the name of the specified list view item
'    '
'    objItem.mask = LVIF_TEXT
'    objItem.iSubItem =  0 
'    objItem.pszText = VarPtr(baBuffer(0))
'    objItem.cchTextMax = UBound(baBuffer)
'    lngLength = SendMessage(hWnd, LVM_GETITEMTEXT, lngIndex, _
     '                            VarPtr(objItem))
'    strName = Left$(StrConv(baBuffer, vbUnicode), lngLength)
'
'    '
'    ' Obtain the modification date of the specified list view item
'    '
'    objItem.mask = LVIF_TEXT
'    objItem.iSubItem =  1 
'    objItem.pszText = VarPtr(baBuffer(0))
'    objItem.cchTextMax = UBound(baBuffer)
'    lngLength = SendMessage(hWnd, LVM_GETITEMTEXT, lngIndex, _
     '                            VarPtr(objItem))
'    If lngLength > 0 Then
'        dDate = CDate(Left$(StrConv(baBuffer, vbUnicode), lngLength))
'
'        dDate = (Left$(StrConv(baBuffer, vbUnicode), lngLength))
'        '          If dDate = CDate( 0 ) Then dDate =  "31 / 12 / 2100 "
'
'    End If
'
'End Sub
'
''GetListItem - This is a modified version of ListView_GetItemData
'' It takes an index into the list as a parameter and returns
'' the appropriate values in the strName and dDate parameters.
'
'Public Sub ListView_GetListItem(lngIndex As Long, _
 '                                hWnd As Long, _
 '                                strName As String, _
 '                                dDate As Date)
'    Dim objItem  As LV_ITEM
'    Dim baBuffer( 32 ) As Byte
'    Dim lngLength As Long
'
'    '
'    ' Obtain the name of the specified list view item
'    '
'    objItem.mask = LVIF_TEXT
'    objItem.iSubItem =  0 
'    objItem.pszText = VarPtr(baBuffer(0))
'    objItem.cchTextMax = UBound(baBuffer)
'    lngLength = SendMessage(hWnd, LVM_GETITEMTEXT, lngIndex, _
     '                            VarPtr(objItem))
'    strName = Left$(StrConv(baBuffer, vbUnicode), lngLength)
'
'    '
'    ' Obtain the modification date of the specified list view item
'    '
'    objItem.mask = LVIF_TEXT
'    objItem.iSubItem =  1 
'    objItem.pszText = VarPtr(baBuffer(0))
'    objItem.cchTextMax = UBound(baBuffer)
'    lngLength = SendMessage(hWnd, LVM_GETITEMTEXT, lngIndex, _
     '                            VarPtr(objItem))
'    If lngLength > 0 Then
'        dDate = CDate(Left$(StrConv(baBuffer, vbUnicode), lngLength))
'    End If
'
'End Sub
'



Вызов на событие ColumnClick
Код: plaintext
1.
Call SortLvwOnDate(LisctView1, ColumnHeader.Index) - для сортировки дат
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175322
pv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бедный sasha_1.
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175327
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бедный Сенин Виктор, который искал почему этот кусок кода не работает
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175377
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Бедный Сенин Виктор, который искал почему этот кусок кода не работает

Почему не работает - работает :)
Только вариант от микрософт мне не очень понятен из-за обилия API, констант и не документированных функций.
А главное, что не понятно: какого хера надо писать эти функции, когда можно элементарно нарастить функциональность компонента.
З.Ы.
ДАЙте код активации компонента XpressQuantumTreeList - там все это есть...как и многое другое. Что-то кракеры обленились, блин. Уже несколько месяцев прошло в выходом новой версии, а у них тишина :(
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175414
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему работает - не работает :)
От тебя же был топик о том что майкрософтовский пример неправильно сортирует если Null встречается. Так что разбираться таки пришлось.
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32175444
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>От тебя же был топик о том что майкрософтовский пример неправильно сортирует если Null встречается. Так что разбираться таки пришлось.

Блин, да. Точно. Я забыыыылллл :(
Пользуюсь я другим модулем (верхний который) - там проблем нет (еще один пример "крутизны" микрософт - лажовщики херовы - такое ощущение, что шабашку делают - лишь бы отъеб%лись)
Лох - ты спас sasha_1 от катастрофы! Тебе 10 енотов в плюс!

З.Ы.
Да простит меня All. Меню глючит.
Я сегодня (первый раз в жизни) сделал таблицу Континетов. А что - вдруг, что измениться (тьфу-тьфу)
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32177070
dinM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.hiprog.com/access/article.asp?idd=203
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32177097
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>http://www.hiprog.com/access/article.asp?idd=203

лежит dll котроая делает ТОЖЕ САМОЕ что и выше приведенный код.
Насчет наличия быстроты от того что это dll - это не факт
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32193422
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно наткнулся, подумал что может быть интересно
Та же задача, но на .Net
http://www.gotdotnet.ru/default.aspx?s=doc&d_no=5640&c_no=4
P.S. Насколько все-таки красивее на дотнете. Никаких тебе api, никаких недокументированных функций..
P.P.S. После прочтения статьи в очередной раз прикололся над тем, что код на C# и на VB.Net - братья близнецы. Однояйцевые. И зачем только приводят примеры на двух одинаковых языках - загадка...
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32193439
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Лоху

Посмотрел. Опять для дат надо извращаться.
Не все-таки дебилы в микрософте. Нет, чтобы сделать возможным сортировку как по Text так и по Key или Tag.
Было бы просто - отображай дату как хочешь (по Text), а сортируй ее по заполненому опредленным образом tag or Key (формат yyyymmdd сортируется без проблем) - и не надо никакх datacompare. Тоже самое для чисел - отформатировал tag/key как 00000000000 - и сортируй по этому полю а показывай, что есть. (за%бало когда 10 едите впереди )
И надо-то было дабавить возможнось сортировку по еще двум свойствам.
Де-би-лы.
...
Рейтинг: 0 / 0
Сортировка в ListView
    #32193465
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну Виктор, в приведенном примере все извращение с датами заключается в написании 5 строчек кода (в методе ListViewItemComparer.Compare). Туда же точно так же можно запихнуть сортировку по чему угодно.
Все-таки гораздо лучше чем немерянные куски кода для VB6
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сортировка в ListView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]