Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вызывать функции с параметрами

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

Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Я так понял, что 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
Т.е., мне надо с индификатора кнопки вызвать функцию с нужными мне параметрами.

Отправлено: 20:40, 05-06-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Function GUICtrlSetOnEvent:
Цитата:
You can not call a function using parameters.

Отправлено: 00:13, 06-06-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 00:41, 06-06-2017 | #3


Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось Атос, 06-06-2017 в 10:05.


Отправлено: 09:29, 06-06-2017 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 13:59, 06-06-2017 | #5


Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:42, 06-06-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось Iska, 06-06-2017 в 21:02. Причина: Описка

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:29, 06-06-2017 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вызывать функции с параметрами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
RDP/Citrix/Term - RDP с параметрами Universal32 Сетевые технологии 1 07-10-2010 08:47
HotKeySet и вызов функции с параметрами r35p3ct AutoIt 4 24-09-2009 16:28
Вирусы не дают редактировать реестр и вызывать диспетчер задач Magistr_Yoda Лечение систем от вредоносных программ 3 31-03-2009 08:59
Проблема с параметрами видео slonikdva Непонятные проблемы с Железом 4 24-03-2008 14:24
Прога с параметрами Nigon Программирование и базы данных 7 19-05-2003 18:22




 
Переход