[已解决]事件模式下,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
这里用到的只是 WM_NOTIFY 系统消息,没有专门针对事件模式的代码,因此这里没有问题。
代码2只是只是将1的部分定义成函数调用,实质没有区别。可能是想修改成供多个listview调用,但listview的句柄却没有传参,呵呵~
所以,你的问题估计出在其它的地方。
虚拟列表的优势是按需显示,每次只渲染滚动到的区域,因此主要是应对数据量很大,大到加载耗时影响用户体验的长列表,如果数据量并不大则没必要。另外有些也可以简单的分页显示,也不需要虚拟。如果你的数据不需要排序之类的,可以分页,就不需要使用虚拟。 本帖最后由 chzj589 于 2021-1-8 08:47 编辑
上面代码在循环模式下能获取数据?你要获取数据库还是列表数据?
chzj589 发表于 2021-1-8 08:40
上面代码在循环模式下能获取数据?你要获取数据库还是列表数据?
大佬,写法一,是参考虚拟列表的例子改的,原本是sqlite,我改成mysql 是可以正常获取的。写法二,我是参考某大佬的例子改的,正常情况获取没问题,但是改成虚表的方式好像就不行。。小弟对事件模式还是一知半解。
因为之前的写的软件,采用写法二,感觉会节省很多代码,但是现在想提升下加载速度,就考虑虚表。。。刚学习,还是有些不明白,调试了好几天还是木办法。。
我这边主要从mysql数据库获取数据,然后显示在listview,一步一步测试。有看过您之前写的分页,等这个加载问题解决了,再慢慢研究分页~~ afan 发表于 2021-1-8 11:55
这里用到的只是 WM_NOTIFY 系统消息,没有专门针对事件模式的代码,因此这里没有问题。
代码2只是只是将1 ...
好的,感谢A大的解惑跟建议,万分感谢!!!:face (1):
页:
[1]