Что нового

Бага с $GUI_EVENT_CLOSE

W

w3d1

Гость
Словил удивительную багу.
При первом (и только при первом!) запуске скомпилированной программы $hGUI ни в какую не ловит $GUI_EVENT_CLOSE.
Остальное работает ($WM_NOTIFY и т.д.)
Если перезапустить прогу - все отлично работает.
Почему это может быть?

Код:
; всякие объявления...

_SetFields()
GUISetState(@SW_SHOW, $hGUI)

; основной цикл
While 1 = 1
......
Wend

Func _SetFields()
	Local $exStyles = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES), $hListView	
	$hGUI = GUICreate("List fields", 200, 450, 100, 100, $WS_OVERLAPPEDWINDOW, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST))
	$nListView = GUICtrlCreateListView("", 2, 2, 197, 448)
	$hListView = GUICtrlGetHandle(-1)
	GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
	_GUICtrlListView_SetUnicodeFormat($hListView, False)
	_GUICtrlListView_AddColumn($hListView, "Field", 100)
	_GUICtrlListView_AddColumn($hListView, "Status", 90)
	_GUICtrlListView_SetItemCount($hListView, 30)
	_GUICtrlListView_AddArray($hListView, $aFields)
	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
	GUIRegisterMsg($WM_LBUTTONUP, "WM_LBUTTONUP")
	GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE")
	GUISetOnEvent($GUI_EVENT_CLOSE, "_GUIEvents")
EndFunc   ;==>_SetFields

Func _GUIEvents()
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE
			$iAns = MsgBox(33, "", "Save settings?")
			If $iAns = 1 Then
				.....
			EndIf
			GUISetState(@SW_HIDE, $hGUI)
	EndSwitch
EndFunc   ;==>_GUIEvents


Если запускаю из SciTE - тоже самое. Т.е. открываю *.au3 - F5 - не закрывается. Закрываю скрипт из трея, опять F5 - все работает.
Ничего не понимаю.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
скрипт не рабочий. проверить возможности нет
 
Автор
W

w3d1

Гость
Так понятно что я кусок вырезал, там целиком под 1000 строк будет.
Попробую сделать работоспособный пример.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
w3d1 сказал(а):
Так понятно что я кусок вырезал, там целиком под 1000 строк будет.
Попробую сделать работоспособный пример.

В этом куске ты случайно не забыл поставить Sleep()?
 
Автор
W

w3d1

