找回密码
 加入
搜索
查看: 2870|回复: 0

[原创] ListView消息扩展中结束编辑处理时改变按钮状态会导致程序崩溃和我解决的方法

[复制链接]
发表于 2010-9-22 17:33:42 | 显示全部楼层 |阅读模式
ListView UDF - ListView消息扩展http://www.autoitx.com/forum.php ... p;extra=&page=1帖子中用于原位编辑ListView数据确实不错,但在应用时我发现加上改变按钮状态的语句会导致程序崩溃无反应,原消息处理部分语句为:
       Case $LVN_EDITEND ; 结束编辑。

                Local $tEditEnd, $iFlags

                $tEditEnd = DllStructCreate($tagLISTVIEW_EDITEND, $ilParam)

                $iFlags = DllStructGetData($tEditEnd, "EndFlags")



                ; 判断是否输入enter键结束,若非,不保存编辑结果。

                If ($iFlags <> $LVEF_ENTER) Then

                        DllStructSetData($tEditEnd, "AutoComplete", 0)

                Else

                        DllStructSetData($tEditEnd, "AutoComplete", 1)

                EndIf

                ; 以上的2句DllStructSetData,可以删除其中一句,

                ; 因为AutoComplete的值默认为_GUICtrlListView_RegisterEditEvent中$fAutoComplete的值。

在我的应用中为:
        Case $LVN_EDITEND ; 结束编辑。
                Local $tEditEnd, $iFlags, $Text, $iItemMax
                $tEditEnd = DllStructCreate($tagLISTVIEW_EDITEND, $ilParam)
                $iItem = DllStructGetData($tEditEnd, "Item")
                $iSubItem = DllStructGetData($tEditEnd, "SubItem")
                $iFlags = DllStructGetData($tEditEnd, "EndFlags")
                $Text = _GUICtrlListView_GetEditData($hListView)

                ; 判断是否输入enter键结束,若非,不保存编辑结果。
                If ($iFlags = $LVEF_ENTER) And StringIsDigit($Text) Then
                        $Text = Number($Text)
                        $iItemMax = 100
                        If $iSubItem = 2 Then
                                If $iItem=0 Or ($ItemNo=17 And $iItem=12) Or ($ItemNo=14 And $iItem=9) Or ($ItemNo=16 And $iItem=13) Then
                                        $iItemMax = 120
                                ElseIf ($ItemNo=17 And $iItem=15) Or ($ItemNo=14 And $iItem=12) Or ($ItemNo=16 And $iItem=16) Then
                                        $iItemMax=200
                                EndIf
                        ElseIf $iSubItem = 3 Then
                                If $iItem = 0 Or $iItem = 4 Or $iItem = $ItemNo-5 Or $iItem > $ItemNo-3 Then $iItemMax = 253
                        ElseIf $iSubItem = 5 Then
                                $iItemMax = 0x7fffffff
                        EndIf
                        If $Text > $iItemMax Then $Text = $iItemMax
                        _GUICtrlListView_AddSubItem($hListView, $iItem, $Text, $iSubItem)
                        UpdateSubItem6($iItem)
                        If $EditedNow=0 Then
                                GUICtrlSendToDummy($EditedNowMSG)
                                $EditedNow=1
                        EndIf
                EndIf
                DllStructSetData($tEditEnd, "AutoComplete", 0)

这里采用了GUICtrlSendToDummy($EditedNowMSG)语句来改变按钮状态,Dummy控件处理消息的部分就是下面的语句:
                Case $EditedNowMSG
                        GUICtrlSetState($SaveButton, $GUI_ENABLE)
                        GUICtrlSetState($SaveMenuItem, $GUI_ENABLE)
                        GUICtrlSetState($SaveFile, $GUI_ENABLE)
本来原来是直接把这3条改变按钮状态语句放在GUICtrlSendToDummy($EditedNowMSG)
这条语句位置,但这样就会导致程序死机,因此只能通过Dunmy控件间接实现。虽然问题解决了,但实在无法理解这几条语句怎么会导致死机?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-4 16:21 , Processed in 0.070145 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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