找回密码
 加入
搜索
查看: 21764|回复: 61

[AU3基础] [已解决]恳请指点--终于参照版主大人的帖子实现了ini文件内容的读取,但遇到了问题

[复制链接]
发表于 2020-11-27 21:08:29 | 显示全部楼层 |阅读模式
本帖最后由 anythinging 于 2020-12-13 14:42 编辑

终于参照版主大人的几个教程实现了ini文件内容的读取,但遇到了问题,就是左键点击1,2列的时候,位置和内容保存都存在问题,请各位大神指点!谢谢!感谢chzj589的指点
终于可以进入下一个阶段,保存表格内容至ini文件了。求例子经版主指点,已经改进ini格式,代码随同更新2020-11-28 21:43
感谢版主和chzj589的指点,总算实现了大部份功能。
完成如下:
1、实现了对指定指定字段跳过读取、保存内容。
2、解决了序号跳过字段后左侧序号缺失的问题
3、增加了新增条目

遇到的问题:
1、原本是保存的时候调用刷新,但发现有点小问题,没解决就单独做了个刷新,请问这样刷新对吗?(遇到的问题是如果下拉列表没确认修改完成,保存和刷新的时候那个下拉列表还一直存在)
2、借用了A版大人的回车功能,直接闪退,解决不了
3、可能用户名的修改处,使用_GUICtrlEdit_Create 可能更适合,版主能否给个_GUICtrlEdit_Create 和input的例子。
#include <GUIListView.au3>
#include <GuiMenu.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <ListViewConstants.au3>



Opt('GUIOnEventMode', 1)

Global $hGui, $hListView, $hMenu, $aItem, $iCombo
Global $iListView
Global $sDefCombo1 = '111|222', $sDefCombo2 = 'AAA|ZZZ' ,$sDefCombo3 = '12345|00000'
$dir = @ScriptDir&"\test1.ini"
Global $num

Dim $hGui = GUICreate('')
                GUISetOnEvent(-3, '_Exit')

$Save=GUICtrlCreateButton('保  存',200,300,80,30)
GUICtrlSetOnEvent($Save, "_save")
$Add=GUICtrlCreateButton('添  加',100,300,80,30)
GUICtrlSetOnEvent($Add, "_Add")
$Ref=GUICtrlCreateButton('刷  新',10,300,80,30)
GUICtrlSetOnEvent($Ref, "_Ref")


_Read()

Func _Read()        ;读取ini内容,创建List
        Dim $iCombo = GUICtrlCreateCombo('', -100, -100)

        Global $iListView = GUICtrlCreateListView('序号|用户名称|密码|性别|修改密码|状态', 2, 2, 386, 258)
        Dim $hListView = GUICtrlGetHandle(-1)

        _GUICtrlListView_SetExtendedListViewStyle($iListView, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT)



        Global $zd = IniReadSectionNames($dir)        ;获取字段数量——读取ini文件中的字段,并返回1维数组变量,$zd[0]是字段总数
        If Not @error Then

                $skipnum = 0 ;跳过的字段数

                For $i = 1 to $zd[0] ;从1开始一直到$zd[0](总数),读取出每个字段名

                        If $zd[$i] <> 'set' and $zd[$i] <> 'admin' Then ;此处为不创建字段信息为set的内容
                                $num=$i-$skipnum
                                ;MsgBox(262144,'正常,序号为',$num)
                        Else
                                $skipnum = $skipnum +1
                                ;MsgBox(262144,'跳过的数量为',$skipnum)
                        EndIf

                        If $zd[$i] <> 'set' and $zd[$i] <> 'admin' Then ;此处为不创建字段信息为set的内容

                                ;读取用户名
                                ;$Lable=IniRead($dir,$zd[$i],'UserName','Error')
                                $Lable=$zd[$i]

                                ;读取创建密码
                                $Password=IniRead($dir,$zd[$i],'PassWord','Error')

                                ;读取性别
                                $UserMode=IniRead($dir,$zd[$i],'UserMode','Error')

                                If $UserMode = '1' Then
                                        $Mode='男'
                                Else
                                        $Mode='女'
                                EndIf

                                $PwMode=IniRead($dir,$zd[$i],'PwMode','Error')

                                If $PwMode = '1' Then;
                                        $PW='允许'
                                Else
                                        $PW='禁止'
                                EndIf

                                ;自动创建
                                GUICtrlCreateListViewItem($num&'|'&$Lable&'|'&$Password&'|'&$Mode&'|'&$PW&'|保留', $iListView)


                        EndIf
                Next

                GUISetState()

                Local $id1 = GUICtrlCreateDummy()
                GUICtrlSetOnEvent(-1, '__UdpData')
                Local $aAccelKeys[1][2] = [['{Enter}', $id1]]
        GUISetAccelerators($aAccelKeys)


                GUIRegisterMsg(0x004E, '_WM_NOTIFY')        ;$WM_NOTIFY = 0x004E
        Else
                MsgBox(262144,'','配置文件读取错误',1)
                Exit
        EndIf
