Войти

Показать полную графическую версию : [решено] Вызывать функции с параметрами


Атос
05-06-2017, 20:40
Подскажите функцию, которая может вызывать другие функции с параметрами.

Я так понял, что 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
06-06-2017, 00:13
Я так понял, что GUICtrlSetOnEvent не может вызывать функции с параметрами, правильно? »
Правильно.

Function GUICtrlSetOnEvent (https://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetOnEvent.htm):
You can not call a function using parameters.

Iska
06-06-2017, 00:41
Т.е., мне надо с индификатора кнопки вызвать функцию с нужными мне параметрами. »
Есть иные способы, не требующие передачи параметров. Например, использовать элемент управления самой формы:
#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

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

Атос
06-06-2017, 09:29
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
06-06-2017, 13:59
Атос, я просил озвучить задачу, а не повторно изложить выбранное Вами решение.

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

Атос
06-06-2017, 15:42
Iska, да, задача была именно такая. Мне уже показали решение.
Поэтому, задача снимается. Спасибо.

Iska
06-06-2017, 16:29
Берёте указанную в описании самой функции GUISetOnEvent() встроенную переменную @GUI_CtrlId и пользуете. А там хоть через привязку к кнопкам, хоть через массив, хоть через Switch:
#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




© OSzone.net 2001-2012