Что нового

[Элементы GUI] Помогите с меню. checkbox в массив

xishnik

Новичок
Сообщения
51
Репутация
0
Всем привет, прошу помощи, т.к. сталкиваюсь впервые.
Задача.
Создать окно с элементами CheckBox, Их там например 5 штук.
Я например ставлю галочку на 1, 2, 5 Checkbox и нажимаю ОК
И требуется чтобы программа создала массив такого типа:
Код:
$massiv[Количество галок] = [1 переменная,Вторая, Пятая]

Ну или например если я поставил галочку на первом и третьем checkbox, то программа создавала массив:
Код:
$massiv[2] = [$1,$3]

Заранее благодарен, мне нужен один простой пример, дальше я по аналогии разберусь.
 

madmasles

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

Opt('MustDeclareVars', 1)

Global $hGui, $aCheckbox[4][3] = [[3, 'Использовать ключ'],['', ' /Bootable', ', если образ содерждит загрузочную среду Windows PE'], _
         ['', '  /CheckIntegrity', ', чтобы администратор был уведомлен, если при добавлении образа произойдет ошибка'], _
         ['', ' /Verify', ' для проверки ошибок индексации данных в образе']], $nBtn, $sString

$hGui = GUICreate('Test CheckBox', 260, 160)
GUICtrlCreateGroup('Дополнительные ключи командной строки', 10, 10, 240, 100)
For $i = 1 To $aCheckbox[0][0]
     $aCheckbox[0][2] = GUICtrlCreateCheckbox($aCheckbox[0][1] & $aCheckbox[$i][1], 30, 30 + ($i - 1) * 25, 200, 20)
     GUICtrlSetTip($aCheckbox[0][2], $aCheckbox[0][1] & $aCheckbox[$i][1] & $aCheckbox[$i][2])
     $aCheckbox[$i][2] = $aCheckbox[0][2]
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
$nBtn = GUICtrlCreateButton('Click me', 80, 120, 100, 30)
GUISetState()

While 1
     Switch GUIGetMsg()
         Case $GUI_EVENT_CLOSE
             Exit
         Case $nBtn
             $sString = '"Начало строки"'
             For $i = 1 To $aCheckbox[0][0]
                 $sString &= $aCheckbox[$i][BitAND(GUICtrlRead($aCheckbox[$i][2]), $GUI_CHECKED)]
             Next
             $sString &= ' "конец строки"'
             MsgBox(64, 'Info', $sString, 0, $hGui)
     EndSwitch
WEnd
 
Автор
xishnik

xishnik

Новичок
Сообщения
51
Репутация
0
madmasles, большое спасибо, но я немного столкнулся с проблемой.
Ты создал почти то, что мне надо. Но я всеравно разобраться немогу.
Собственно задача:
Допустим есть онлайн игра с разными типами монстров. Скрипт нападания и боя я написал.
Мой скрипт берет монстров из:
Код:
$monstr[5] = ["1.png","2.png","3.png","4.png","5.png"]

Ну и естественно я могу поменять монстров, изменять их количество и т.д.
Но вот создать меню, очень проблемно.
По сути ты создал почти тоже самое, только как сделать, чтобы например если галка стоит на определенном монстре, после нажатия ОК, создавался массив из картинок
 

madmasles

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

Opt('MustDeclareVars', 1)

Global $hGui, $aCheckbox[6] = [5, '1.png', '2.png', '3.png', '4.png', '5.png'], $nBtn, $aChecked[1]

$hGui = GUICreate('My CheckBox', 260, 220)
GUICtrlCreateGroup('Выбор картинок', 10, 10, 240, 160)
For $i = 1 To $aCheckbox[0]
	$aCheckbox[$i] = GUICtrlCreateCheckbox($aCheckbox[$i], 30, 30 + ($i - 1) * 25, 200, 20)
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
$nBtn = GUICtrlCreateButton('Click me', 80, 180, 100, 30)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nBtn
			ReDim $aChecked[$aCheckbox[0] + 1]
			For $i = 1 To $aCheckbox[0]
				If BitAND(GUICtrlRead($aCheckbox[$i]), $GUI_CHECKED) Then
					$aChecked[0] += 1
					$aChecked[$aChecked[0]] = GUICtrlRead($aCheckbox[$i], 1)
				EndIf
			Next
			If $aChecked[0] Then
				ReDim $aChecked[$aChecked[0] + 1]
				_ArrayDisplay($aChecked)
			Else
				MsgBox(16, 'Error', 'Не выбрано ни одной картинки', 0, $hGui)
			EndIf
			ReDim $aChecked[1]
			$aChecked[0] = 0
	EndSwitch
WEnd
Или так?
Код:
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $hGui, $aRadio[5] = ['1.png', '2.png', '3.png', '4.png', '5.png'], $nBtn, $sChecked

