Показать полную графическую версию : [решено] Вызывать функции с параметрами
Подскажите функцию, которая может вызывать другие функции с параметрами.
Я так понял, что 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
Т.е., мне надо с индификатора кнопки вызвать функцию с нужными мне параметрами.
Я так понял, что GUICtrlSetOnEvent не может вызывать функции с параметрами, правильно? »
Правильно.
Function GUICtrlSetOnEvent (https://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetOnEvent.htm):
You can not call a function using parameters.
Т.е., мне надо с индификатора кнопки вызвать функцию с нужными мне параметрами. »
Есть иные способы, не требующие передачи параметров. Например, использовать элемент управления самой формы:
#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
Выбор конкретной реализации зависит от конкретной задачи, которую Вы не озвучили.
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, да, задача была именно такая. Мне уже показали решение.
Поэтому, задача снимается. Спасибо.
Берёте указанную в описании самой функции 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.