找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2605|回复: 3

【VisualFreeBasic】ListView控件点击列名排序

[复制链接]
发表于 2018-2-24 22:46:32 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
1519482489576091.jpg
ListView控件,列表名点击一下,自动排序此列,同时显示小3角,再点一次自动切换正序与倒序,  
啥都不说,直接上代码,复制去,调用即可。  
使用例题
  1. '用法:在列单击事件中加入下面内容即可
  2. 'Function FORM10_LISTVIEW2_LVN_COLUMNCLICK ( _
  3. '                                          ControlIndex  As Long,            _  ' 在控件数组索引
  4. '                                          hWndForm      As DWord,           _  ' 窗体的句柄
  5. '                                          hWndControl   As DWord,           _  ' 控件的句柄
  6. '                                          ByVal lpNMV   As NM_LISTVIEW Ptr  _  ' 指针指向 NM_LISTVIEW
  7. '                                          ) As Long
  8. '    ' 排序 ListView
  9. '    JPL_ListView_ColumnToSort(hWndControl, lpNMV)
  10. 'End Function
复制代码

排序源码:

  1. ' 要能够使用 ListView_ColumnToSort() 函数的结构
  2. Type JPL_ListView_ComparePar
  3.     hWndControl As HWnd
  4.     Column      As UInteger
  5.     SortOrder   As UInteger
  6. End Type
  7. ' 常数
  8. Const SO_NONE       = 0
  9. Const SO_ASCENDING  = 1
  10. Const SO_DESCENDING = 2
  11. '--------------------------------------------------------------------------------
  12. Sub JPL_ListView_DrawHeaderArrow(hWndControl As HWnd , ByVal pColumn As Long, ByVal pSortOrder As Long)
  13.     Dim hHeader As HWnd  
  14.     Dim HDI As HD_ITEM
  15.     hHeader =Cast(HWnd, SendMessage(hWndControl, LVM_GetHeader, 0, 0) )   
  16.     HDI.mask = HDI_FORMAT
  17.     Header_GetItem(hHeader, pColumn, @HDI)
  18.     ' 取决于排序次序 (SO_NONE, SO_ASCENDING, SO_DESCENDING)
  19.     Select Case pSortOrder
  20.         Case SO_NONE
  21.             ' 删除向下箭头或向上箭头
  22.             HDI.fmt = HDI.fmt And Not (HDF_SORTDOWN Or HDF_SORTUP)
  23.         Case SO_ASCENDING
  24.             ' 这一项目上绘制一个向上箭头
  25.             HDI.fmt = HDI.fmt And Not HDF_SORTDOWN
  26.             HDI.fmt = HDI.fmt Or      HDF_SORTUP                       
  27.         Case SO_DESCENDING
  28.             ' 在这个项目上绘制一个向下箭头
  29.             HDI.fmt = HDI.fmt And Not HDF_SORTUP
  30.             HDI.fmt = HDI.fmt Or      HDF_SORTDOWN                             
  31.     End Select      
  32.     Header_SetItem(hHeader, pColumn, @HDI)
  33. End Sub
  34. '--------------------------------------------------------------------------------
  35. Function JPL_ListView_CompareFunc ( ByVal index1 As Long, _
  36.                                   ByVal index2 As Long, _
  37.                                   ByVal lpListView_ComparePar As JPL_ListView_ComparePar Ptr _
  38.                                   )  As Long
  39.   Dim zItem1    As String
  40.   Dim zItem2    As String
  41.   Dim lNumeric1 As Double
  42.   Dim lNumeric2 As Double
  43.   Dim lReturn   As Integer
  44.   ' 从列表视图中获取价值
  45.   zItem1 =FF_ListView_GetItemText(lpListView_ComparePar->hWndControl, index1, lpListView_ComparePar->Column)
  46.   zItem2 =FF_ListView_GetItemText(lpListView_ComparePar->hWndControl, index2, lpListView_ComparePar->Column)
  47.   '--------------------------------------------------------------------------------------------
  48.   ' 确定哪种类型的排序 (日期、 数字或字符) 根据列点击
  49.   '--------------------------------------------------------------------------------------------
  50.   ' 日期
  51. '  If IsDate(zItem1) And IsDate(zItem2) Then '速度太慢,放弃
  52. '      lNumeric1 = DateValue(zItem1)
  53. '      lNumeric2 = DateValue(zItem2)
  54. '      If lNumeric1 < lNumeric2 Then lReturn = -1 Else If lNumeric1 > lNumeric2 Then lReturn = +1 Else lReturn = 0
  55. '  Else
  56.       ' 数字
  57.       If JPL_IsNumeric(zItem1) And JPL_IsNumeric(zItem2) Then
  58.           zItem1=FF_Remove (zItem1," ")   ' Remove Any numeric 1000's space
  59.           zItem2=FF_Remove (zItem2," ")
  60.           lNumeric1 = Val(zItem1)
  61.           lNumeric2 = Val(zItem2)
  62.           If lNumeric1 < lNumeric2 Then lReturn = -1 Else If lNumeric1 > lNumeric2 Then lReturn = +1 Else lReturn = 0
  63.       Else
  64.           ' 字符
  65.           zItem1 = LTrim(zItem1)
  66.           zItem2 = LTrim( zItem2 )
  67.           lReturn = Lstrcmpi(zItem1, zItem2)
  68.       End If
  69. '  End If
  70.   If lpListView_ComparePar->SortOrder = SO_ASCENDING Then Function = lReturn Else Function = -lReturn
  71. End Function
  72. '--------------------------------------------------------------------------------
  73. Sub JPL_ListView_ColumnToSort(hWndControl As HWnd , ByVal lpNMV As NM_LISTVIEW Ptr)
  74.     ' 为比较结构                                                               
  75.     Dim lListView_ComparePar      As JPL_ListView_ComparePar
  76.     ' 局部变量                                                               
  77.     Dim lListViewSortOrder        As Long
  78.     Dim lListViewLastSortedColumn As Long
  79.     ' 加载列表视图的当前值   
  80.     lListViewSortOrder        = ValInt(FF_Control_GetTag (hWndControl))
  81.     lListViewLastSortedColumn = ValInt(FF_Control_GetTag2(hWndControl))                                                      
  82.     ' 若要反转排序顺序
  83.     If lListViewSortOrder = SO_ASCENDING Then lListViewSortOrder = SO_DESCENDING Else lListViewSortOrder = SO_ASCENDING
  84.     ' 遏止以前排序的列上的箭头 (包含零被单击的基于的列号)
  85.     If lListViewLastSortedColumn <> - 1 And _
  86.        lListViewLastSortedColumn <> lpNMV->iSubItem Then  JPL_ListView_DrawHeaderArrow(hWndControl, lListViewLastSortedColumn, SO_NONE )
  87.     ' 排序列表视图中选择的列
  88.     lListView_ComparePar.hWndControl = hWndControl
  89.     lListView_ComparePar.Column      = lpNMV->iSubItem
  90.     lListView_ComparePar.SortOrder   = lListViewSortOrder  
  91.      SendMessage( hWndControl , LVM_SORTITEMSEX ,Cast(wParam, @lListView_ComparePar ),Cast(lParam,@JPL_ListView_CompareFunc ) )                                             
  92.     ' 向下箭头或向上箭头上绘制这一项目。
  93.     JPL_ListView_DrawHeaderArrow(hWndControl, lpNMV->iSubItem, lListViewSortOrder)
  94.     ' 要保存的已排序的列号
  95.     lListViewLastSortedColumn = lpNMV->iSubItem
  96.     ' 保存对此列表视图的最新设置
  97.     FF_Control_SetTag(hWndControl , Str(lListViewSortOrder))
  98.     FF_Control_SetTag2(hWndControl, Str(lListViewLastSortedColumn))   

  99. End Sub
  100. '--------------------------------------------------------------------------------
  101. Function JPL_IsNumeric(pValue As String ) As Long
  102.     If UCase(Left(pValue,2))="&H" Then
  103.         If FF_Verify (1,Mid(pValue,3), "0123456789") = 0 Then Function = True Else Function = False
  104.     Else
  105.         If FF_Verify (1,pValue, "0123456789.,'+-") = 0 Then Function = True Else Function = False
  106.     End If   
  107. End Function
复制代码

回复

使用道具 举报

 楼主| 发表于 2018-2-24 22:48:52 | 显示全部楼层
看官们是不是觉得和VB代码很像,但的确不是VB,而好VFB,VB想用?但需要改造,只是太麻烦了。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-2-24 23:16:19 | 显示全部楼层
纠正错误:
在最后函数里,有16进制判断,
"0123456789" 应该写:"0123456789ABCDEF"
但还是存在大小写问题的,假如16进制用小写字母,就有问题。如何做,不用我说了吧。
回复 赞! 靠!

使用道具 举报

发表于 2022-5-17 11:28:47 | 显示全部楼层

你们懂的,楼主好人
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 18:08 , Processed in 0.038525 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表