找回密码  加入

AUTOIT CN

搜索
查看: 1891|回复: 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的例子。

  1. #include <GUIListView.au3>
  2. #include <GuiMenu.au3>
  3. #include <MsgBoxConstants.au3>
  4. #include <WindowsConstants.au3>
  5. #include <GuiListView.au3>
  6. #include <GuiImageList.au3>
  7. #include <GUIConstantsEx.au3>
  8. #include <StaticConstants.au3>
  9. #include <ButtonConstants.au3>
  10. #include <ListViewConstants.au3>



  11. Opt('GUIOnEventMode', 1)

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

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

  19. $Save=GUICtrlCreateButton('保  存',200,300,80,30)
  20. GUICtrlSetOnEvent($Save, "_save")
  21. $Add=GUICtrlCreateButton('添  加',100,300,80,30)
  22. GUICtrlSetOnEvent($Add, "_Add")
  23. $Ref=GUICtrlCreateButton('刷  新',10,300,80,30)
  24. GUICtrlSetOnEvent($Ref, "_Ref")


  25. _Read()

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

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

  30.         _GUICtrlListView_SetExtendedListViewStyle($iListView, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT)



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

  33.                 $skipnum = 0 ;跳过的字段数

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

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

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

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

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

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

  50.                                 If $UserMode = '1' Then
  51.                                         $Mode='男'
  52.                                 Else
  53.                                         $Mode='女'
  54.                                 EndIf

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

  56.                                 If $PwMode = '1' Then;
  57.                                         $PW='允许'
  58.                                 Else
  59.                                         $PW='禁止'
  60.                                 EndIf

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


  63.                         EndIf
  64.                 Next

  65.                 GUISetState()

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


  70.                 GUIRegisterMsg(0x004E, '_WM_NOTIFY')        ;$WM_NOTIFY = 0x004E
  71.         Else
  72.                 MsgBox(262144,'','配置文件读取错误',1)
  73.                 Exit
  74.         EndIf
  75. EndFunc

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

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

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


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

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

  101.                         If $UserMode = '男' Then
  102.                                 IniWrite($dir, $UserName,'UserMode',1)
  103.                         Else
  104.                                 IniWrite($dir, $UserName,'UserMode',0)
  105.                         EndIf

  106.                         If $PwMode = '允许' Then
  107.                                 IniWrite($dir, $UserName,'PwMode',1)
  108.                         Else
  109.                                 IniWrite($dir, $UserName,'PwMode',0)
  110.                         EndIf
  111.                 EndIf


  112.         Next
  113. ;~ _Ref()        ;刷新
  114. EndFunc

  115. Func _Ref()        ;刷新
  116.         GUICtrlDelete($iListView)
  117.         _Read()
  118. EndFunc

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

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






  127. While 1

  128.                 Sleep(1000)

  129. WEnd



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


  133.         Switch DllStructGetData($tNMHDR, 'hWndFrom')
  134.                 Case $hListView
  135.                         Switch DllStructGetData($tNMHDR, 'Code')

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

  140.                                         If IsArray($aItem) Then
  141.                                                 _GUICtrlListView_SetItemText($hListView, $aItem[0], GUICtrlRead($iCombo), $aItem[1])
  142.                                                 GUICtrlSetPos($iCombo, -1000, -100)
  143.                                                 Dim $aItem = 0
  144.                                         EndIf


  145.                                                                                 ;弹出菜单

  146.                                                                                 If $index < 0 Then Return 'GUI_RUNDEFMSG'

  147.                                                                                 If $SubItem = 3 Then

  148.                                                                                                 Local $context = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
  149.                                                                                                 Dim $hMenu = GUICtrlGetHandle($context)
  150.                                                                                                 GUICtrlCreateMenuItem('男',$context)
  151.                                                                                                 GUICtrlCreateMenuItem('女',$context)

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

  155.                                                                                 If $SubItem = 4 Then

  156.                                                                                                 Local $context = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
  157.                                                                                                 Dim $hMenu = GUICtrlGetHandle($context)
  158.                                                                                                 GUICtrlCreateMenuItem('允许',$context)
  159.                                                                                                 GUICtrlCreateMenuItem('禁止',$context)

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

  163.                                                                                 If $SubItem = 5 Then

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

  169.                                                                         EndIf




  170.                                         ;修改框

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


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


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

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

  187.                                                                 Case -5 ;$NM_CLICK

  188.                                                                 Case $NM_DBLCLK ; 双击


  189.                         EndSwitch
  190.         EndSwitch
  191. EndFunc   ;==>_WM_NOTIFY



  192. Func _Exit()
  193.         Exit
  194. EndFunc   ;==>_Exit





复制代码



发表于 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])
回复 支持 1 反对 0

使用道具 举报

发表于 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 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 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)
回复 支持 1 反对 0

