Что нового

Запись checkbox в ini файл, как сократить IniRead и IniWrite?

dimcomp

Новичок
Сообщения
66
Репутация
0
Нужно сократить скрипт, никак не могу разобраться как(
есть код

Код:
If IniRead(@ScriptDir & '\config.ini', 'Options', 'Checkbox1', '') = 1 Then GUICtrlSetState($CheckBox1, 1)
If IniRead(@ScriptDir & '\config.ini', 'Options', 'Checkbox2', '') = 1 Then GUICtrlSetState($CheckBox2, 1)
;....
If IniRead(@ScriptDir & '\config.ini', 'Options', 'Checkbox96', '') = 1 Then GUICtrlSetState($CheckBox96, 1)
If IniRead(@ScriptDir & '\config.ini', 'Options', 'Checkbox97', '') = 1 Then GUICtrlSetState($CheckBox97, 1)

и
Код:
Case $CheckBox1
            IniWrite(@ScriptDir & '\config.ini', 'Options', 'CheckBox1', GUICtrlRead($CheckBox1))
		Case $CheckBox2
            IniWrite(@ScriptDir & '\config.ini', 'Options', 'CheckBox2', GUICtrlRead($CheckBox2))
;...
Case $CheckBox96
            IniWrite(@ScriptDir & '\config.ini', 'Options', 'CheckBox96', GUICtrlRead($CheckBox96))
		Case $CheckBox97
            IniWrite(@ScriptDir & '\config.ini', 'Options', 'CheckBox97', GUICtrlRead($CheckBox97))


вот как бы его сократить, чекбоксы будут только расти
 

madmasles

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

Global $iCount = 100, $aChBx[$iCount + 1], $hGui, $iMsg, $sIni = @ScriptDir & '\config.ini'

$hGui = GUICreate('Test', 500, $iCount / 5 * 30 + 20)
For $i = 1 To $iCount Step 5
	For $j = 0 To 4
		$aChBx[0] += 1
		$iMsg = Int(IniRead($sIni, 'Options', 'Checkbox' & $aChBx[0], '1'))
		$aChBx[$aChBx[0]] = GUICtrlCreateCheckbox('Checkbox' & $aChBx[0], 10 + $j * 100, 10 + $i / 5 * 30, 90, 20)
		If $iMsg Then GUICtrlSetState(-1, $GUI_CHECKED)
	Next
Next
$iMsg = 0
GUISetState()

While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			For $i = 1 To $iCount
				IniWrite($sIni, 'Options', 'Checkbox' & $i, BitAND(GUICtrlRead($aChBx[$i]), $GUI_CHECKED))
			Next
			Exit
	EndSwitch
WEnd
Или.
Код:
#include <GUIConstantsEx.au3>

Global $iCount = 100, $aChBx[$iCount + 1], $hGui, $iMsg, $sIni = @ScriptDir & '\config.ini', $iTemp

If Not FileExists($sIni) Then
	For $i = 1 To $iCount
		IniWrite($sIni, 'Options', 'Checkbox' & $i, 1)
	Next
EndIf
$hGui = GUICreate('Test', 500, $iCount / 5 * 30 + 20)
For $i = 1 To $iCount Step 5
	For $j = 0 To 4
		$aChBx[0] += 1
		$iTemp = Int(IniRead($sIni, 'Options', 'Checkbox' & $aChBx[0], '1'))
		$aChBx[$aChBx[0]] = GUICtrlCreateCheckbox('Checkbox' & $aChBx[0], 10 + $j * 100, 10 + $i / 5 * 30, 90, 20)
		If $iTemp Then GUICtrlSetState(-1, $GUI_CHECKED)
	Next
Next
$iTemp = $aChBx[1] - 1
GUISetState()

While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aChBx[1] To $aChBx[$aChBx[0]]
			IniWrite($sIni, 'Options', 'Checkbox' & $iMsg - $iTemp, BitAND(GUICtrlRead($iMsg), $GUI_CHECKED))
	EndSwitch
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
dimcomp [?]
как бы его сократить
Код:
For $i = 1 To 97
  If IniRead(@ScriptDir & '\config.ini', 'Options', 'Checkbox' & $i, '') = 1 Then GUICtrlSetState(Eval("CheckBox" & $i), 1)
Next

For $i = 1 To 97
  IniWrite(@ScriptDir & '\config.ini', 'Options', 'CheckBox' & $i, GUICtrlRead(Eval("CheckBox" & $i)))
Next
 
Автор
D

dimcomp

Новичок
Сообщения
66
Репутация
0
InnI
Читает правильно, но записывает как будто я не отмечал ничего.

madmasles
А если чексбоксы уже созданы, что делать вот с этим?
Код:
$aChBx[$aChBx[0]] = GUICtrlCreateCheckbox('Checkbox' & $aChBx[0], 10 + $j * 100, 10 + $i / 5 * 30, 90, 20)
 
Автор
D

dimcomp

Новичок
Сообщения
66
Репутация
0
madmasles
Код:
$Form2 = GUICreate("тест", 800, 445, -1, -1)

GUICtrlCreateGroup("группа", 10, 10, 160, 425)
$Checkbox1 = GUICtrlCreateCheckbox("текст1", 15, 25, 150, 25)
$Checkbox2 = GUICtrlCreateCheckbox("текст2", 15, 45, 150, 25)
$Checkbox3 = GUICtrlCreateCheckbox("текст3", 15, 65, 150, 25)


p.s. как тут цитаты вставлять?)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
dimcomp [?]
p.s. как тут цитаты вставлять?)
Выделите текст, появится подсказка "Цитировать".
Или...
quote.gif
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
1. Сначала надо решить, использовать ли переменную для хранения флага или сам чекбокс оправшивать? Если сам чекбокс, то много текста в коде и иногда окно настройки с чекбоксами может быть закрыто и как получить флаг?
2. Сравнивать прочитанные текстовые данные с ini-файла с числовым форматом не совсем корректно. Необходимо преобразование в прочитанного в число. Кроме этого нужно разрулить ситуацию с невалидными данными, например число кроме 0 и 1, или буквы вместо чисел или вообще пусто.
3. Как записывать как реальные флаги чекбокса 1 и 4 или конвертировать 4 в 0? Лучше конвертировать, потому что конструкции условия легче создавать и ini-файл читабельный будет.
4. Для каждого чекбокса иногда нужно создать ещё одно значение по умолчанию. Оно во первых нужно для указания в качестве default для ini-функции, во вторых в случае использования сброса данных в "по умолчанию".

