找回密码
 加入
搜索
查看: 3956|回复: 12

[原创] Listview列表原地编辑键盘的上、下箭头键操作与列复制

[复制链接]
发表于 2020-12-26 16:17:14 | 显示全部楼层 |阅读模式
Listview列表原地编辑键盘的上、下箭头键操作与整列复制把原有的代码整合一下

见图:







本帖子中包含更多资源

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

×
发表于 2020-12-26 19:05:40 | 显示全部楼层
#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

本帖子中包含更多资源

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

×
发表于 2020-12-26 19:06:31 | 显示全部楼层

貌似afan 写过类似的
发表于 2020-12-26 22:29:49 | 显示全部楼层
刚学会了listview的皮毛,又有新技术了
 楼主| 发表于 2020-12-27 09:40:18 | 显示全部楼层

我编辑的是64位,你可能是32位。
 楼主| 发表于 2020-12-27 09:43:45 | 显示全部楼层
jiarqq 发表于 2020-12-26 19:06
貌似afan 写过类似的

2楼贴出的代码就是afan的,还写过类似的???
发表于 2021-1-22 20:50:11 | 显示全部楼层
请教如何通过复制那个按钮,获取选中前行的内容?
 楼主| 发表于 2021-1-22 22:09:05 | 显示全部楼层
anythinging 发表于 2021-1-22 20:50
请教如何通过复制那个按钮,获取选中前行的内容?

我并没有复制按钮。你要问什么问题?
发表于 2021-1-22 22:24:40 | 显示全部楼层
比如复制行,获取当前选中行的内容。
我用下面代码,获取当前选中的行,但无法成功应用到__GUICtrlListView_GetItemTextArray。
如果用_GUICtrlListView_GetItemTextArray($ListView1 , 3)手动指定确是正常的。
不知如何正确应用$Temp1

$Temp1 = _GUICtrlListView_GetSelectedIndices($ListView1,1)
$TempText=_GUICtrlListView_GetItemTextArray ($ListView1 , $Temp1)
_ArrayDisplay($TempText)
发表于 2021-1-22 22:31:24 | 显示全部楼层
anythinging 发表于 2021-1-22 22:24
比如复制行,获取当前选中行的内容。
我用下面代码,获取当前选中的行,但无法成功应用到__GUICtrlListVie ...

只选择一行的话 1改0就行了
_GUICtrlListView_GetSelectedIndices($ListView1, 0)
发表于 2021-1-22 22:40:14 | 显示全部楼层
本帖最后由 anythinging 于 2021-1-22 22:46 编辑

获取当前选中的行,发现$Temp1的值是对的
$Temp1 = _GUICtrlListView_GetSelectedIndices($ListView1,0)
MsgBox(262144,'',$Temp1)
但是获取当前选中行的内容,使用$Temp1为索引,得到的$TempText好象是列数,不知原因
$TempText=_GUICtrlListView_GetItemTextString ($ListView1 ,$Temp1)

得到的$TempText的值是    |||||||||


发表于 2021-1-22 22:46:18 | 显示全部楼层
我明白了,_GUICtrlListView_GetItemTextString不需要加后面的参数,直接就是获取当前行的内容
发表于 2021-1-22 22:49:10 | 显示全部楼层
复制、并添加选中行的代码应该是这样       
$TempText=_GUICtrlListView_GetItemTextString ($ListView1)
GUICtrlCreateListViewItem($TempText, $ListView1)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-30 20:58 , Processed in 0.087958 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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