Что нового

Обработать нажатие кнопки по событию в цикле с помощью GUISetOnEvent

Нубокодер

Новичок
Сообщения
75
Репутация
0
Для наглядности накидал небольшую программку.

Смысл такой: пользователь вводит нужное количество кнопок (от 1 до 20). По нажатию на кнопку чуть ниже должно выводиться ее значение.

Не знаю как передать параметры в мою функцию _Button_value ( $value ), т.к. GUICtrlSetOnEvent исполняет ее в виде строки. А без передачи параметра, программа вылетает. Наверно потому что функция не знает о существовании массива. Хотя он объявлен как глобальный. Подскажите как это реализовать. Не писать же для каждой кнопки отдельную функцию. Да и количество кнопок может быть и тысяча, я просто ограничил 20-тью

Код:
#include <IE.au3>
#include <GUIConstantsEx.au3>

$count = 9 ; кол-во кнопок по умолчанию
$count = InputBox ( "Сколько кнопок Вам надо?", "Введите число от 1 до 20", $count ); ввод кол-ва кнопок
If (@error) Or (Not StringIsDigit ( $count )) Or ($count < 1) Or ($count >20) Then Exit ; если ошибка ввода, то выйти

Global $value[$count+1] ; массив значений кнопок
Global $ID[$count+1] ; массив для ID кнопок

Opt("GUIOnEventMode", 1)  ; включает режим OnEvent (по событию)

$mainwindow = GUICreate ( "Кнопка и еще кнопка:", $count * 30 + 20, 60 ) ; создание окна
GUISetState(@SW_SHOW) ; видимость окна

For $i = 1 To $count
  $value[$i] = Round(Random * 100) ; заполняется массив двухзначными числами
  $ID[$i] = GUICtrlCreateButton ( $i, 10 - 30 + 30 * $i , 5, 30, 20) ; вывод кнопок
  GUICtrlSetOnEvent ( $ID[$i], "_Button_value" ) ; обработка нажатий на кнопки <<< ВОТ ТУТ НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ В ФУНКЦИЮ _Button_value ( $value, $i ), КАК ЭТО СДЕЛАТЬ?!
Next

GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEClicked") ; обработка закрытия программы по крестику

; Тело программы:
While 1
	Sleep(1000 * 1)
WEnd

; Раздел функций:
Func _Button_value () ; <<< ВОТ СЮДА НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ _Button_value ( $value, $i ), , КАК ЭТО СДЕЛАТЬ?!
  GUICtrlCreateLabel ( $value[$i], 10 - 30 + 30 * $i , 35, 30, 20) ; Вывод значения нажатой кнопки под ней
  Return
EndFunc

Func _CLOSEClicked() ; функция выхода
  If MsgBox(4 + 256, "Подтверди базар:", "Сыкануть по полной программе и свалить в ужасе?") = 6 Then Exit
  Return
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Нубокодер,
Я бы примерно так сделал.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Global $iCount = 9
$iCount = InputBox("Сколько кнопок Вам надо?", "Введите число от 1 до 20", $iCount); ввод кол-ва кнопок
If (@error) Or (Not StringIsDigit($iCount)) Or ($iCount < 1) Or ($iCount > 20) Then Exit ; если ошибка ввода, то выйти

Global $aLbl[$iCount + 1][2] ; массив значений кнопок
Global $aBtn[$iCount + 1] ; массив для ID кнопок

Opt("GUIOnEventMode", 1) ; включает режим OnEvent (по событию)

$hGui = GUICreate("Кнопка и еще кнопка:", $iCount * 30 + 20, 60) ; создание окна
GUISetState() ; видимость окна

For $i = 1 To $iCount
	$aLbl[$i][0] = GUICtrlCreateLabel($i * 10, 10 - 30 + 30 * $i, 35, 30, 20, BitOR($GUI_SS_DEFAULT_LABEL, $SS_CENTER, $SS_CENTERIMAGE));Random(11, 99, 1) ; заполняется массив двухзначными числами
	GUICtrlSetState(-1, $GUI_HIDE)
	$aBtn[$i] = GUICtrlCreateButton($i, 10 - 30 + 30 * $i, 5, 30, 20) ; вывод кнопок
	GUICtrlSetOnEvent($aBtn[$i], "_Button_value") ; обработка нажатий на кнопки <<< ВОТ ТУТ НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ В ФУНКЦИЮ _Button_value ( $aLbl, $i ), КАК ЭТО СДЕЛАТЬ?!
Next

GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEClicked") ; обработка закрытия программы по крестику

; Тело программы:
While Sleep(1000)
WEnd

; Раздел функций:
Func _Button_value() ; <<< ВОТ СЮДА НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ _Button_value ( $aLbl, $i ), , КАК ЭТО СДЕЛАТЬ?!
	Local $i_Ind = _GetIndex(@GUI_CtrlId)
	If $i_Ind = -1 Then Return
	If $aLbl[$i_Ind][1] Then Return
	$aLbl[$i_Ind][1] = 1
	GUICtrlSetState($aLbl[$i_Ind][0], $GUI_SHOW)
EndFunc   ;==>_Button_value