В общем тут можно реально писать концепцию для нескольких вариантов конфигурации программы.
 
Автор
D

dimcomp

Новичок
Сообщения
66
Репутация
0
InnI
А нет, ошибся) твой вариант работает :beer: код записи не туда воткнул просто) тема решена.
 
Автор
D

dimcomp

Новичок
Сообщения
66
Репутация
0
Возникла проблема при обфускации файла так как присутствует eval
попробовал сделать так:
Код:
#Obfuscator_Off
For $i = 1 To 97
  If IniRead(@ScriptDir & '\config.ini', 'Options', 'Checkbox' & $i, '') = 1 Then GUICtrlSetState(Eval("CheckBox" & $i), 1)
Next
#Obfuscator_On

и тоже самое для записи. Но при компиляции настройки в config.ini не сохраняются(
как быть?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
dimcomp [?]
настройки не сохраняются
Естественно. После обфускации названия переменных $Checkbox1, $Checkbox2... будут совсем другими и функции их просто не найдут.

Переписать код с использованием массива элементов. Тем более, что визуально это будет отличаться только скобками: был $Checkbox1 станет $Checkbox[1] и т.д. Тогда и Eval не понадобится:
Код:
For $i = 1 To 97
  If IniRead(@ScriptDir & '\config.ini', 'Options', 'Checkbox' & $i, '') = 1 Then GUICtrlSetState($CheckBox[$i], 1)
Next
 
Верх