anythinging 发表于 2020-11-27 21:08:29

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

本帖最后由 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是字段总数
      If Not @error Then

                $skipnum = 0 ;跳过的字段数

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

                        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 = [['{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是字段总数
                For $i = 1 to $zd ;从1开始一直到$zd,读取出每个字段 的关键字和值
                        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
                $Password=$row
                $UserMode=$row
                $PwMode=$row
                $DEL         =$row

                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), $sData = ''
      _GUICtrlListView_SetItemText($hListView, $aItem, $sRd, $aItem)

      GUICtrlSetPos($aItem, -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, GUICtrlRead($iCombo), $aItem)
                                                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 = [$index, $SubItem]
                                        Local $sDef = $sDefCombo1


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

                                        If $SubItem = 2 Then $sDef = $sDefCombo3
                                        Local $sData = _GUICtrlListView_GetItemText($hListView, $index, $SubItem)
                                        ;GUICtrlSetPos($iCombo, $aRect + 4, $aRect + 32, $aRect - $aRect)
                                                                              GUICtrlSetPos($iCombo, $aRect + 4, $aRect + 4, $aRect - $aRect)
                                        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








afan 发表于 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()

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

afan 发表于 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 = ['张', '李', '王', '赵', '钱', '孙'], $aAdm = ['是', '否']
      For $ii = 1 To 100
                $sData &= '[' & $aN & $ii & ']' & @CRLF & 'PassWord=' & Random(111111, 999999, 1) & @CRLF & 'UserMode=' & $aAdm & @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 = [['{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
                $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), $sData = ''
      _GUICtrlListView_SetItemText($hListView1, $aItem, $sRd, $aItem)
      Switch $aItem
                Case 1
                        IniWrite($fIni, _GUICtrlListView_GetItemText($hListView1, $aItem), 'PassWord', $sRd)
                Case 2
                        IniWrite($fIni, _GUICtrlListView_GetItemText($hListView1, $aItem), 'UserMode', $sRd)
      EndSwitch
      GUICtrlSetPos($aItem, -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 = [$iIndex, $iSub, $iInput]
                        Else
                              Dim $aItem = [$iIndex, $iSub, $iComb]
                        EndIf
                        GUICtrlSetData($aItem, $sData)
                        GUICtrlSetPos($aItem, $aRect + 4, $aRect + 22, $aRect - $aRect)
                        GUICtrlSetState($aItem, 256)
      EndSwitch
EndFunc   ;==>_WM_NOTIFY
Func _Exit()
      Exit
EndFunc   ;==>_Exit

chzj589 发表于 2020-11-28 19:32:51

anythinging 发表于 2020-11-28 19:02
就是这个样子,可以修改,位置也对了,但不能填入

GUICtrlSetPos($iCombo, $aRect + 4, $aRect + 2, $aRect - $aRect)
两个座标要一致
Local $ListView1 = GUICtrlCreateListView('', 2,2, 396, 258)
##################
GUICtrlSetPos($iCombo, $aRect + 4, $aRect +32, $aRect - $aRect)
两个座标要一致
Local $ListView1 = GUICtrlCreateListView('', 2,32, 396, 258)

chzj589 发表于 2020-11-27 22:01:24

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

anythinging 发表于 2020-11-27 21:09:16

ini文件内容如下

UserName=王王
PassWord=123456
PwMode=1
UserMode=1



UserName=王1
PassWord=66666
PwMode=0
UserMode=1


UserName=王2
PassWord=123456
PwMode=0
UserMode=0


anythinging 发表于 2020-11-27 21:10:53

我是把版主大人的2个教程合到一个代码里,现在遇到了编辑框不正常。

chzj589 发表于 2020-11-28 11:08:14

chzj589 发表于 2020-11-27 22:01
修改座标就可以了
原:
GUICtrlSetPos($iCombo, $aRect + 4, $aRect + 32, $aRect - $aRect) ...


chzj589 发表于 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, GUICtrlRead($iCombo), $aItem)
                GUICtrlSetPos($iCombo, -1000, -100)
                Dim $aItem = 0
        EndIf

anythinging 发表于 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 + 4, $aRect + 32, $aRect - $aRect)
修改为:
GUICtrlSetPos($iCombo, $aRect + 4, $aRect + 4, $aRect - $aRect)

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

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

anythinging 发表于 2020-11-28 19:02:36

就是这个样子,可以修改,位置也对了,但不能填入

chzj589 发表于 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, GUICtrlRead($iCombo), $aItem)
                                                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 = [$iIndex, $iSub]
                                        Local $sDef = $sDefCombo1
                                        If $iSub = 1 Then $sDef = $sDefCombo2
                                        Local $sData = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSub)
                                        GUICtrlSetPos($iCombo, $aRect + 4, $aRect + 2, $aRect - $aRect)
                                        GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
                                        GUICtrlSetState($iCombo, 256)
                                        If $iSub = 2 Then $sDef = $sDefCombo3
                                        Local $sData = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSub)
                                        GUICtrlSetPos($iCombo, $aRect + 4, $aRect + 2, $aRect - $aRect)
                                        GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
                                        GUICtrlSetState($iCombo, 256)
                        EndSwitch
        EndSwitch
EndFunc   ;==>_WM_NOTIFY

chzj589 发表于 2020-11-28 19:38:39

anythinging 发表于 2020-11-28 19:02
就是这个样子,可以修改,位置也对了,但不能填入

A版的代码你没有完全理解,不然不会出错。

anythinging 发表于 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, GUICtrlRead($iCombo), $aItem)
    GUICtrlSetPos($iCombo, -1000, -100)
    Dim $aItem = 0
EndIf

anythinging 发表于 2020-11-28 20:00:55

chzj589 发表于 2020-11-28 19:38
A版的代码你没有完全理解,不然不会出错。

惭愧,以目前的水平,看A版的代码基本上晕晕的,但是真好用,目前仅能做简单的引用修改。

anythinging 发表于 2020-11-28 20:19:37

关于这个问题,我截了个动图,可能看的比较直观。

chzj589 发表于 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
页: [1] 2 3 4 5
查看完整版本: [已解决]恳请指点--终于参照版主大人的帖子实现了ini文件内容的读取,但遇到了问题