Что нового

Имитация режима GUIOnEventMode

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Вот как я представляю работу режима GUIOnEventMode:
Код:
#include <GUIConstantsEx.au3>

$GUIOnEventMode = True
Local $aEvent[1][2] = [[0]]
_Opt($GUIOnEventMode)

$hGui = GUICreate('My Program', 250, 260)
_GUICtrlSetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$iBtn1 = GUICtrlCreateButton('Start', 10, 10, 120, 22)
_GUICtrlSetOnEvent($iBtn1, "_Button1")
$iBtn2 = GUICtrlCreateButton('End', 10, 40, 120, 22)
_GUICtrlSetOnEvent($iBtn2, "_Button2")
GUISetState()

While 1
	Sleep(100000)
WEnd

Func _Opt($GUIOnEventMode = 0)
	If $GUIOnEventMode Then
		AdlibRegister('_While', 20)
	Else
		AdlibUnRegister("_While")
	EndIf
EndFunc   ;==>_Opt

Func _While()
	Local $msg = GUIGetMsg()
	For $i = 1 To $aEvent[0][0]
		If $msg = $aEvent[$i][0] Then
			AdlibUnRegister("_While")
			Call($aEvent[$i][1])
			AdlibRegister('_While', 10)
			ExitLoop
		EndIf
	Next
EndFunc   ;==>_While

Func _GUICtrlSetOnEvent($iControl_ID, $sFuncName)
	ReDim $aEvent[$aEvent[0][0] + 2][2]
	$aEvent[0][0] += 1
	$aEvent[$aEvent[0][0]][0] = $iControl_ID
	$aEvent[$aEvent[0][0]][1] = $sFuncName
EndFunc   ;==>_GUICtrlSetOnEvent

Func _Button1()
	MsgBox(0, 'Сообщение', 'Кнопка Start')
EndFunc   ;==>_Button1

Func _Button2()
	MsgBox(0, 'Сообщение', 'Кнопка End')
EndFunc   ;==>_Button2

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Сначала этот режим казался загадочным с каким то внутренним движком, непонятно было лучше он или хуже. Переделывал программы на этот режим OnEvent, но в итоге понял, что это в принципе алгоритм также требует сравнение событий с идентификаторами, только способ вызова сделан внутри.

Из описание режима OnEvent было ясно что это не отдельный процесс, а аналогичный вызову AdlibRegister, который прерывает выполнение скрипта, чтобы обработать проверку сообщений. Как видно из примера создаётся двумерный массив, который связывает функцию с событием, а с помощью AdlibRegister вызывает проверку событий в цикле.
 
Верх