Что нового

Как заменить Goto

rafzak

Новичок
Сообщения
27
Репутация
1
Версия AutoIt: 3.3.8.1

Описание: Здравствуйте.
Подскажите, какой алгоритм применить?
нужно выполнение следующих действий:

окно
название функции1
да-нет-выход
если да - выполнение функции1 и переход к окну название функции2
если нет - пропуск функции1 и переход к окну название функции2
выход - выход из программы

окно
название функции2
да-нет-выход
тот же алгоритм для следующей по порядку функции.

и так несколько функций (около 10)
в конце выход

Читал про замену циклами, как-то сложно для понимания, если не трудно опишите алгоритм замены (сам смысл, не очень понятно как задать условие перехода к следующей функции).
Спасибо

Примечания: Подобная тема имела место быть, но как применить рекомендации для моего случая - мне не очень понятно
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Функции вызываются по их имени.
"Если да, или если нет" - что бы разобраться в этом читайте <a href="http://autoit-script.ru/autoit3_docs/keywords/IfElseEndIf.htm">if else then</a>
 
Автор
R

rafzak

Новичок
Сообщения
27
Репутация
1
да, спасибо. я это читал.
Но мне не понятно, как мне кучку моих скриптов, объединить в один, с возможностью выбора варианта по каждому скрипту: запуска\не запуска\выхода из проги. Чтобы скрипты выполнялись последовательно. Не могу себе представить алгоритм без гоу то...
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
rafzak
Можно и так:
Код:
#include <GUIConstantsEx.au3>

Ex1()

Func Ex1()
    $hGui1 = GUICreate("Окно 1") ; Создаёт окно в центре экрана
    $Button1 = GUICtrlCreateButton("Да хочу отобразить в окно 2", 10, 20)
    $Button2 = GUICtrlCreateButton("Нет хочу отобразить в окно 3", 10, 50)
    $Button3 = GUICtrlCreateButton("Выход", 10, 80)
    GUISetState(@SW_SHOW) ; показывает созданное окно

    ; Запускается цикл опроса GUI до тех пор пока окно не будет закрыто
    While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $Button1 ; Да для функции 2
                    GUIDelete($hGui1)
                    Ex2()
                Case $Button2 ; Нет для функции 3
                    GUIDelete($hGui1)
                    Ex3()
                Case $Button3 ; Выход из программы
                    Exit
            EndSwitch
    WEnd
EndFunc


Func Ex2()
    $hGui2 = GUICreate("Окно 2") ; Создаёт окно в центре экрана
    $Button1 = GUICtrlCreateButton("Да хочу отобразить в окно 1", 10, 20)
    $Button2 = GUICtrlCreateButton("Нет хочу отобразить в окно 3", 10, 50)
    $Button3 = GUICtrlCreateButton("Выход", 10, 80)
    GUISetState(@SW_SHOW) ; показывает созданное окно

    ; Запускается цикл опроса GUI до тех пор пока окно не будет закрыто
    While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $Button1 ; Да для функции 1
                    GUIDelete($hGui2)
                    Ex1()
                Case $Button2 ; Нет для функции 3
                    GUIDelete($hGui2)
                    Ex3()
                Case $Button3 ; Выход из программы
                    Exit
            EndSwitch
    WEnd
EndFunc

Func Ex3()
    $hGui3 = GUICreate("Окно 3") ; Создаёт окно в центре экрана
    $Button1 = GUICtrlCreateButton("Да хочу отобразить в окно 1", 10, 20)
    $Button2 = GUICtrlCreateButton("Нет хочу отобразить в окно 2", 10, 50)
    $Button3 = GUICtrlCreateButton("Выход", 10, 80)
    GUISetState(@SW_SHOW) ; показывает созданное окно

    ; Запускается цикл опроса GUI до тех пор пока окно не будет закрыто
    While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $Button1 ; Да для функции 1
                    GUIDelete($hGui3)
                    Ex1()
                Case $Button2 ; Нет для функции 2
                    GUIDelete($hGui3)
                    Ex2()
                Case $Button3 ; Выход из программы
                    Exit
            EndSwitch
    WEnd
EndFunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А вот так чтобы попроще, чтобы ближе к народу... :beer:
Код:
For $i = 1 to 10
	$eto = MsgBox(3,"вызов функции "&$i,"Выполнить функцию "&$i&" ?")
	Switch $eto
		Case 6
			Call("_GoTo"&$i)
			Exit
		Case 7
			;ToolTip("нет, так нет",0,0)
		Case 2
			Exit
	EndSwitch
Next

Func _GoTo1()
	MsgBox(0,"Функция 1","Это Функция 1")
EndFunc

Func _GoTo2()
	MsgBox(0,"Функция 2","Это Функция 2")
EndFunc

Func _GoTo3()
	MsgBox(0,"Функция 3","Это Функция 3")
EndFunc

Func _GoTo4()
	MsgBox(0,"Функция 4","Это Функция 4")
EndFunc

Func _GoTo5()
	MsgBox(0,"Функция 5","Это Функция 5")
EndFunc

Func _GoTo6()
	MsgBox(0,"Функция 6","Это Функция 6")
EndFunc

Func _GoTo7()
	MsgBox(0,"Функция 7","Это Функция 7")
EndFunc

Func _GoTo8()
	MsgBox(0,"Функция 8","Это Функция 8")
EndFunc

Func _GoTo9()
	MsgBox(0,"Функция 9","Это Функция 9")
EndFunc

Func _GoTo10()
	MsgBox(0,"Функция 10","Это Функция 10")
EndFunc
 
Автор
R

rafzak

Новичок
Сообщения
27
Репутация
1
Всем спасибо за ответы.
C2H5OH
Ваш скрипт похож на то, что мне нужно, но нет предложения о функции2 при выполнении 1ой функции прога закрывается.

Придумал вариант для себя - мне нужно так

Код:
Local $answer = MsgBox ( 3, "title1", "text1")
If $answer = 2 Then
	MsgBox(0, "AutoIt", "OK.  Bye!")
	Exit
EndIf
If $answer = 6 Then
Run("calc.exe")
EndIf
Local $answer = MsgBox ( 3, "title2", "text2")
If $answer = 2 Then
	MsgBox(0, "AutoIt", "OK.  Bye!")
	Exit
EndIf
If $answer = 6 Then
Run("calc.exe")
EndIf
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Та запросто!
Код:
For $i = 1 to 10
    $eto = MsgBox(3,"вызов функции "&$i,"Выполнить функцию "&$i&" ?")
    Switch $eto
        Case 6
            Call("_GoTo"&$i)
            ; Exit  <--- убрать вот эту строку
        Case 7
            ;ToolTip("нет, так нет",0,0)
        Case 2
            Exit
    EndSwitch
Next
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
rafzak

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Администратор.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Хотя использования goto считается дурным тоном в программировании, но все равно хотелось, что бы она была. А так приходится подсчитывать цифры для exitloop, если нужно выйти из большого числа вложенных циклов. Может, когда нибудь, и добавят эту команду...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs [?]
использования goto считается дурным тоном в программировании
Это не дурной тон, это неправильное (точнее не перспективное) программирование.

приходится подсчитывать цифры для exitloop, если нужно выйти из большого числа вложенных циклов
Если тебе пришлось использовать кучу циклов в качестве замены GoTo, то ты явно делаешь что то не так.
По поводу подсчётов, что мешает добавить некую переменную, которая будет прописываться в начале каждого цикла, и пополняться на одну единицу, а потом использовать её в качестве параметра для ExitLoop.

Может, когда нибудь, и добавят эту команду
Её не добавят, хотя бы потому, что она раньше была в AutoIt, и позже её убрали :smile:.
 
Автор
R

rafzak

Новичок
Сообщения
27
Репутация
1
C2H5OH Спасибо - наверно лучшее для меня решение
Всем спасибо, обошелся без гоу то.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
inververs
Правильно что от неё избавились, она не позволяет диагностировать правильность кода, у неё нет структурного подхода и думаю заставляет усложнять интерпретарор.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
rafzak
а отреагировать на предупреждение?
 
Верх