Что нового

[Новая функция] Предотвращение выхода из скрипта методом OnAutoItExitRegister

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Вопрос довольно простой - нужно предотвратить выход из скрипта после вызова функции указанной в OnAutoItExitRegister.

Пример с комментарием того что требуется:

Код:
#include <GUIConstantsEx.au3>

OnAutoItExitRegister("_Exit")

$hGUI = GUICreate("Test Script", 300, 200)
GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _Exit()
	Local $iAsk = MsgBox(51, 'Question', 'Save changes?' & @LF & @LF & 'Press [Cancel] button to prevent program Exit.', 0, $hGUI)
	
	Switch $iAsk
		Case 2 ;[Cancel] pressed
			;Вот тут нужно предотвратить выход из скрипта - есть идеи?
		Case 6 ;[OK] pressed
			;_SaveSettings()
	EndSwitch
EndFunc


Перезапуск скрипта не предлагать, нужно именно простое предотвращение выхода.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

Код:
#include <GUIConstantsEx.au3>
Global $hGUI
OnAutoItExitRegister("_Exit")
_GUI()

Func _GUI()
$hGUI = GUICreate("Test Script", 300, 200)
GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
EndFunc

Func _Exit()
    Local $iAsk = MsgBox(51, 'Question', 'Save changes?' & @LF & @LF & 'Press [Cancel] button to prevent program Exit.', 0, $hGUI)
    
    Switch $iAsk
        Case 2 ;[Cancel] pressed
            GUIDelete()
			_GUI();Вот тут нужно предотвратить выход из скрипта - есть идеи?
        Case 6 ;[OK] pressed
            ;_SaveSettings()
    EndSwitch
EndFunc


Правда фокус с невыходом из скрипта получается только один раз

Как вариант, еще можно в скрипте заменить все Exit на свою функцию, которая либо организует выход из скрипта, либо возвратит выполнение скрипта к месту вызова функции
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

asdf8 [?]
Правда фокус с невыходом из скрипта получается только один раз
Оно не подходит по другой причине - мне удалять и пересоздавать ничего не нужно, «нужно именно простое предотвращение выхода».

можно в скрипте заменить все Exit на свою функцию
Ну это понятно, если бы мне это подходило, то наверное я не стал бы тут писать, верно? ;)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

CreatoR, думаю вряд ли это возможно, и вряд ли это будет сделано. Когда пользователь регистрирует функцию выхода, то ее вызов должен однозначно говорить о том, что програма завершается и назад пути нет, ведь в этой функции обычно производят освобождение занятых ресурсов, закрытие используемых файлов и т.д. А если после этого отменить выход из программы, то непонятно в какое место в коде потом возвращаться. Это может привести к ошибкам или вылету программы.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

Yashied [?]
ведь в этой функции обычно производят освобождение занятых ресурсов, закрытие используемых файлов и т.д. А если после этого отменить выход из программы, то непонятно в какое место в коде потом возвращаться.
В ту строку где была вызвана Exit, и ресурсы высвобождать не обязательно (или высвобождать условно, как в моём примере), возврат можно было бы реализовать через Return 1 к примеру.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

Exit это всего лишь инициализация выхода, а функции выхода могут использоваться во многих UDF, и если функция выхода из моего UDF будет вызвана перед твоей "отменой", то в последствии мой UDF в лучшем случае перестанет работать. Если отмена нужна в пределах конечного кода, то в этом вообще нет никакого смысла, как говорится хозяин - барин. Все эти OnAutoItStart(Exit)Register'ы имеют смысл только в UDF'ах.


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

Я даже не могу представить где это может понадобиться. Твой пример иллюстрирует конечную программу, где вообще можно (и нужно) обойтись без OnAutoItExitRegister. Или я чего-то не понимаю?

Код:
#Include <GUIConstantsEx.au3>

$hGUI = GUICreate("Test Script", 300, 200)
GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_Exit()
	EndSwitch
WEnd

Func _Exit()
	Local $iAsk = MsgBox(51, 'Question', 'Save changes?' & @LF & @LF & 'Press [Cancel] button to prevent program Exit.', 0, $hGUI)
	Switch $iAsk
		Case 2 ;[Cancel] pressed
			Return
		Case 6 ;[OK] pressed
			;_SaveSettings()
			Exit
	EndSwitch
EndFunc   ;==>_Exit


:-\
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

CreatoR [?]
Вопрос довольно простой
это шутка такой? :smile:

нужно предотвратить выход из скрипта после вызова функции указанной в OnAutoItExitRegister
если OnAutoItExit не поддерживает, то ИМХО никак... как вариант - напиши в Feature Request, типа: если зарегеная ф-ция возвратит FALSE, то прервать процедуру выхода... но вопрос "откуда продолжить" всплывет так или иначе
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

amel27 [?]
это шутка такой?
Нет, я имел в виду простоту вопроса, а не задачи, т.е постановка вопроса ведь не сложная, а решение да, знаю что не из простых.

напиши в Feature Request
Начинаю сомневаться, Yashied всё же прав, если функция выхода из UDF будет вызвана раньше, то ресурсы этой UDF будут высвобождены, и потоп при отмене выхода из скрипта UDF перестанет работать.
Если это и смогут добавить, то придётся добавлять опциональный параметр в «OnAutoItExitRegister», который будет указывать на очередь запуска... хотя я ещё не проверял какой приоритет ставит «OnAutoItExitRegister» при запуске функции.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: Предотвращение выхода из скрипта методом OnAutoItExitRegister

[?]
я ещё не проверял какой приоритет ставит «OnAutoItExitRegister» при запуске функции.
В порядке убывания вызова «OnAutoItExitRegister». Т.е сначала запускается та функция, которая последней была указана в «OnAutoItExitRegister». Т.ч можно попробовать запостить Feature Request.
 
Верх