$hGui = GUICreate('My CheckBox', 260, 220)
GUICtrlCreateGroup('Выбор картинок', 10, 10, 240, 160)
For $i = 0 To UBound($aRadio) - 1
	$aRadio[$i] = GUICtrlCreateRadio($aRadio[$i], 30, 30 + $i * 25, 50, 20)
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
GUICtrlSetState($aRadio[0], $GUI_CHECKED)
$nBtn = GUICtrlCreateButton('Click me', 80, 180, 100, 30)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nBtn
			For $nTmp In $aRadio
				If BitAND(GUICtrlRead($nTmp), $GUI_CHECKED) Then
					$sChecked = GUICtrlRead($nTmp, 1)
					ExitLoop
				EndIf
			Next
			MsgBox(64, 'Info', 'Выбрана картинка: ' & $sChecked)
			$sChecked = ''
	EndSwitch
WEnd
Или так? (При условии, что в папке со скриптом есть папка monsters, в которой лежат картинки png).
Код:
#include <GUIConstantsEx.au3>
#include <File.au3>

Opt('MustDeclareVars', 1)

Global $hGui, $aRadio, $nBtn, $sChecked

$aRadio = _FileListToArray(@ScriptDir & '\monsters', '*.png', 1)
If @error Then Exit 13
$hGui = GUICreate('My Radio', 260, $aRadio[0] * 25 + 90)
GUICtrlCreateGroup('Выбор монстров', 10, 10, 240, $aRadio[0] * 25 + 30)
For $i = 1 To $aRadio[0]
	$aRadio[$i] = GUICtrlCreateRadio($aRadio[$i], 30, 30 + ($i - 1) * 25, 200, 20)
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
GUICtrlSetState($aRadio[1], $GUI_CHECKED)
$nBtn = GUICtrlCreateButton('Click me', 80, $aRadio[0] * 25 + 50, 100, 30)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nBtn
			For $i = 1 To $aRadio[0]
				If BitAND(GUICtrlRead($aRadio[$i]), $GUI_CHECKED) Then
					$sChecked = GUICtrlRead($aRadio[$i], 1)
					ExitLoop
				EndIf
			Next
			MsgBox(64, 'Info', 'Выбрана картинка: ' & $sChecked)
			$sChecked = ''
	EndSwitch
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
xishnik [?]
нужен один простой пример, дальше я по аналогии разберусь
Может без массивов элементов будет проще понять...
Код:
#include <GUIConstantsEx.au3>
#include <Array.au3>

Global $monstr[1]

GUICreate("")
$chk1 = GUICtrlCreateCheckbox("1.png", 10, 10, 50)
$chk2 = GUICtrlCreateCheckbox("2.png", 10, 40, 50)
$chk3 = GUICtrlCreateCheckbox("3.png", 10, 70, 50)
$chk4 = GUICtrlCreateCheckbox("4.png", 10, 100, 50)
$chk5 = GUICtrlCreateCheckbox("5.png", 10, 130, 50)
$btn = GUICtrlCreateButton("Результат", 10, 160, 80)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $btn
      ; очищаем массив
      Global $monstr[1]
      ; заполняем массив (используем готовую функцию добавления в конец массива)
      If BitAND(GUICtrlRead($chk1), $GUI_CHECKED) Then _ArrayAdd($monstr, "1.png")
      If BitAND(GUICtrlRead($chk2), $GUI_CHECKED) Then _ArrayAdd($monstr, "2.png")
      If BitAND(GUICtrlRead($chk3), $GUI_CHECKED) Then _ArrayAdd($monstr, "3.png")
      If BitAND(GUICtrlRead($chk4), $GUI_CHECKED) Then _ArrayAdd($monstr, "4.png")
      If BitAND(GUICtrlRead($chk5), $GUI_CHECKED) Then _ArrayAdd($monstr, "5.png")
      ; удаляем первый пустой элемент (с индексом 0), если что-то добавили
      If UBound($monstr) > 1 Then _ArrayDelete($monstr, 0)
      ; отображаем результат
      _ArrayDisplay($monstr)
  EndSwitch
Until 0
 
Автор
xishnik

xishnik

Новичок
Сообщения
51
Репутация
0
madmasles, первый вариант идеально подошёл, всё работает. Есть только совсем небольшая загвоздка:
Maссив создаётся идеальный под мой скрипт.
Но в самом Gui окне, некрасиво выглядит 1.png,2.png... Можно ли сделать так чтобы массив создавался по тому же принципу:
Код:
$massiv[Количество галок] = [Выбранные картинки через , ]

Но чтобы в визуально не было 1.png, 2.png А хоть какие то другие названия, например Волк, зверь, и т. д.
214eba917ee9.jpg

Я имел ввиду что мне подошёл вот этот скрипт:
Код:
#include <GUIConstantsEx.au3>
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $hGui, $aCheckbox[6] = [5, '1.png', '2.png', '3.png', '4.png', '5.png'], $nBtn, $aChecked[1]