使用道具 举报

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

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

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

  12. Opt('GUIOnEventMode', 1)
  13. Global $hGUI, $ListView1, $hListView1, $aItem, $iInput, $iComb
  14. _GUICreate()
  15. While 1
  16.         Sleep(1000)
  17. WEnd

  18. Func _GUICreate()
  19.         Dim $hGUI = GUICreate('Ini 数据管理', 300)
  20.                 GUISetOnEvent(-3, '_Exit')
  21.         Dim $iInput = GUICtrlCreateInput('', -100, -100)
  22.         Dim $iComb = GUICtrlCreateCombo('', -100, -100, -1, -1, 3) ; $CBS_DROPDOWNLIST=0x0003
  23.         GUICtrlSetData(-1, '是|否')
  24.         Dim $ListView1 = GUICtrlCreateListView('用户名 |密码 |管理员权限|管理', 2, 20, 296, 350)
  25.         Dim $hListView1 = GUICtrlGetHandle(-1)
  26.         GUICtrlSetFont(-1, 11, 400, 0, '微软雅黑')
  27.         _LoadIni2LVW()
  28.         GUISetState()
  29.         Local $id1 = GUICtrlCreateDummy()
  30.                 GUICtrlSetOnEvent(-1, '__UdpData')
  31.         Local $aAccelKeys[1][2] = [['{Enter}', $id1]]
  32.         GUISetAccelerators($aAccelKeys)
  33.         GUIRegisterMsg(0x004E, '_WM_NOTIFY') ;$WM_NOTIFY = 0x004E
  34. EndFunc   ;==>_GUICreate
  35. Func _LoadIni2LVW()
  36.         Local $aIni = IniReadSectionNames($fIni)
  37.         If @error Then Return SetError(1, 0, 0)
  38.         Local $ii, $sPassWord, $sUserMode
  39.         For $ii = 1 To $aIni[0]
  40.                 $sPassWord = IniRead($fIni, $aIni[$ii], 'PassWord', '')
  41.                 $sUserMode = IniRead($fIni, $aIni[$ii], 'UserMode', '否')
  42.                 GUICtrlCreateListViewItem(StringFormat('%s|%s|%s|删除', $aIni[$ii], $sPassWord, $sUserMode), $ListView1)
  43.         Next
  44. EndFunc   ;==>_LoadIni2LVW
  45. Func __UdpData()
  46.         If Not IsArray($aItem) Then Return
  47.         Local $sRd = GUICtrlRead($aItem[2]), $sData = ''
  48.         _GUICtrlListView_SetItemText($hListView1, $aItem[0], $sRd, $aItem[1])
  49.         Switch $aItem[1]
  50.                 Case 1
  51.                         IniWrite($fIni, _GUICtrlListView_GetItemText($hListView1, $aItem[0]), 'PassWord', $sRd)
  52.                 Case 2
  53.                         IniWrite($fIni, _GUICtrlListView_GetItemText($hListView1, $aItem[0]), 'UserMode', $sRd)
  54.         EndSwitch
  55.         GUICtrlSetPos($aItem[2], -1000, -100)
  56.         Dim $aItem = 0
  57. EndFunc   ;==>__UdpData
  58. Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  59.         Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  60.         If HWnd(DllStructGetData($tNMHDR, 'hWndFrom')) <> $hListView1 Then Return 'GUI_RUNDEFMSG'
  61.         Switch DllStructGetData($tNMHDR, 'Code')
  62.                 Case -2 ;$NM_CLICK = -2
  63.                         If IsArray($aItem) Then
  64.                                 __UdpData()
  65.                         Else
  66.                                 Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  67.                                 Local $iIndex = DllStructGetData($tInfo, 'Index')
  68.                                 Local $iSub = DllStructGetData($tInfo, 'SubItem')
  69.                                 If $iSub = 3 Then
  70.                                         Local $sName = _GUICtrlListView_GetItemText($hListView1, $iIndex)
  71.                                         If MsgBox(48 + 4, '确认删除', '是否删除用户 "' & $sName & '" ?', 0, $hGUI) = 6 Then
  72.                                                 _GUICtrlListView_DeleteItem($hListView1, $iIndex)
  73.                                                 IniDelete($fIni, $sName)
  74.                                         EndIf
  75.                                 EndIf
  76.                         EndIf
  77.                 Case -3 ;$NM_DBLCLK = -3
  78.                         Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  79.                         Local $iIndex = DllStructGetData($tInfo, 'Index')
  80.                         Local $iSub = DllStructGetData($tInfo, 'SubItem')
  81.                         Dim $aItem = 0
  82.                         If $iSub <> 1 And $iSub <> 2 Then Return 'GUI_RUNDEFMSG'
  83.                         Local $aRect = _GUICtrlListView_GetSubItemRect($hListView1, $iIndex, $iSub)
  84.                         Local $sData = _GUICtrlListView_GetItemText($hListView1, $iIndex, $iSub)
  85.                         If $iSub = 1 Then
  86.                                 Dim $aItem[3] = [$iIndex, $iSub, $iInput]
  87.                         Else
  88.                                 Dim $aItem[3] = [$iIndex, $iSub, $iComb]
  89.                         EndIf
  90.                         GUICtrlSetData($aItem[2], $sData)
  91.                         GUICtrlSetPos($aItem[2], $aRect[0] + 4, $aRect[1] + 22, $aRect[2] - $aRect[0])
  92.                         GUICtrlSetState($aItem[2], 256)
  93.         EndSwitch
  94. EndFunc   ;==>_WM_NOTIFY
  95. Func _Exit()
  96.         Exit
  97. EndFunc   ;==>_Exit
复制代码

评分

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

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 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 很给力!

查看全部评分

回复 支持 1 反对 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]) ...


本帖子中包含更多资源

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

x
发表于 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 | 显示全部楼层
就是这个样子,可以修改,位置也对了,但不能填入

本帖子中包含更多资源

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

x
发表于 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 | 显示全部楼层
关于这个问题,我截了个动图,可能看的比较直观。

本帖子中包含更多资源

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

x
发表于 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, 2021-1-20 08:55 , Processed in 2.047190 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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