找回密码
 加入
搜索
楼主: anythinging

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

[复制链接]
发表于 2020-11-28 20:24:23 | 显示全部楼层
anythinging 发表于 2020-11-28 20:19
关于这个问题,我截了个动图,可能看的比较直观。

代码己发消息
 楼主| 发表于 2020-11-28 20:39:03 | 显示全部楼层
本帖最后由 anythinging 于 2020-11-28 20:42 编辑
chzj589 发表于 2020-11-28 20:20
#include
#include
#include

佩服的五体投地!
我总算明白了,原来您加的那段代码,是放到鼠标左键响应上,而且是上方位置的,现已将代码更新。
现在改成全部左键响应也好用了。
再问一个小问题,能否实现按回车直接确认输入的内容?
发表于 2020-11-28 20:42:42 | 显示全部楼层
anythinging 发表于 2020-11-28 20:39
佩服的五体投地!
我总算明白了,原来您加的那段代码,是放到鼠标左键响应上的。
现在改成全部左键响应 ...

鼠标操作与键盘操作是两回事。这要请教A版。
 楼主| 发表于 2020-11-28 20:55:16 | 显示全部楼层
感谢指点!终于可以进入到下一个阶段了——保存表格内容到ini文件

能否给个保存的例子,实现把上述表格内容从新保存回ini文件中。
发表于 2020-11-28 21:25:17 | 显示全部楼层
之前就跟你说过,不要使用无意义的编号做ini字段名,那样会给保存数据带来一系列麻烦
 楼主| 发表于 2020-11-28 21:36:59 | 显示全部楼层
本帖最后由 anythinging 于 2020-11-28 21:38 编辑
afan 发表于 2020-11-28 21:25
之前就跟你说过,不要使用无意义的编号做ini字段名,那样会给保存数据带来一系列麻烦

那版主您看这样可以吗?
UserName=用户名=字段名
[王1]
PassWord=66666
PwMode=0
UserMode=0

[王2]
PassWord=123456
PwMode=0
UserMode=0
发表于 2020-11-28 21:39:38 | 显示全部楼层
anythinging 发表于 2020-11-28 20:55
感谢指点!终于可以进入到下一个阶段了——保存表格内容到ini文件

能否给个保存的例子,实现把上述表格 ...

现在配置文件的格式要改一下,然后用:
读取列表的数据写入。
Local $cont = _GUICtrlListView_GetItemCount($ListView1);取得数组的行列数
$h1 = 0
For $ID = 0 To $cont - 1
$str = _GUICtrlListView_GetItemTextArray($ListView1, $ID)
$h1 = $str[1]
$h2 = $str[2]
IniWrite($sFilePath, "常规", "标题", "AutoIt")
Next
发表于 2020-11-28 21:40:55 | 显示全部楼层
anythinging 发表于 2020-11-28 21:36
那版主您看这样可以吗?
UserName=用户名=字段名
[王1]

这样设计才是明智的,因为它可以直接和控件数据产生一一对应的关系,操作起来会少走很多弯路。
 楼主| 发表于 2020-11-28 21:51:20 | 显示全部楼层
afan 发表于 2020-11-28 21:40
这样设计才是明智的,因为它可以直接和控件数据产生一一对应的关系,操作起来会少走很多弯路。

收到,谢谢~!代码已修改为字段名为用户名,
之前考虑有可能以后在排序时会用到,就加了个001-???的序号,不知有用没
发表于 2020-11-28 22:00:52 | 显示全部楼层
anythinging 发表于 2020-11-28 21:51
收到,谢谢~!代码已修改为字段名为用户名,
之前考虑有可能以后在排序时会用到,就加了个001-???的序号 ...

序号在你这里完全没用,不用考虑。
两月前你的提问我为之写过示范代码,但因你想研究使用控件组合的方式做交互界面就没有发出来。
现在看来你还是使用建议的 ListView 方式,如果你需要我可以发出来供参考。
 楼主| 发表于 2020-11-28 22:05:26 | 显示全部楼层
afan 发表于 2020-11-28 22:00
序号在你这里完全没用,不用考虑。
两月前你的提问我为之写过示范代码,但因你想研究使用控件组合的方式 ...

如您所说最终还是用的listview,最主要是您发的那个代码虽然还是看不懂,但确是简洁高效。
还请发下写入的代码。
发表于 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 22:37:23 | 显示全部楼层
chzj589 发表于 2020-11-28 21:39
现在配置文件的格式要改一下,然后用:
读取列表的数据写入。
Local $cont = _GUICtrlListView_GetItem ...

可行,正在一点一点笨方法接近成功。感谢!
 楼主| 发表于 2020-11-28 22:37:42 | 显示全部楼层
afan 发表于 2020-11-28 22:19
不需要创建ini文件,程序会自动生成
双击第2列可编辑输入框;双击第3列可选择下拉框;单击第4列可删除;任 ...

收到,感谢指点,慢慢消化。
发表于 2020-11-29 08:58:09 | 显示全部楼层
anythinging 发表于 2020-11-28 22:37
可行,正在一点一点笨方法接近成功。感谢!

现在不能熬夜了。早上想了一下,不用改配置文件格式,不然又要更改读取方式。
你参考一下:
Func _Save()
        $dira = @ScriptDir & "\test3.ini"
        Local $cont = _GUICtrlListView_GetItemCount($ListView1);取得数组的行列数
        $h1 = ""
        For $id = 0 To $cont - 1
                $str = _GUICtrlListView_GetItemTextArray($ListView1, $id)
                $ha = "00" & $id + 1
                $h2 = $str[2]
                $h3 = $str[3]
                $h4 = $str[4]
                $h5 = $str[5]
                If $h4 = '男' Then
                        $Mode = 1
                Else
                        $Mode = 0
                EndIf
                If $h5 = '可以修改' Then;
                        $PW = 1
                Else
                        $PW = 0
                EndIf
                ;MsgBox(0, "提示", $h2)
                IniWrite($dira, $ha, "UserName", $h2)
                IniWrite($dira, $ha, "PassWord", $h3)
                IniWrite($dira, $ha, "PwMode", $Mode)
                IniWrite($dira, $ha, "UserMode", $PW)
        Next
EndFunc   ;==>_Save

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 12:48 , Processed in 0.071187 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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