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]