Что нового

Вызов функции, которая вызывает другую функцию

fortages

Новичок
Сообщения
81
Репутация
3
Здравствуйте!
Помогите, пожалуйста, разобраться с функциями. Вернее с ситуацией, когда есть какое-то условие, при котором вызываемая функция "передает управление" другой функции.

Как-то запутанно объяснила... Например, вот на картинке нажатие на кнопку Browser - это вызов функции _Browser(), нажатие на кнопку Auth это вызов функции _Auth(). А если есть третья кнопка? По нажатию которой должна бы вызываться функция _Browser(), но из-за определенных условий
Код:
$flag
функция _Browser() вызывает функцию _Auth()
5aa1a8b58eed.png


Как такое можно сделать?
Вот код:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $flag

$Form1 = GUICreate("Form1", 170, 151, 192, 122)
$ButtonBrowser = GUICtrlCreateButton("Browser", 16, 16, 75, 25)
$ButtonAuth = GUICtrlCreateButton("Auth", 16, 64, 75, 25)
$ButtonRedirect = GUICtrlCreateButton("Browser (Auth)", 16, 112, 99, 25)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButtonBrowser 
			_Browser() ;вызов нормальной функции
		Case $ButtonAuth 
			 _Auth()
		Case $ButtonRedirect
			_Browser($flag) ;вызов функции с "редиректом" на другую функцию

	EndSwitch
WEnd

Func _Browser()
		If $flag Then
          _Auth()
		EndIf
	MsgBox("", "MsgBox", "Browser") 
EndFunc

Func _Auth()
	MsgBox("", "MsgBox", "User auth here")
EndFunc
Но он не работает на третьей кнопке - выдает ошибку на 24 строке.
Помогите, пожалуйста, исправить ошибку.
Спасибо!
 

Kasper

Знающий
Сообщения
70
Репутация
8
Вроде так
Код:
Func _Browser($flag = true)
Func _Browser($flag = false)
        If $flag Then
          _Auth()
        EndIf
    MsgBox("", "MsgBox", "Browser") 
EndFunc
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
Kasper, спасибо за быстрый ответ!
Добавила Ваш код в конец файла, теперь файл выглядит так:

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

Global $flag

$Form1 = GUICreate("Form1", 170, 151, 192, 122)
$ButtonBrowser = GUICtrlCreateButton("Browser", 16, 16, 75, 25)
$ButtonAuth = GUICtrlCreateButton("Auth", 16, 64, 75, 25)
$ButtonRedirect = GUICtrlCreateButton("Browser (Auth)", 16, 112, 99, 25)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButtonBrowser 
			_Browser() ;вызов нормальной функции
		Case $ButtonAuth 
			 _Auth()
		Case $ButtonRedirect
			_Browser($flag) ;вызов функции с "редиректом" на другую функцию

	EndSwitch
WEnd

Func _Auth()
	MsgBox("", "MsgBox", "User auth here")
EndFunc

;----------------------
Func _Browser($flag = true)
Func _Browser($flag = false)
        If $flag Then
          _Auth()
        EndIf
    MsgBox("", "MsgBox", "Browser")
EndFunc

Выдает ошибку, что нету EndFunc. Скрин тут:
e88f4864d014.png
Попыталась дописать - все равно ошибки.

ebf0d8e4417f.png

a7b1278cff1a.png
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Пояснения в комментариях
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $flag

$Form1 = GUICreate("Form1", 170, 151, 192, 122)
$ButtonBrowser = GUICtrlCreateButton("Browser", 16, 16, 75, 25)
$ButtonAuth = GUICtrlCreateButton("Auth", 16, 64, 75, 25)
$ButtonRedirect = GUICtrlCreateButton("Browser (Auth)", 16, 112, 99, 25)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $ButtonBrowser 
            _Browser() ;вызов нормальной функции     ; тут функция соответствует той которой написана ниже
        Case $ButtonAuth 
             _Auth()
        Case $ButtonRedirect
            _Browser($flag)   ;вызов функции с "редиректом" на другую функцию                         тут функция требует входящий параметр, которого нет в написанной ниже

    EndSwitch
WEnd

Func _Browser()
        If $flag Then
          _Auth()
        EndIf
    MsgBox("", "MsgBox", "Browser") 