EndFunc

Func _Add()        ;添加新用户
        $num=$num+1
        GUICtrlCreateListViewItem('|新用户|123456|男|允许|保留', $iListView)
EndFunc

Func _save()        ;保存至INI文件
                ;删除 除admin set 的所有字段
                $zd = IniReadSectionNames($dir)        ;获取字段数量——读取ini文件中的字段,并返回1维数组变量,$zd[0]是字段总数
                For $i = 1 to $zd[0] ;从1开始一直到$zd[0],读取出每个字段 的关键字和值
                        If $zd[$i] <> 'set' and $zd[$i] <> 'admin' Then ;此处为不创建字段信息为set的内容
                                IniDelete($dir,$zd[$i])
                        EndIf
                Next
                ;MsgBox(262144,'','检查是否清理完成非admin和set')

;获取表格总行数
        Local $lineAll = _GUICtrlListView_GetItemCount($iListView);取得数组的行数


        For $ID = 0 To $lineAll - 1
                $row = _GUICtrlListView_GetItemTextArray($iListview, $ID)        ;获取全部文本和列数,从第一列开始
                $UserName=$row[2]
                $Password=$row[3]
                $UserMode=$row[4]
                $PwMode  =$row[5]
                $DEL           =$row[6]

                If $DEL = '保留' Then
                        ;如果为保留,则写入ini
                        If $UserName <> '' Then                IniWrite($dir, $UserName,'PassWord',$Password)

                        If $UserMode = '男' Then
                                IniWrite($dir, $UserName,'UserMode',1)
                        Else
                                IniWrite($dir, $UserName,'UserMode',0)
                        EndIf

                        If $PwMode = '允许' Then
                                IniWrite($dir, $UserName,'PwMode',1)
                        Else
                                IniWrite($dir, $UserName,'PwMode',0)
                        EndIf
                EndIf


        Next
;~ _Ref()        ;刷新
EndFunc

Func _Ref()        ;刷新
        GUICtrlDelete($iListView)
        _Read()
EndFunc

Func __UdpData()
;~
                If Not IsArray($aItem) Then Return
        Local $sRd = GUICtrlRead($aItem[2]), $sData = ''
        _GUICtrlListView_SetItemText($hListView, $aItem[0], $sRd, $aItem[1])

        GUICtrlSetPos($aItem[2], -1000, -100)
        Dim $aItem = 0
EndFunc   ;==>__UdpData






While 1

                Sleep(1000)

