Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Вызывать функции с параметрами (http://forum.oszone.net/showthread.php?t=327361)

Атос 05-06-2017 20:40 2742297

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

Я так понял, что 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 2742334

Цитата:

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

Правильно.

Function GUICtrlSetOnEvent:
Цитата:

You can not call a function using parameters.

Iska 06-06-2017 00:41 2742337

Цитата:

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

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

#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 2742377

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 2742441

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

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

Атос 06-06-2017 15:42 2742461

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

Iska 06-06-2017 16:29 2742477

Берёте указанную в описании самой функции 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



Время: 22:46.

Время: 22:46.
© OSzone.net 2001-