$hGui = GUICreate('My CheckBox', 260, 220)
GUICtrlCreateGroup('Выбор картинок', 10, 10, 240, 160)
For $i = 1 To $aCheckbox[0]
    $aCheckbox[$i] = GUICtrlCreateCheckbox($aCheckbox[$i], 30, 30 + ($i - 1) * 25, 200, 20)
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
$nBtn = GUICtrlCreateButton('Click me', 80, 180, 100, 30)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nBtn
            ReDim $aChecked[$aCheckbox[0] + 1]
            For $i = 1 To $aCheckbox[0]
                If BitAND(GUICtrlRead($aCheckbox[$i]), $GUI_CHECKED) Then
                    $aChecked[0] += 1
                    $aChecked[$aChecked[0]] = GUICtrlRead($aCheckbox[$i], 1)
                EndIf
            Next
            If $aChecked[0] Then
                ReDim $aChecked[$aChecked[0] + 1]
                _ArrayDisplay($aChecked)
            Else
                MsgBox(16, 'Error', 'Не выбрано ни одной картинки', 0, $hGui)
            EndIf
            ReDim $aChecked[1]
            $aChecked[0] = 0
    EndSwitch
WEnd
 

madmasles

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

Opt('MustDeclareVars', 1)

Global $hGui, $aCheckbox[1], $sIni = @ScriptDir & '\monsters.ini', $nBtn, $aChecked, $iMsg
;~ Global $aCheckbox[6][3] = [[5, ],['Злой Волк', '1.png'],['Шустрый Заяц', '2.png'],['Хитрый Лис', '3.png'], ['Мудрый Змей', '4.png'],['Сильный Слон', '5.png']]

$aChecked = IniReadSection($sIni, 'Monsters_images')
If @error Then Exit 13
ReDim $aCheckbox[$aChecked[0][0] + 1][3]
For $i = 0 To $aChecked[0][0]
	For $j = 0 To 1
		$aCheckbox[$i][$j] = $aChecked[$i][$j]
	Next
Next
$aCheckbox[0][1] = IniRead($sIni, 'Monsters_Dir', 'Dir', @ScriptDir & '\monsters\')
ReDim $aChecked[1]

$hGui = GUICreate('My monsters', 260, $aCheckbox[0][0] * 25 + 90)
GUICtrlCreateGroup('Выбор монстров', 10, 10, 240, $aCheckbox[0][0] * 25 + 30)
For $i = 1 To $aCheckbox[0][0]
	$aCheckbox[$i][2] = GUICtrlCreateButton('...', 200, 30 + ($i - 1) * 25, 30, 20)
	GUICtrlSetFont($aCheckbox[$i][2], 12, 700)
	GUICtrlSetTip($aCheckbox[$i][2], 'Посмотреть монстра ' & $aCheckbox[$i][0])
	GUICtrlSetCursor($aCheckbox[$i][2], 0)
Next
For $i = 1 To $aCheckbox[0][0]
	$aCheckbox[$i][0] = GUICtrlCreateCheckbox($aCheckbox[$i][0], 30, 30 + ($i - 1) * 25, 170, 20)
	GUICtrlSetFont($aCheckbox[$i][0], 9, 700)
	GUICtrlSetCursor($aCheckbox[$i][0], 0)
Next
;~ GUICtrlSetState($aCheckbox[1][0], $GUI_CHECKED)
GUICtrlCreateGroup('', -99, -99, 1, 1)
$nBtn = GUICtrlCreateButton('Да', 80, $aCheckbox[0][0] * 25 + 50, 100, 30)
GUISetState()

While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aCheckbox[1][2] To $aCheckbox[$aCheckbox[0][0]][2]
;~ 			здесь можно организовать просмотр монстров в отдельном окне
			For $i = 1 To $aCheckbox[0][0]
				If $aCheckbox[$i][2] = $iMsg Then
					$aCheckbox[0][2] = $aCheckbox[$i][1]
					ExitLoop
				EndIf
			Next
			MsgBox(64, 'Инфо', 'Просмотр картинки ' & $aCheckbox[0][1] & $aCheckbox[0][2], 0, $hGui)
			$aCheckbox[0][2] = ''
		Case $nBtn
			ReDim $aChecked[$aCheckbox[0][0] + 1]
			For $i = 1 To $aCheckbox[0][0]
				If BitAND(GUICtrlRead($aCheckbox[$i][0]), $GUI_CHECKED) Then
					$aChecked[0] += 1
;~ 					$aChecked[$aChecked[0]] = $aCheckbox[0][1] & $aCheckbox[$i][1]
					$aChecked[$aChecked[0]] = $aCheckbox[$i][1]
				EndIf
			Next
			If $aChecked[0] Then
				ReDim $aChecked[$aChecked[0] + 1]
				_ArrayDisplay($aChecked)
			Else
				MsgBox(16, 'Error', 'Не выбрано ни одной картинки', 0, $hGui)
			EndIf
			ReDim $aChecked[1]
			$aChecked[0] = 0
	EndSwitch
WEnd
Пример файла monsters.ini (должен лежать в папке со скриптом).
Код:
[Monsters_images]
Злой Волк=1.png
Шустрый Заяц=2.png
Хитрый Лис=3.png
Мудрый Змей=4.png
Сильный Слон=5.png
[Monsters_Dir]
Dir=C:\Users\Admin\Desktop\monsters\
 
Верх