WEnd



Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)


        Switch DllStructGetData($tNMHDR, 'hWndFrom')
                Case $hListView
                        Switch DllStructGetData($tNMHDR, 'Code')

                                Case -2 ;$NM_CLICK
                                        Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $index = DllStructGetData($tInfo, 'Index')
                                        Local $SubItem = DllStructGetData($tInfo, 'SubItem')

                                        If IsArray($aItem) Then
                                                _GUICtrlListView_SetItemText($hListView, $aItem[0], GUICtrlRead($iCombo), $aItem[1])
                                                GUICtrlSetPos($iCombo, -1000, -100)
                                                Dim $aItem = 0
                                        EndIf


                                                                                ;弹出菜单

                                                                                If $index < 0 Then Return 'GUI_RUNDEFMSG'

                                                                                If $SubItem = 3 Then

                                                                                                Local $context = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
                                                                                                Dim $hMenu = GUICtrlGetHandle($context)
                                                                                                GUICtrlCreateMenuItem('男',$context)
                                                                                                GUICtrlCreateMenuItem('女',$context)

                                                                                                Local $iid = _GUICtrlMenu_TrackPopupMenu($hMenu, $hGui, -1, -1, 1, 1, 2)
                                                If $iid Then _GUICtrlListView_SetItemText($hListView, $index, _GUICtrlMenu_GetItemText($hMenu, $iid, False), 3)
                                                                                EndIf

                                                                                If $SubItem = 4 Then

                                                                                                Local $context = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
                                                                                                Dim $hMenu = GUICtrlGetHandle($context)
                                                                                                GUICtrlCreateMenuItem('允许',$context)
                                                                                                GUICtrlCreateMenuItem('禁止',$context)

                                                                                                Local $iid = _GUICtrlMenu_TrackPopupMenu($hMenu, $hGui, -1, -1, 1, 1, 2)
                                                If $iid Then _GUICtrlListView_SetItemText($hListView, $index, _GUICtrlMenu_GetItemText($hMenu, $iid, False), 4)
                                                                                EndIf

                                                                                If $SubItem = 5 Then

                                                                                        Local $sName = _GUICtrlListView_GetItemText($hListView, $Index)
                                                                                        If MsgBox(48 + 4, '确认删除', '是否删除用户 "' & $sName & '" ?', 0, $hGUI) = 6 Then
                                                                                                        _GUICtrlListView_DeleteItem($hListView, $Index)
                                                                                                        IniDelete($dir, $sName)
                                                                                        EndIf

                                                                        EndIf




                                        ;修改框

                                                                                If Not StringRegExp($SubItem, "^(1|2)[        DISCUZ_CODE_0        ]quot;) Then Return 'GUI_RUNDEFMSG'


                                        Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $index, $SubItem)
                                        Dim $aItem[2] = [$index, $SubItem]
                                        Local $sDef = $sDefCombo1


                                        If $SubItem = 1 Then $sDef = $sDefCombo2
                                        Local $sData = _GUICtrlListView_GetItemText($hListView, $index, $SubItem)
                                        ;GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 32, $aRect[2] - $aRect[0])
                                        GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 4, $aRect[2] - $aRect[0])
                                                                                GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
                                        GUICtrlSetState($iCombo, 256)

                                        If $SubItem = 2 Then $sDef = $sDefCombo3
                                        Local $sData = _GUICtrlListView_GetItemText($hListView, $index, $SubItem)
                                        ;GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 32, $aRect[2] - $aRect[0])
                                                                                GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 4, $aRect[2] - $aRect[0])
                                        GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
                                        GUICtrlSetState($iCombo, 256)

                                                                Case -5 ;$NM_CLICK

                                                                Case $NM_DBLCLK ; 双击


                        EndSwitch
        EndSwitch
EndFunc   ;==>_WM_NOTIFY



Func _Exit()
        Exit
EndFunc   ;==>_Exit


发表于 2020-12-26 22:34:11 | 显示全部楼层
anythinging 发表于 2020-12-26 22:23
A版,请教下,关于回车确认的功能,如果Opt('GUIOnEventMode', 0)的话,如何生效?
我现在只会用了笨方 ...

你这种方式已经是很简单的了。如果你习惯都采用消息模式那就将注册快捷键那段中的
Local $id1 = GUICtrlCreateDummy() 改为全局变量,即:
在上面声明 Global $id1
然后 Local $id1 = GUICtrlCreateDummy() 改为 Dim $id1 = GUICtrlCreateDummy()
最后你的消息循环中GUIGetMsg() 可以
Case $id1
__UdpData()

评分