Гость
Нашел закономерность.
Если перед _SetFields() вызвать
Код:
Func SetPort() 
	; закрываем все открытые порты
	For $i = 1 To 255
		$MsComm.PortOpen = 0
		SetError(0)
	Next
	; убиваем объект
	$MsComm = 0
	; создаем объект по новой
	$MsComm = ObjCreate("MSCOMMLib.MsComm.1")
	Opt("GUIOnEventMode", 0);keep events for $Form2, use GuiGetMsg for $Form3
	$Form3 = GUICreate("Wizz Forms Port Setup", 422, 239, 329, 228, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_GROUP, $WS_BORDER, $WS_CLIPSIBLINGS, $DS_MODALFRAME), BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
	$Group1 = GUICtrlCreateGroup("Set COM Port", 18, 8, 288, 212)
	$CmboPortsAvailable = GUICtrlCreateCombo("", 127, 28, 145, 25)
	$CmBoBaud = GUICtrlCreateCombo("", 127, 66, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $WS_VSCROLL))
	GUICtrlSetData(-1, "9600|14400|19200|28800|38400|57600|115200", "9600")
	$CmBoStop = GUICtrlCreateCombo("1", 127, 141, 145, 25)
	GUICtrlSetData(-1, "2|1.5")
	$CmBoParity = GUICtrlCreateCombo("N", 127, 178, 145, 25)
	GUICtrlSetData(-1, "O|E")
	$Label2 = GUICtrlCreateLabel("Port", 94, 32, 23, 17)
	$Label3 = GUICtrlCreateLabel("baud", 89, 70, 28, 17)
	$Label4 = GUICtrlCreateLabel("No. Stop bits", 52, 145, 65, 17)
	$Label5 = GUICtrlCreateLabel("parity", 88, 182, 29, 17)
	$CmboDataBits = GUICtrlCreateCombo("8", 127, 103, 145, 25)
	GUICtrlSetData(-1, "7")
	$Label7 = GUICtrlCreateLabel("No. of Data Bits", 38, 107, 79, 17)
	GUICtrlCreateGroup("", -99, -99, 1, 1)
	$BtnApply = GUICtrlCreateButton("Apply", 315, 95, 75, 35, $BS_FLAT)
	GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
	$BtnCancel = GUICtrlCreateButton("Cancel", 316, 147, 76, 35, $BS_FLAT)
	GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
	GUISetState(@SW_SHOW, $Form3)
	#EndRegion ### END Koda GUI section ###
	; выставляем значения из ини-файла
	If FileExists(@ScriptDir & "\comport.ini") Then
		; считываем настройки
		$setPort1 = IniRead(@ScriptDir & "\comport.ini", "Setting", "Port", "")
		$setBaudRate = IniRead(@ScriptDir & "\comport.ini", "Setting", "Baud rate", "")
		$setParity = IniRead(@ScriptDir & "\comport.ini", "Setting", "Parity", "")
		$setDatabits = IniRead(@ScriptDir & "\comport.ini", "Setting", "Data bits", "")
		$setStopbits = IniRead(@ScriptDir & "\comport.ini", "Setting", "Stop bits", "")
		; настраиваем значения контролов
		_GUICtrlComboBox_SelectString($CmBoBaud, $setBaudRate)
		_GUICtrlComboBox_SelectString($CmBoParity, $setParity)
		_GUICtrlComboBox_SelectString($CmboDataBits, $setDatabits)
		_GUICtrlComboBox_SelectString($CmBoStop, $setStopbits)
	EndIf
	; попытка определить доступные порты через mscomm32
	$allport = ""
	For $i = 1 To 255
		$MsComm.CommPort = $i
		$MsComm.PortOpen = 1
		If @error = 0 Then
			$allport = "COM" & $i
			GUICtrlSetData($CmboPortsAvailable, "COM" & $i)
		EndIf
		$MsComm.PortOpen = 0
		SetError(0)
	Next
	GUICtrlSetData($CmboPortsAvailable, $allport)
	If FileExists(@ScriptDir & "\comport.ini") Then
		; считываем настройки
		_GUICtrlComboBox_SelectString($CmboPortsAvailable, "COM" & $setPort1)
	EndIf
	While 1
		$msg = GUIGetMsg()
		If $msg = $BtnCancel Then
			ExitLoop
		EndIf
		If $msg = $BtnApply Then
			Local $sportSetError
			$setString = GUICtrlRead($CmBoBaud) & "," & GUICtrlRead($CmBoParity) & "," & GUICtrlRead($CmboDataBits) & "," & GUICtrlRead($CmBoStop)
			; настройка выбранного порта
			$setport = StringReplace(GUICtrlRead($CmboPortsAvailable), 'COM', '')
			$MsComm.CommPort = $setport
			$MsComm.Settings = $setString
			$MsComm.Handshaking = 0
			$MsComm.InBufferSize = 4096
			$MsComm.InputLen = 0
			$MsComm.InputMode = 0
			$MsComm.PortOpen = 1
			; записываем параметры в ini файл
			IniWrite(@ScriptDir & '\comport.ini', 'Setting', 'Port', $setport)
			IniWrite(@ScriptDir & '\comport.ini', 'Setting', 'Baud rate', GUICtrlRead($CmBoBaud))
			IniWrite(@ScriptDir & '\comport.ini', 'Setting', 'Parity', GUICtrlRead($CmBoParity))
			IniWrite(@ScriptDir & '\comport.ini', 'Setting', 'Data bits', GUICtrlRead($CmboDataBits))
			IniWrite(@ScriptDir & '\comport.ini', 'Setting', 'Stop bits', GUICtrlRead($CmBoStop))
			IniWrite(@ScriptDir & '\comport.ini', 'Setting', 'SetString', $setString)
			; ставим галочку
			;TrayItemSetState($prefsitem, $TRAY_CHECKED)
			ExitLoop
		EndIf
	WEnd
	GUIDelete($Form3)
EndFunc   ;==>SetPort


то 100% _SetFields() не реагирует на закрытие.
Что в SetPort() не так?



Добавлено:
Сообщение автоматически объединено:

Уже сам нашел :smile:
Поставил в конец SetPort()
Код:
Opt("GUIOnEventMode", 1)

и все заработало как надо :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Основная программа работает в режиме OnEvent, а эта функция нет. Верни режим OnEvent при выходе из SetPort().

Код:
Opt("GUIOnEventMode", 1)
 
Верх