找回密码
 加入
搜索
查看: 1677|回复: 5

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

[复制链接]
发表于 2021-1-8 01:21:34 | 显示全部楼层 |阅读模式
本帖最后由 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




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

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

点评

A版解答就是专业  发表于 2021-1-9 19:33

评分

参与人数 1金钱 +40 收起 理由
anythinging + 40

查看全部评分

发表于 2021-1-8 08:40:12 | 显示全部楼层
本帖最后由 chzj589 于 2021-1-8 08:47 编辑

上面代码在循环模式下能获取数据?你要获取数据库还是列表数据?
 楼主| 发表于 2021-1-8 09:28:33 | 显示全部楼层
chzj589 发表于 2021-1-8 08:40
上面代码在循环模式下能获取数据?你要获取数据库还是列表数据?

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

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


我这边主要从mysql数据库获取数据,然后显示在listview,一步一步测试。有看过您之前写的分页,等这个加载问题解决了,再慢慢研究分页~~
 楼主| 发表于 2021-1-8 13:51:17 | 显示全部楼层
afan 发表于 2021-1-8 11:55
这里用到的只是 WM_NOTIFY 系统消息,没有专门针对事件模式的代码,因此这里没有问题。
代码2只是只是将1 ...

好的,感谢A大的解惑跟建议,万分感谢!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-17 18:11 , Processed in 0.082057 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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