参与人数 1金钱 +40 收起 理由
anythinging + 40 很给力!

查看全部评分

发表于 2020-12-7 22:14:13 | 显示全部楼层
本帖最后由 afan 于 2020-12-7 22:16 编辑

;GUICtrlSetPos($iCombo        ,矩形左上角 X 坐标+4         ,矩形左上角 Y 坐标+2         ,矩形左上角 Y 坐标+22 ,矩形右下角 X 坐标 - 矩形左上角 X 坐标)
以上红色部分是多余的。

GUICtrlSetData 帮助文档内容:
对于 Combo(组合框)或 List(列表)控件 :
如果"数据"为已存在的条目, 则将它设置为默认.
如果"数据"以 GUIDataSeparatorChar 开始或空串 "", 则前一条列表被销毁. 尾随的 GUIDataSeparatorChar 将被忽略.

GUIDataSeparatorChar 定义 GUICtrlSetData() 函数多个数据间的分隔字符. 默认分隔字符为 '|'.
也就是说以|开头设置数据可以覆写的形式更新下拉列表,否则会以追加的形式添加到下拉列表中,那样重复的内容就不知道有多少了。

评分

参与人数 1金钱 +40 收起 理由
anythinging + 40 赞一个!

查看全部评分

发表于 2020-11-28 22:19:14 | 显示全部楼层
本帖最后由 afan 于 2020-11-28 22:20 编辑

不需要创建ini文件,程序会自动生成
双击第2列可编辑输入框;双击第3列可选择下拉框;单击第4列可删除;任意处单击或回车可确认修改,写入ini
#include <GUIListView.au3>

Global $fIni = 'test.ini'
If Not FileExists($fIni) Then        ;---- 没有测试文件就自动生成一个
        Local $sData = '', $aN[6] = ['张', '李', '王', '赵', '钱', '孙'], $aAdm[2] = ['是', '否']
        For $ii = 1 To 100
                $sData &= '[' & $aN[Random(0, 5, 1)] & $ii & ']' & @CRLF & 'PassWord=' & Random(111111, 999999, 1) & @CRLF & 'UserMode=' & $aAdm[Random(0, 1, 1)] & @CRLF
        Next
        Local $hFO = FileOpen($fIni, 512 + 10)
        FileWrite($hFO, $sData)
        FileClose($hFO)
EndIf

Opt('GUIOnEventMode', 1)
Global $hGUI, $ListView1, $hListView1, $aItem, $iInput, $iComb
_GUICreate()
While 1
        Sleep(1000)
WEnd

Func _GUICreate()
        Dim $hGUI = GUICreate('Ini 数据管理', 300)
                GUISetOnEvent(-3, '_Exit')
        Dim $iInput = GUICtrlCreateInput('', -100, -100)
        Dim $iComb = GUICtrlCreateCombo('', -100, -100, -1, -1, 3) ; $CBS_DROPDOWNLIST=0x0003
        GUICtrlSetData(-1, '是|否')
        Dim $ListView1 = GUICtrlCreateListView('用户名 |密码 |管理员权限|管理', 2, 20, 296, 350)
        Dim $hListView1 = GUICtrlGetHandle(-1)
        GUICtrlSetFont(-1, 11, 400, 0, '微软雅黑')
        _LoadIni2LVW()
        GUISetState()
        Local $id1 = GUICtrlCreateDummy()
                GUICtrlSetOnEvent(-1, '__UdpData')
        Local $aAccelKeys[1][2] = [['{Enter}', $id1]]
        GUISetAccelerators($aAccelKeys)
        GUIRegisterMsg(0x004E, '_WM_NOTIFY') ;$WM_NOTIFY = 0x004E
EndFunc   ;==>_GUICreate
Func _LoadIni2LVW()
        Local $aIni = IniReadSectionNames($fIni)
        If @error Then Return SetError(1, 0, 0)
        Local $ii, $sPassWord, $sUserMode
        For $ii = 1 To $aIni[0]
                $sPassWord = IniRead($fIni, $aIni[$ii], 'PassWord', '')
                $sUserMode = IniRead($fIni, $aIni[$ii], 'UserMode', '否')
                GUICtrlCreateListViewItem(StringFormat('%s|%s|%s|删除', $aIni[$ii], $sPassWord, $sUserMode), $ListView1)
        Next
