Что нового

Запись 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,323
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
 
Автор
D

dimcomp

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

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

AZJIO

Меценат
Меценат
Сообщения
2,901
Репутация
1,200
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,970
Репутация
1,459
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
 
Верх