Что нового

[Окна, Диалоги] GUIOnEventMode Работа с несколькими окнами

pvnn

Осваивающий
Сообщения
281
Репутация
31
Пожалуйста помогите!
Пытаюсь разобраться с функцией AutoItSetOption ("GUIOnEventMode", 1) то есть установить режим OnEvent.
Для одного окна он прекрасно работает.
Как сделать его работоспособным в нескольких окнах.
В нижепредложенном примере нажатие кнопки "Отмена" когда выполняется цикл не обрабатывается
Я могу конечно повесить действие на Case в первом GUI, но интересует именно режим OnEvent в этих двух окнах


Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


AutoItSetOption ("GUIOnEventMode", 1)           ; Устанавливаем режим OnEvent
 $Form1 = GUICreate("Form1", 255, 87, 320, 174)
 $Button1 = GUICtrlCreateButton("Старт", 88, 48, 75, 25)
           GUICtrlSetOnEvent(-1, "start")
 GUISetOnEvent($GUI_EVENT_CLOSE, "FExit")
 GUISetState(@SW_SHOW)

While 1
 Sleep(200)
WEnd

Func FExit()
	Exit
EndFunc

Func start()
    $ProgressBar = GUICreate("Отправка сообщений", 327, 133, -1, -1)
    $Progress1 = GUICtrlCreateProgress(8, 29, 262, 16)
    $ButtonCancelProg = GUICtrlCreateButton("Отмена", 194, 99, 75, 25)
	                    GUICtrlSetOnEvent(-1, "FunctionButtonCancel")
    GUISetState(@SW_SHOW,$ProgressBar) ; Показать GUI-форму Прогресса
AutoItSetOption ("GUIOnEventMode", 1)           ; Устанавливаем режим OnEvent
	 For $n=1 To 10
		 Sleep(1000)
		 $ProgressProcent=Floor($n*100/10)      ; Вычисляем Процент переданных сообщений
		 GUICtrlSetData($Progress1,$ProgressProcent)         ; Меняем показания ProgressBar1
	 Next
Return
EndFunc


Func FunctionButtonCancel()
  	  MsgBox(0,'','Нажата клавиша Отмена')
	  Exit
EndFunc
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
pvnn
Вот... Нашел пример... Немного отличается, но работает...

Код:
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)  ; Change to OnEvent mode 
$mainwindow = GUICreate("Hello World", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($okbutton, "OKButton")

$dummywindow = GUICreate("Dummy window for testing ", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

GUISwitch($mainwindow)
GUISetState(@SW_SHOW)

While 1
  Sleep(1000)  ; Idle around
WEnd

Func OKButton()
  ;Note: at this point @GUI_CTRLID would equal $okbutton
  MsgBox(0, "GUI Event", "You pressed OK!")
EndFunc

Func CLOSEClicked()
  ;Note: at this point @GUI_CTRLID would equal $GUI_EVENT_CLOSE,
  ;@GUI_WINHANDLE will be either $mainwindow or $dummywindow
  If @GUI_WINHANDLE = $mainwindow Then 
    MsgBox(0, "GUI Event", "You clicked CLOSE in the main window! Exiting...")
    Exit
  EndIf 
EndFunc
 
Автор
P

pvnn

Осваивающий
Сообщения
281
Репутация
31
snoitaleR сказал(а):
Вот... Нашел пример... Немного отличается, но работает...
Этот пример я уже смотрел в справке. Дело в том, что если в моем случае закомментировать цикл FOR Next, то тоже все работает. Но вопрос остается открытым, почему
Код:
AutoItSetOption ("GUIOnEventMode", 1)

Не прерывает цикл в функции во втором GUI, хотя с одним окном все работает
 

Yashied

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

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $Init = 0

AutoItSetOption("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 255, 87, 320, 174)
$Button1 = GUICtrlCreateButton("Старт", 88, 48, 75, 25)
GUICtrlSetOnEvent(-1, "start")
GUISetOnEvent($GUI_EVENT_CLOSE, "FExit")
GUISetState(@SW_SHOW)

While 1
	Sleep(10)
	If $Init Then
		Progress()
		$Init = 0
	EndIf
WEnd

Func FExit()
	Exit
EndFunc   ;==>FExit

Func Progress()
	$ProgressBar = GUICreate("Отправка сообщений", 327, 133, -1, -1)
	$Progress1 = GUICtrlCreateProgress(8, 29, 262, 16)
	$ButtonCancelProg = GUICtrlCreateButton("Отмена", 194, 99, 75, 25)
	GUICtrlSetOnEvent(-1, "FunctionButtonCancel")
	GUISetState(@SW_SHOW, $ProgressBar)
	For $n = 1 To 10
		Sleep(1000)
		$ProgressProcent = Floor($n * 100 / 10)
		GUICtrlSetData($Progress1, $ProgressProcent)
	Next
	GUIDelete($ProgressBar)
EndFunc   ;==>Progress

Func start()
	$Init = 1
EndFunc   ;==>start

Func FunctionButtonCancel()
	MsgBox(0, '', 'Нажата клавиша Отмена')
	Exit
EndFunc   ;==>FunctionButtonCancel
 
Автор
P

pvnn

Осваивающий
Сообщения
281
Репутация
31
Yashied сказал(а):
Для обработки следующего события нужно завершить предыдущее (поэтому я и не люблю OnEvent режим). Событие из другого события, как ты сам убедился, не работает. Можешь сделать следующим образом.
Yashied Огромное Спасибо!!!! Данное решение как раз то что нужно! Смысл понятен!!!

Еще раз всем спасибо!!!!
Форум рулит :ok:
:IL_AutoIt_1:
 
Верх