EndFunc   ;==>_LoadIni2LVW
Func __UdpData()
        If Not IsArray($aItem) Then Return
        Local $sRd = GUICtrlRead($aItem[2]), $sData = ''
        _GUICtrlListView_SetItemText($hListView1, $aItem[0], $sRd, $aItem[1])
        Switch $aItem[1]
                Case 1
                        IniWrite($fIni, _GUICtrlListView_GetItemText($hListView1, $aItem[0]), 'PassWord', $sRd)
                Case 2
                        IniWrite($fIni, _GUICtrlListView_GetItemText($hListView1, $aItem[0]), 'UserMode', $sRd)
        EndSwitch
        GUICtrlSetPos($aItem[2], -1000, -100)
        Dim $aItem = 0
EndFunc   ;==>__UdpData
Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        If HWnd(DllStructGetData($tNMHDR, 'hWndFrom')) <> $hListView1 Then Return 'GUI_RUNDEFMSG'
        Switch DllStructGetData($tNMHDR, 'Code')
                Case -2 ;$NM_CLICK = -2
                        If IsArray($aItem) Then
                                __UdpData()
                        Else
                                Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                Local $iIndex = DllStructGetData($tInfo, 'Index')
                                Local $iSub = DllStructGetData($tInfo, 'SubItem')
                                If $iSub = 3 Then
                                        Local $sName = _GUICtrlListView_GetItemText($hListView1, $iIndex)
                                        If MsgBox(48 + 4, '确认删除', '是否删除用户 "' & $sName & '" ?', 0, $hGUI) = 6 Then
                                                _GUICtrlListView_DeleteItem($hListView1, $iIndex)
                                                IniDelete($fIni, $sName)
                                        EndIf
                                EndIf
                        EndIf
                Case -3 ;$NM_DBLCLK = -3
                        Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                        Local $iIndex = DllStructGetData($tInfo, 'Index')
                        Local $iSub = DllStructGetData($tInfo, 'SubItem')
                        Dim $aItem = 0
                        If $iSub <> 1 And $iSub <> 2 Then Return 'GUI_RUNDEFMSG'
                        Local $aRect = _GUICtrlListView_GetSubItemRect($hListView1, $iIndex, $iSub)
                        Local $sData = _GUICtrlListView_GetItemText($hListView1, $iIndex, $iSub)
                        If $iSub = 1 Then
                                Dim $aItem[3] = [$iIndex, $iSub, $iInput]
                        Else
                                Dim $aItem[3] = [$iIndex, $iSub, $iComb]
                        EndIf
                        GUICtrlSetData($aItem[2], $sData)
                        GUICtrlSetPos($aItem[2], $aRect[0] + 4, $aRect[1] + 22, $aRect[2] - $aRect[0])
                        GUICtrlSetState($aItem[2], 256)
        EndSwitch
EndFunc   ;==>_WM_NOTIFY
Func _Exit()
        Exit
EndFunc   ;==>_Exit

评分

参与人数 2金钱 +80 收起 理由
anythinging + 40 很给力!
floor6ggg + 40 A神100行的代码,玩出了这么多花样!!!….

查看全部评分

发表于 2020-11-28 19:32:51 | 显示全部楼层
anythinging 发表于 2020-11-28 19:02
就是这个样子,可以修改,位置也对了,但不能填入

GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 2, $aRect[2] - $aRect[0])
两个座标要一致
Local $ListView1 = GUICtrlCreateListView('', 2,2, 396, 258)
##################
GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] +32, $aRect[2] - $aRect[0])
两个座标要一致
Local $ListView1 = GUICtrlCreateListView('', 2,32, 396, 258)
发表于 2020-11-27 22:01:24 | 显示全部楼层
修改座标就可以了
原:
GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 32, $aRect[2] - $aRect[0])
修改为:
GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 4, $aRect[2] - $aRect[0])
 楼主| 发表于 2020-11-27 21:09:16 | 显示全部楼层