Func _CLOSEClicked() ; функция выхода
	If MsgBox(4 + 256, "Подтверди базар:", "Сыкануть по полной программе и свалить в ужасе?") = 6 Then Exit
	Return
EndFunc   ;==>_CLOSEClicked

Func _GetIndex($i_ID)
	For $i = 1 To $iCount
		If $aBtn[$i] = $i_ID Then Return $i
	Next
	Return -1
EndFunc   ;==>_GetIndex
Или так.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Global $iCount = 9
$iCount = InputBox("Сколько кнопок Вам надо?", "Введите число от 1 до 20", $iCount); ввод кол-ва кнопок
If (@error) Or (Not StringIsDigit($iCount)) Or ($iCount < 1) Or ($iCount > 20) Then Exit ; если ошибка ввода, то выйти

Global $aLbl[$iCount + 1] ; массив значений кнопок
Global $aBtn[$iCount + 1] ; массив для ID кнопок

Opt("GUIOnEventMode", 1) ; включает режим OnEvent (по событию)

$hGui = GUICreate("Кнопка и еще кнопка:", $iCount * 30 + 20, 60) ; создание окна
GUISetState() ; видимость окна

For $i = 1 To $iCount
	$aBtn[$i] = GUICtrlCreateButton($i, 10 - 30 + 30 * $i, 5, 30, 20) ; вывод кнопок
	GUICtrlSetOnEvent($aBtn[$i], "_Button_value") ; обработка нажатий на кнопки <<< ВОТ ТУТ НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ В ФУНКЦИЮ _Button_value ( $aLbl, $i ), КАК ЭТО СДЕЛАТЬ?!
Next

GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEClicked") ; обработка закрытия программы по крестику

; Тело программы:
While Sleep(1000)
WEnd

; Раздел функций:
Func _Button_value() ; <<< ВОТ СЮДА НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ _Button_value ( $aLbl, $i ), , КАК ЭТО СДЕЛАТЬ?!
	Local $i_Ind = _GetIndex(@GUI_CtrlId)
	If ($i_Ind = -1) Or ($aLbl[$i_Ind]) Then Return
	$aLbl[$i_Ind] = GUICtrlCreateLabel($i_Ind * 10, 10 - 30 + 30 * $i_Ind, 35, 30, 20, BitOR($GUI_SS_DEFAULT_LABEL, $SS_CENTER, $SS_CENTERIMAGE));Random(11, 99, 1) ; заполняется массив двухзначными числами
EndFunc   ;==>_Button_value

Func _CLOSEClicked() ; функция выхода
	If MsgBox(4 + 256, "Подтверди базар:", "Сыкануть по полной программе и свалить в ужасе?") = 6 Then Exit
	Return
EndFunc   ;==>_CLOSEClicked

Func _GetIndex($i_ID)
	For $i = 1 To $iCount
		If $aBtn[$i] = $i_ID Then Return $i
	Next
	Return -1
EndFunc   ;==>_GetIndex
Или так.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Opt('GUIOnEventMode', 1) ; включает режим OnEvent (по событию)

Global $iCount = 9
$iCount = InputBox('Сколько кнопок Вам надо?', 'Введите число от 1 до 20', $iCount); ввод кол-ва кнопок
If (@error) Or (Not StringIsDigit($iCount)) Or ($iCount < 1) Or ($iCount > 20) Then Exit ; если ошибка ввода, то выйти

Global $oID = ObjCreate('Scripting.Dictionary')
If @error Then Exit 13

$hGui = GUICreate('Кнопка и еще кнопка:', $iCount * 30 + 20, 60) ; создание окна

For $i = 1 To $iCount
	$oID.Add(GUICtrlCreateButton($i, 10 - 30 + 30 * $i, 5, 30, 20), $i) ; вывод кнопок
	GUICtrlSetOnEvent(-1, '_Button_value') ; обработка нажатий на кнопки <<< ВОТ ТУТ НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ В ФУНКЦИЮ _Button_value ( $aLbl, $i ), КАК ЭТО СДЕЛАТЬ?!
Next

GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked') ; обработка закрытия программы по крестику
GUISetState() ; видимость окна

; Тело программы:
While Sleep(1000)
WEnd

; Раздел функций:
Func _Button_value() ; <<< ВОТ СЮДА НАДО ПЕРЕДАТЬ ПАРАМЕТРЫ _Button_value ( $aLbl, $i ), , КАК ЭТО СДЕЛАТЬ?!
	Local $i_Id = @GUI_CtrlId, $i_Ind = $oID.Item($i_Id)
	If Not ($i_Ind) Or ($i_Ind > $iCount) Then Return
	$oID.Item($i_Id) = $iCount + 1
	GUICtrlCreateLabel($i_Ind * 10, 10 - 30 + 30 * $i_Ind, 35, 30, 20, BitOR($GUI_SS_DEFAULT_LABEL, $SS_CENTER, $SS_CENTERIMAGE));Random(11, 99, 1) ; заполняется массив двухзначными числами
EndFunc   ;==>_Button_value

Func _CLOSEClicked() ; функция выхода
	If MsgBox(4 + 256, 'Подтверди базар:', 'Сыкануть по полной программе и свалить в ужасе?') = 6 Then Exit
	Return
EndFunc   ;==>_CLOSEClicked
 
Верх