fengzr 发表于 2010-9-22 17:33:42

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

ListView UDF - ListView消息扩展http://www.autoitx.com/forum.php?mod=viewthread&tid=13175&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控件间接实现。虽然问题解决了,但实在无法理解这几条语句怎么会导致死机?
页: [1]
查看完整版本: ListView消息扩展中结束编辑处理时改变按钮状态会导致程序崩溃和我解决的方法