Что нового

[Элементы GUI] Как проставить $GUI_CHECKED исходя из умолчаний?

tarhitay

Новичок
Сообщения
18
Репутация
0
Прошу помощи сообщества, так как себе мозг сломал.
Есть некоторое количество Radio Button, объединенных в несколько групп.
Каждая группа отвечает за значение одной переменной.
Значения по умолчанию записаны в .ini, который валяется рядом.
И вот теперь вопрос. Как, зная значение по умолчанию при загрузке формы проставить нужным элементам Checked???

Проблема у меня возникла в том, что значение - string, а присвоить checked я могу функцией GUISetState, который не принимает строку в качестве ControlID.

Хотелось бы еще понять, возможна ли конструкция, подобная этой, но которая работает?? :smile:

Код:
$Radio_value=GUICtrlCreateRadio("Text", 472, 288, 145, 17)
$sString="value"
GUISetState($Radio_&$sString, $GUI_CHECKED)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
У вас такие вопросы, что мозг начинает дымиться на стадии их прочтения. :smile: Попробуйте написать более доходчиво.


Добавлено:
Сообщение автоматически объединено:

Код:
$Radio_value = GUICtrlCreateRadio("Text", 472, 288, 145, 17)
$sString = "value"
GUISetState(Eval("Radio_" & $sString), $GUI_CHECKED)



Добавлено:
Сообщение автоматически объединено:

И да, используйте массивы, тут они сами напрашиваются.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
GUICtrlSetState(Execute('$Radio_' & $sString), $GUI_CHECKED)
 
Автор
T

tarhitay

Новичок
Сообщения
18
Репутация
0
Код:
GUICtrlSetState(Execute('$Radio_' & $sString), $GUI_CHECKED)

Так не работает.

