[решено] Вызывать функции с параметрами

Ответить
Аватара пользователя
Атос

[решено] Вызывать функции с параметрами

Сообщение Атос »

Подскажите функцию, которая может вызывать другие функции с параметрами.



Я так понял, что GUICtrlSetOnEvent не может вызывать функции с параметрами, правильно?



Вот пример.



Код:

Код: Выделить всё

Opt("GUIOnEventMode", 1)
GUICreate("111")
Local $aaa = GUICtrlCreateButton("Start", 55, 15,  40, 22, 0x0100)
GUISetState()
GUICtrlSetOnEvent($aaa, "_a1('Bavaria')")
GUISetOnEvent(-3, "_CLOSE")
While 1
Sleep(1000)
WEnd
Func _a1($a)
MsgBox(0, "title", $a)
EndFunc
Func _CLOSE()
Exit
EndFunc

Т.е., мне надо с индификатора кнопки вызвать функцию с нужными мне параметрами.
Аватара пользователя
Iska

Re: [решено] Вызывать функции с параметрами

Сообщение Iska »

Цитата Атос:



Я так понял, что GUICtrlSetOnEvent не может вызывать функции с параметрами, правильно?
[решено] Вызывать функции с параметрами




Правильно.



Function GUICtrlSetOnEvent
:


Цитата:



You can not call a function using parameters.
Аватара пользователя
Iska

Re: [решено] Вызывать функции с параметрами

Сообщение Iska »

Цитата Атос:



Т.е., мне надо с индификатора кнопки вызвать функцию с нужными мне параметрами.
[решено] Вызывать функции с параметрами




Есть иные способы, не требующие передачи параметров. Например, использовать элемент управления самой формы:



Скрытый текст

[spoiler]

Код: Выделить всё

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Local $bFormShow = true
$MyForm = GUICreate("My Form", 588, 85, 192, 166)
GUISetOnEvent($GUI_EVENT_CLOSE, "MyFormClose")
$Edit = GUICtrlCreateInput("Edit", 8, 8, 569, 21)
$ButtonPlay = GUICtrlCreateButton("Play", 376, 40, 97, 33)
GUICtrlSetOnEvent($ButtonPlay, "ButtonPlayClick")
$ButtonCancel = GUICtrlCreateButton("Cancel", 480, 40, 97, 33)
GUICtrlSetOnEvent($ButtonCancel, "ButtonCancelClick")
GUICtrlSetData($Edit, "C:\Enigma--Following.The.Sun.mp3")
GUISetState(@SW_SHOW)
While $bFormShow
	Sleep(100)
WEnd
Exit(0)
Func ButtonPlayClick()
	Local $sValue = GUICtrlRead($Edit)
	ShellExecute($sValue)
EndFunc
Func ButtonCancelClick()
	$bFormShow = false
EndFunc
Func MyFormClose()
	$bFormShow = false
EndFunc
[/spoiler]


Выбор конкретной реализации зависит от конкретной задачи, которую Вы не озвучили.
Аватара пользователя
Атос

Re: [решено] Вызывать функции с параметрами

Сообщение Атос »

Iska, спасибо.



Попробую сформулировать задачу более конкретно.

У меня есть цикл For To Next. StopValue - у меня будет двумерным массивом (Вернее, количеством элементов этого массива.).

Внутри этого цикла есть идентификатор кнопки.

С каждым новым циклом он меняется.

Будет вызываться одна и та же функция, но в зависимости от этого идентификатора, параметры будут меняться.

Соответственно, я не могу точно получить событие через Switch GUIGetMsg() EndSwitch.

В этом вся трудность.

Если бы, хотя-бы GUICtrlSetOnEvent($p, "_a1('Bavaria')") работала, то вся проблема бы ушла.

Если использовать GUICtrlRead($p) вне цикла, то я буду всегда получать последний элемент,

а мне нужен конкретный, в зависимости от номера цикла.

Получается замкнутый круг.

Вызов вне цикла - результат последний цикл.

Вызов внутри цикла - есть все динамические переменные, но невозможно вызвать функцию с конкретными параметрами.





Код:

Код: Выделить всё

Opt("GUIOnEventMode", 1)
GUICreate("111")
$p = 0
For $i = 0 To 7
$p = $p + $i
$p = GUICtrlCreateButton('Start', 15, 20, 160, 22, 0x0100)
GUICtrlSetOnEvent($p, "_a1('Bavaria')")
; GUICtrlSetOnEvent($p, "_a1")
Next
GUISetState()
GUISetOnEvent(-3, "_CLOSE")
While 1
Sleep(1000)
WEnd
; Func _a1()
Func _a1($a)
; MsgBox(0, "title", '1111')
MsgBox(0, "title", $a)
EndFunc
Func _CLOSE() 
Exit 
EndFunc
Аватара пользователя
Iska

Re: [решено] Вызывать функции с параметрами

Сообщение Iska »

Атос, я просил озвучить задачу, а не повторно изложить выбранное Вами решение.



Вы хотите нарисовать кучу кнопок, обработка нажатия каждой из которых будет привязана к одной и той же функции, так? При этом внутри этой функции обработки события Вы хотите как-то распознавать от какой кнопки пришло нажатие и, в зависимости от этого, выполнять то или иное действие — я правильно понимаю?
Аватара пользователя
Атос

Re: [решено] Вызывать функции с параметрами

Сообщение Атос »

Iska, да, задача была именно такая. Мне уже показали решение.

Поэтому, задача снимается. Спасибо.
Аватара пользователя
Атос

Re: [решено] Вызывать функции с параметрами

Сообщение Атос »

Берёте указанную в описании самой функции GUISetOnEvent() встроенную переменную @GUI_CtrlId и пользуете. А там хоть через привязку к кнопкам, хоть через массив, хоть через Switch:



Скрытый текст

[spoiler]

Код: Выделить всё

#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Local $bFormShow = true
Local $i
$MyForm = GUICreate("My Form", 258, 240)
GUISetOnEvent($GUI_EVENT_CLOSE, "MyFormClose")
For $i = 0 To 5
 	GUICtrlCreateButton("Play " & $i, 20, 20 + $i * 33, 97, 33)
	GUICtrlSetOnEvent(-1, "ButtonPlayClick")
Next
$ButtonCancel = GUICtrlCreateButton("Cancel", 140, 20, 97, 33)
GUICtrlSetOnEvent($ButtonCancel, "ButtonCancelClick")
GUISetState(@SW_SHOW)
While $bFormShow
	Sleep(100)
WEnd
Exit(0)
Func ButtonPlayClick()
	MsgBox($IDOK, "", GUICtrlRead(@GUI_CtrlId))
	Switch GUICtrlRead(@GUI_CtrlId)
		Case "Play 0"
		Case "Play 1"
		Case "Play 2"
		Case "Play 3"
		Case "Play 4"
		Case "Play 5"
	EndSwitch
EndFunc
Func ButtonCancelClick()
	$bFormShow = false
EndFunc
Func MyFormClose()
	$bFormShow = false
EndFunc
[/spoiler]
Ответить

Вернуться в «AutoIt»