ini文件内容如下
[001]
UserName=王王
PassWord=123456
PwMode=1
UserMode=1


[002]
UserName=王1
PassWord=66666
PwMode=0
UserMode=1

[003]
UserName=王2
PassWord=123456
PwMode=0
UserMode=0


 楼主| 发表于 2020-11-27 21:10:53 | 显示全部楼层
我是把版主大人的2个教程合到一个代码里,现在遇到了编辑框不正常。
发表于 2020-11-28 11:08:14 | 显示全部楼层
chzj589 发表于 2020-11-27 22:01
修改座标就可以了
原:
GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 32, $aRect[2] - $aRect[0]) ...


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-11-28 14:02:42 | 显示全部楼层
位置和内容保存都存在问题,没认真看你的问题,
1:位置问题
修改座标:Local $ListView1 = GUICtrlCreateListView('', 2, 28, 396, 258)
2:内容保存问题
Case -2 ;$NM_CLICK
        Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
        Local $index = DllStructGetData($tInfo, 'Index')
        Local $SubItem = DllStructGetData($tInfo, 'SubItem')
        If $index < 0 Then Return 'GUI_RUNDEFMSG'
        If IsArray($aItem) Then
                _GUICtrlListView_SetItemText($hListView, $aItem[0], GUICtrlRead($iCombo), $aItem[1])
                GUICtrlSetPos($iCombo, -1000, -100)
                Dim $aItem = 0
        EndIf

 楼主| 发表于 2020-11-28 18:50:03 | 显示全部楼层
本帖最后由 anythinging 于 2020-11-28 19:03 编辑
chzj589 发表于 2020-11-28 14:02
位置和内容保存都存在问题,没认真看你的问题,
1:位置问题
修改座标:Local $ListView1 = GUICtrlCreat ...

感谢指点,按照您的回复

修改座标就可以了
原:
GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 32, $aRect[2] - $aRect[0])
修改为:
GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 4, $aRect[2] - $aRect[0])

右键弹出菜单位置的问题已经解决了,但有个问题是编辑框能修改,但填不上。您第二个回复的代码我没弄懂,也没成功加进去

我把代码在1楼更新了下,还请指点

 楼主| 发表于 2020-11-28 19:02:36 | 显示全部楼层