EndFunc

Func _Auth()
    MsgBox("", "MsgBox", "User auth here")
EndFunc

Исправленный вариант
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $flag

$Form1 = GUICreate("Form1", 170, 151, 192, 122)
$ButtonBrowser = GUICtrlCreateButton("Browser", 16, 16, 75, 25)
$ButtonAuth = GUICtrlCreateButton("Auth", 16, 64, 75, 25)
$ButtonRedirect = GUICtrlCreateButton("Browser (Auth)", 16, 112, 99, 25)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $ButtonBrowser
            _Browser($flag) ;вызов нормальной функции
        Case $ButtonAuth
             _Auth()
		  Case $ButtonRedirect
            _Browser(True) ;вызов функции с "редиректом" на другую функцию

    EndSwitch
WEnd


 Func _Browser($flag)
        If $flag Then
          _Auth()
        EndIf
    MsgBox("", "MsgBox", "Browser")
EndFunc

Func _Auth()
    MsgBox("", "MsgBox", "User auth here")
EndFunc
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
ildar огромное спасибо! Все работает! Ура!)))
Только хотела бы спросить - а почему открываются обе функции? После нажатия на кнопку Browser(Auth) появляется сообщение "User auth here", то есть функция _Auth() вызвалась, как и надо, а потом после нажатия на ОК открывается еще сообщение "Browser", то есть, вызвалась еще и функция _Browser(). А почему так происходит? То есть, невозможно полностью сделать "перенаправление" на функцию _Auth() с функции _Browser()? Если вызвали _Browser() (хоть она и не нужна в определенном случае в определенных условиях), то она все равно выполнится?

Просто этот код - это пример, а в основной ("большой") программе открытие еще одного окна (вызов _Browser() когда надо только _Auth() вызвать) мешает.

Пыталась сделать вот так:
Код:
Func _Browser($flag)
        If $flag Then
          _Auth()
        EndIf
    NOT MsgBox("", "MsgBox", "Browser")
EndFunc

Действительно вызвалась только _Auth(), но после нее была ошибка:
c191efd28a39.png


За комментарии спасибо, кажется поняла, почему тут True:
Код:
_Browser(True) ;вызов функции с "редиректом" на другую функцию

Если флаг есть, значит true, значит редирект выполняется. Правильно?

А вот тут
Код:
_Browser($flag) ;вызов нормальной функции

$flag вписан в качестве параметра функции... м... Почему? Глупый вопрос конечно, но правда не поняла этот момент. :-[ Просто и с
Код:
_Browser()
и с
Код:
_Browser($flag)
работает. Или так просто правильнее?


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

update:
Кажется разобралась с первым вопросом:
Код:
Func _Browser($flag)
        If $flag=false Then
		MsgBox("", "MsgBox", "Browser")
         Else
		 _Auth()
        EndIf
     
EndFunc
:smile:
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
fortages
Честно говоря, пока я прочитал у меня мозг взорвался) Простейшая задача, а проблем то сколько. Потому что у ildar тоже некорректный код.

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

$Form1 = GUICreate("Form1", 170, 151, 192, 122)
$ButtonBrowser = GUICtrlCreateButton("Browser", 16, 16, 75, 25)
$ButtonAuth = GUICtrlCreateButton("Auth", 16, 64, 75, 25)
$ButtonRedirect = GUICtrlCreateButton("Browser (Auth)", 16, 112, 99, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $ButtonBrowser
            _Browser(False) ;вызов нормальной функции
        Case $ButtonAuth
             _Auth()
          Case $ButtonRedirect
            _Browser(True) ;вызов функции с "редиректом" на другую функцию
    EndSwitch
WEnd

 Func _Browser($flag)
        If $flag Then
          _Auth()
        EndIf
    MsgBox(16, "MsgBox", "Browser")
EndFunc

Func _Auth()
    MsgBox(16, "MsgBox", "User auth here")
EndFunc
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
Medic84 спасибо за ответ! :smile: Кажется, теперь разобралась. ;D Старалась писать так, чтобы максимально раскрыть мысль, а в итоге еще больше запутала. :-[

Всем спасибо за ответы! Кажется, с этой темой теперь разобралась на 100%. :IL_AutoIt_1:
 
Верх