xyhqqaa 发表于 2021-1-8 01:21:34

[已解决]事件模式下,listview虚拟列表无法获取数据

本帖最后由 xyhqqaa 于 2021-1-8 13:51 编辑

因为是链接到mysql,所以这边提供数据估计也作用不大,主要问题是事件模式的写法,小弟也是参考其他大佬的例子学习的,最近学习虚拟列表,想提高下速度。但是无奈一直卡了好几天不求甚解。事情模式俺也是一知半解,特来请教懂的大佬。

写法一,可以链接到mysql获取到数据,参考源自https://www.autoitx.com/forum.ph ... 9%C4%E2%C1%D0%B1%ED

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
      Local $tNMTOOLBAR = DllStructCreate($tagNMTOOLBAR, $ilParam)
      Local $hWndFrom = HWnd(DllStructGetData($tNMTOOLBAR, "hWndFrom"))
      Local $iItem = DllStructGetData($tNMTOOLBAR, "iItem")
      Local $iIDFrom = DllStructGetData($tNMTOOLBAR, "IDFrom")
      Local $iCode = DllStructGetData($tNMTOOLBAR, "Code")
      Switch $iIDFrom
                Case $hListView
                        Switch $iCode
                              Case $LVN_GETDISPINFOA, $LVN_GETDISPINFOW ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177
                                        If IsArray($aData) Then
                                                $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                                                $iItem = DllStructGetData($tInfo, "Item")
                                                $iSubItem = DllStructGetData($tInfo, "SubItem")
                                                If $iSubItem = 0 Then DllStructSetData($tInfo, "Image", 0)
                                                DllStructSetData($tText, "Text", $aData[$iItem][$iSubItem]);
                                                DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));
                                        EndIf
                        EndSwitch
      EndSwitch
EndFunc   ;==>WM_NOTIFY



写法二,无法获取数据。该写法源自某大佬的作品,但是不清楚,两者是因为啥区别造成的。
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
      Local $tNMTOOLBAR = DllStructCreate($tagNMTOOLBAR, $ilParam)
      Local $hWndFrom = HWnd(DllStructGetData($tNMTOOLBAR, "hWndFrom"))
      Local $iItem = DllStructGetData($tNMTOOLBAR, "iItem")
      Local $iIDFrom = DllStructGetData($tNMTOOLBAR, "IDFrom")
      Local $iCode = DllStructGetData($tNMTOOLBAR, "Code")
      Switch $hWnd
                Case $hListView
                        tool_ipmanagerEvent_NOTIFY($hWnd, $iIDFrom, $iCode, $ilParam)
      EndSwitch
      Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func tool_ipmanagerEvent_NOTIFY($hWnd, $iControl, $iMsg, $ilParam)
      Local $Indexlistview = _GUICtrlListView_GetSelectedIndices($hListView)
      Local $listruninfo = _GUICtrlListView_GetItemText($hListView, Number($Indexlistview), 0)
      Local $hWndListView1 = GUICtrlGetHandle($hListView)
      Switch $iControl
                Case $hListView ;listview
                        Switch $iMsg
                              Case $LVN_GETDISPINFOA, $LVN_GETDISPINFOW ;请求显示数据
                                        If IsArray($array) Then
                                                Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                                                Local $iItem = DllStructGetData($tInfo, "Item")
                                                Local $iSubItem = DllStructGetData($tInfo, "SubItem")
                                                If $iSubItem = 0 Then DllStructSetData($tInfo, "Image", 0)
                                                DllStructSetData($tText, "Text", $array[$iItem][$iSubItem])
                                                DllStructSetData($tInfo, "Text", DllStructGetPtr($tText))
                                        EndIf
                        EndSwitch
      EndSwitch
EndFunc   ;==>tool_ipmanagerEvent_NOTIFY




afan 发表于 2021-1-8 11:55:57

这里用到的只是 WM_NOTIFY 系统消息,没有专门针对事件模式的代码,因此这里没有问题。
代码2只是只是将1的部分定义成函数调用,实质没有区别。可能是想修改成供多个listview调用,但listview的句柄却没有传参,呵呵~
所以,你的问题估计出在其它的地方。

虚拟列表的优势是按需显示,每次只渲染滚动到的区域,因此主要是应对数据量很大,大到加载耗时影响用户体验的长列表,如果数据量并不大则没必要。另外有些也可以简单的分页显示,也不需要虚拟。如果你的数据不需要排序之类的,可以分页,就不需要使用虚拟。

chzj589 发表于 2021-1-8 08:40:12

本帖最后由 chzj589 于 2021-1-8 08:47 编辑

上面代码在循环模式下能获取数据?你要获取数据库还是列表数据?

xyhqqaa 发表于 2021-1-8 09:28:33

chzj589 发表于 2021-1-8 08:40
上面代码在循环模式下能获取数据?你要获取数据库还是列表数据?

大佬,写法一,是参考虚拟列表的例子改的,原本是sqlite,我改成mysql 是可以正常获取的。写法二,我是参考某大佬的例子改的,正常情况获取没问题,但是改成虚表的方式好像就不行。。小弟对事件模式还是一知半解。

因为之前的写的软件,采用写法二,感觉会节省很多代码,但是现在想提升下加载速度,就考虑虚表。。。刚学习,还是有些不明白,调试了好几天还是木办法。。


我这边主要从mysql数据库获取数据,然后显示在listview,一步一步测试。有看过您之前写的分页,等这个加载问题解决了,再慢慢研究分页~~

xyhqqaa 发表于 2021-1-8 13:51:17

afan 发表于 2021-1-8 11:55
这里用到的只是 WM_NOTIFY 系统消息,没有专门针对事件模式的代码,因此这里没有问题。
代码2只是只是将1 ...

好的,感谢A大的解惑跟建议,万分感谢!!!:face (1):
页: [1]
查看完整版本: [已解决]事件模式下,listview虚拟列表无法获取数据