就是这个样子,可以修改,位置也对了,但不能填入

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-11-28 19:27:12 | 显示全部楼层
anythinging 发表于 2020-11-28 19:02
就是这个样子,可以修改,位置也对了,但不能填入

Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        Switch DllStructGetData($tNMHDR, 'hWndFrom')
                Case $hListView
                        Switch DllStructGetData($tNMHDR, 'Code')
                                Case -2 ;$NM_CLICK
                                        Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $index = DllStructGetData($tInfo, 'Index')
                                        Local $SubItem = DllStructGetData($tInfo, 'SubItem')
                                        If $index < 0 Then Return 'GUI_RUNDEFMSG'
                                        If IsArray($aItem) Then
                                                _GUICtrlListView_SetItemText($hListView, $aItem[0], GUICtrlRead($iCombo), $aItem[1])
                                                GUICtrlSetPos($iCombo, -1000, -100)
                                                Dim $aItem = 0
                                        EndIf
                                        If $SubItem = 3 Then
                                                Local $context = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
                                                Dim $hMenu = GUICtrlGetHandle($context)
                                                GUICtrlCreateMenuItem('男', $context)
                                                GUICtrlCreateMenuItem('女', $context)
                                                Local $iid = _GUICtrlMenu_TrackPopupMenu($hMenu, $hGui, -1, -1, 1, 1, 2)
                                                If $iid Then _GUICtrlListView_SetItemText($hListView, $index, _GUICtrlMenu_GetItemText($hMenu, $iid, False), 3)
                                        EndIf
                                        If $SubItem = 4 Then
                                                Local $context = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
                                                Dim $hMenu = GUICtrlGetHandle($context)
                                                GUICtrlCreateMenuItem('可以修改', $context)
                                                GUICtrlCreateMenuItem('不能修改', $context)
                                                Local $iid = _GUICtrlMenu_TrackPopupMenu($hMenu, $hGui, -1, -1, 1, 1, 2)
                                                If $iid Then _GUICtrlListView_SetItemText($hListView, $index, _GUICtrlMenu_GetItemText($hMenu, $iid, False), 4)
                                        EndIf
                                        If $SubItem = 6 Then
                                                ;创建右键菜单
                                                Local $context = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
                                                Dim $hMenu = GUICtrlGetHandle($context)
                                                GUICtrlCreateMenuItem('保留', $context)
                                                GUICtrlCreateMenuItem('删除', $context)
                                                Local $iid = _GUICtrlMenu_TrackPopupMenu($hMenu, $hGui, -1, -1, 1, 1, 2)
                                                If $iid Then _GUICtrlListView_SetItemText($hListView, $index, _GUICtrlMenu_GetItemText($hMenu, $iid, False), 6) ;最后的2,是列的意思 ,就是将选中的内容填入到第2列
                                        EndIf
                                Case -5 ;$NM_CLICK
                                        Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        Local $iIndex = DllStructGetData($tInfo, 'Index')
                                        Local $iSub = DllStructGetData($tInfo, 'SubItem')
                                        Dim $aItem = 0
                                        If Not StringRegExp($iSub, "^(1|2)$") Then Return 'GUI_RUNDEFMSG'
                                        Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSub)
                                        Dim $aItem[2] = [$iIndex, $iSub]
                                        Local $sDef = $sDefCombo1
                                        If $iSub = 1 Then $sDef = $sDefCombo2
                                        Local $sData = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSub)
                                        GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 2, $aRect[2] - $aRect[0])
                                        GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
                                        GUICtrlSetState($iCombo, 256)
                                        If $iSub = 2 Then $sDef = $sDefCombo3
                                        Local $sData = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSub)
                                        GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 2, $aRect[2] - $aRect[0])
                                        GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
                                        GUICtrlSetState($iCombo, 256)
                        EndSwitch
        EndSwitch
EndFunc   ;==>_WM_NOTIFY
发表于 2020-11-28 19:38:39 | 显示全部楼层
anythinging 发表于 2020-11-28 19:02
就是这个样子,可以修改,位置也对了,但不能填入

A版的代码你没有完全理解,不然不会出错。
 楼主| 发表于 2020-11-28 19:52:57 | 显示全部楼层
chzj589 发表于 2020-11-28 19:27
Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tNMH ...

感谢指点,我按照您这个代码运行,会提示警告: $aItem: 可能使用在声明之前
在上面加了一个 Dim $aItem = 0也不行。


If IsArray($aItem) Then
    _GUICtrlListView_SetItemText($hListView, $aItem[0], GUICtrlRead($iCombo), $aItem[1])
    GUICtrlSetPos($iCombo, -1000, -100)
    Dim $aItem = 0
EndIf
 楼主| 发表于 2020-11-28 20:00:55 | 显示全部楼层
chzj589 发表于 2020-11-28 19:38
A版的代码你没有完全理解,不然不会出错。

惭愧,以目前的水平,看A版的代码基本上晕晕的,但是真好用,目前仅能做简单的引用修改。
 楼主| 发表于 2020-11-28 20:19:37 | 显示全部楼层
关于这个问题,我截了个动图,可能看的比较直观。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-11-28 20:20:35 | 显示全部楼层
anythinging 发表于 2020-11-28 20:00
惭愧,以目前的水平,看A版的代码基本上晕晕的,但是真好用,目前仅能做简单的引用修改。

#include <GUIListView.au3>
#include <GuiMenu.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <ListViewConstants.au3>
Opt('GUIOnEventMode', 1)
Global $hGui, $hListView, $hMenu, $aItem, $iCombo
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 07:30 , Processed in 0.088016 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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