Нет! Это я дурак :( Работает, а я запятой ошибся :(

И да, используйте массивы, тут они сами напрашиваются.

А можно подробнее, как их здесь использовать?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Если я правльно понял, то у вас есть .ini, в котором переменные записаны, например, так:

Код:
key0=0
key1=0
key2=1
и т.д.

Каждая переменная соответствует своему Checkbox, которых на форме располагается довольно много. Тогда логичнее сделать так:

Код:
$Check[10][3] = [ _
		[0, 'Option 0', 'key0'], _
		[0, 'Option 1', 'key1'], _
		[0, 'Option 2', 'key2'], _
		[0, 'Option 3', 'key3'], _
		[0, 'Option 4', 'key4'], _
		[0, 'Option 5', 'key5'], _
		[0, 'Option 6', 'key6'], _
		[0, 'Option 7', 'key7'], _
		[0, 'Option 8', 'key8'], _
		[0, 'Option 9', 'key9']  _
		]

For $i = 0 To 9
	$Check[$i][0] = GUICtrlCreateCheckbox($Check[$i][1], 20, 20 + $i * 27, 100, 21)
	If Number(IniRead($sIni, 'Checkbox', $Check[$i][2], '0')) Then
		GUICtrlSetState(-1, $GUI_CHECKED)
	EndIf
Next



Добавлено:
Сообщение автоматически объединено:

tarhitay сказал(а):
Работает, а я запятой ошибся :(
Eval() как раз для этого и предназначена (см. справку), а Execute() запускает на выполнение (!) часть кода. Хоть результат и будет одинаковый, но использовать Execute() здесь крайне нелогично.
 
Автор
T

tarhitay

Новичок
Сообщения
18
Репутация
0
Честно говоря не вижу разницы в применении массива для создания группы радио баттонов или просто каждую отдельно создавать. (Тем более, что этим Kuda занимается)

А по поводу Eval()
Эта функция возвращает значение переменной и в данном случае это не будет ControlID, а будет дескриптор элемента (насколько я понял). Кстати я в первую очередь ее пробовал - не работает.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
tarhitay сказал(а):
Честно говоря не вижу разницы в применении массива для создания группы радио баттонов или просто каждую отдельно создавать.
А если их до 100 штук будет? А что вы будете делать, если нужно будет все элементы в группе сделать недоступными (DISABLE)? Хорошим стилем считается, когда используется как можно меньше переменных.

tarhitay сказал(а):
А по поводу Eval()
Эта функция возвращает значение переменной и в данном случае это не будет ControlID, а будет дескриптор элемента (насколько я понял). Кстати я в первую очередь ее пробовал - не работает.
А чем ControlID отличается от дескриптора элемента?

Код:
GUICreate("")
$Radio_value = GUICtrlCreateRadio("Text", 472, 288, 145, 17)
$sString = "value"
ConsoleWrite("ID = " & Eval("Radio_" & $sString) & @CRLF)
ConsoleWrite("ID = " & $Radio_value & @CRLF)
 

madmasles

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

Global Const $aOption_1[6] = [1, 2, 3, 4, 5, 6], $aOption_2[6] = [11, 12, 13, 14, 15, 16]
Global $sIni = @ScriptDir & '\rus.ini', $aGroupTxt, $aGroup[2], $aTmp, $aRadio_1[6], $aRadio_2[6], $iOpt_1, $iOpt_2, $idBtn

$aGroupTxt = IniReadSectionNames($sIni)
If @error Then Exit 1

$hGui = GUICreate('Test GUI', 300, 250)
$aTmp = IniReadSection($sIni, $aGroupTxt[1])
If @error Then Exit 2
$aGroup[0] = GUICtrlCreateGroup($aGroupTxt[1], 20, 10, 120, $aTmp[0][0] * 30 + 10)
For $i = 1 To $aTmp[0][0]
	$aRadio_1[$i - 1] = GUICtrlCreateRadio($aTmp[$i][0], 40, 25 + ($i - 1) * 30, 70, 20)
	GUICtrlSendMsg(-1, $BM_SETCHECK, Number($aTmp[$i][1]), 0)
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
$aTmp = IniReadSection($sIni, $aGroupTxt[2])
If @error Then Exit 2
$aGroup[1] = GUICtrlCreateGroup($aGroupTxt[2], 160, 10, 120, $aTmp[0][0] * 30 + 10)
For $i = 1 To $aTmp[0][0]
	$aRadio_2[$i - 1] = GUICtrlCreateRadio($aTmp[$i][0], 180, 25 + ($i - 1) * 30, 70, 20)
	GUICtrlSendMsg(-1, $BM_SETCHECK, Number($aTmp[$i][1]), 0)
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
$idBtn = GUICtrlCreateButton('Click me', 100, $aTmp[0][0] * 30 + 30, 100, 30)
$aGroupTxt = 0
$aTmp = 0

GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			$aTmp = GUICtrlRead($aGroup[0])
			For $i = 0 To 5
				IniWrite($sIni, $aTmp, GUICtrlRead($aRadio_1[$i], 1), GUICtrlSendMsg($aRadio_1[$i], $BM_GETCHECK, 0, 0))
			Next
			$aTmp = GUICtrlRead($aGroup[1])
			For $i = 0 To 5
				IniWrite($sIni, $aTmp, GUICtrlRead($aRadio_2[$i], 1), GUICtrlSendMsg($aRadio_2[$i], $BM_GETCHECK, 0, 0))
			Next
			Exit
		Case $idBtn
			For $i = 0 To 5
				If GUICtrlSendMsg($aRadio_1[$i], $BM_GETCHECK, 0, 0) Then
					$iOpt_1 = $aOption_1[$i]
					ExitLoop
				EndIf
			Next
			For $i = 0 To 5
				If GUICtrlSendMsg($aRadio_2[$i], $BM_GETCHECK, 0, 0) Then
					$iOpt_2 = $aOption_2[$i]
					ExitLoop
				EndIf
			Next
			MsgBox(64, 'Info', '$iOpt_1 = ' & $iOpt_1 & @LF & '$iOpt_2 = ' & $iOpt_2, 0, $hGui)
	EndSwitch
WEnd
rus.ini (можно сделать еще, например, en.ini):
Код:
[Группа опций 1]
Опция 1=0
Опция 2=1
Опция 3=0
Опция 4=0
Опция 5=0
Опция 6=0
[Группа опций 2]
Опция 11=0
Опция 12=0
Опция 13=0
Опция 14=1
Опция 15=0
Опция 16=0
Создание групп и сохранение настроек, ИМХО, лучше вынести в отдельные функции.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles

А зачем разделять $aOption_1 и $aRadio_1? IMHO, гораздо удобнее и нагляднее, когда весь мусор собран в один массив.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
А зачем разделять $aOption_1 и $aRadio_1?
ИМХО, так нагляднее, я сначала хотел вообще все в 2-х мерный массив запихать (как для себя обычно делаю).
 
Верх