Что нового

[Массивы] Ошибка при извлечении значения из массива

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
при сохранении настроек применяется шифрование. сохраняется в текстовый файл. делаю изменения в этом файле, стираю часть . потом делаю загрузку этих настроек. естественно скрипт закрывается с ошибкой. как в функции учесть эту ошибку?
сама функция
Код:
Func Load()
	$settings_add = FileOpenDialog('Выбор файла - Settings.txt', "", '(settings.txt)', '', '', $Form)
	If $settings_add = True Then
		$Load = FileRead($settings_add)
		$Decrypt = _StringEncrypt(0, $Load, "Secret")
		$Settings = StringSplit($Decrypt, "†", 1)
		GUICtrlSetData($Input1, $Settings[1])
		GUICtrlSetData($Input2, $Settings[2])
		GUICtrlSetData($Input3, $Settings[3])
		GUICtrlSetData($Input4, $Settings[4])
		GUICtrlSetData($Input5, $Settings[5])
		GUICtrlSetData($Input6, $Settings[6])
		GUICtrlSetData($Input7, $Settings[7])
		GUICtrlSetData($Input8, $Settings[8])
	Else
		Return
	EndIf
EndFunc   ;==>Load
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Александр,
Попробуйте так:
Код:
Func Load()
	Local $sSettings_add, $sLoad, $sDecrypt, $aSettings
	$sSettings_add = FileOpenDialog('Выбор файла - Settings.txt', "", '(settings.txt)', '', '', $Form)
	If Not @error Then
		$sLoad = FileRead($sSettings_add)
		$sDecrypt = _StringEncrypt(0, $sLoad, "Secret")
		$aSettings = StringSplit($sDecrypt, "†", 1)
		If $aSettings[0] = 8 Then
			For $i = 1 To $aSettings[0]
				GUICtrlSetData(Eval('Input' & $i), $aSettings[$i])
			Next
		EndIf
	EndIf
	Return
EndFunc   ;==>Load
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
вариант работает. происходит загрузка в первое окно. хотелось бы при ошибке чтобы ничего не загружалось. возможно здесь есть это, я просто не могу понять
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
из массива мы получаем значение восьми ячеек, кроме нулевой. так как файл настроек можно открыть в блокноте, то и содержимое файла можно легко изменить. но так как это будет не корректное изменение, то в массиве может не быть значений в некоторых ячейках. в итоге вылетает ошибка. к примеру такая
Код:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
GUICtrlSetData($Input5, $Settings[5])
GUICtrlSetData($Input5, ^ ERROR
если вывести в _ArrayDisplay($Settings), то видно что после четвертого значения , если считать от единицы, ячейки пустые., поэтому и появляется ошибка с указанием на первую пустую ячейку. естественно хочется чтобы подобная ошибка не останавливала скрипт. то есть если файл поврежден и невозможно считать и назначить значения, то был холостой ход функции.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Александр
Типа так

Код:
If UBound($aSettings)<9 Then Return


проверка на размер массива. Если недостаточно ячеек то вылет из функции.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
работает. в итоге получилось так
Код:
Func Load()
	$settings_add = FileOpenDialog('Выбор файла - Settings.txt', "", '(Settings.txt)', '', '', $Form)
	$Load = FileRead($settings_add)
	$Decrypt = _StringEncrypt(0, $Load, "Secret")
	$Settings = StringSplit($Decrypt, "&#8224;", 1)
	If UBound($Settings) = 9 Then
		GUICtrlSetData($Input1, $Settings[1])
		GUICtrlSetData($Input2, $Settings[2])
		GUICtrlSetData($Input3, $Settings[3])
		GUICtrlSetData($Input4, $Settings[4])
		GUICtrlSetData($Input5, $Settings[5])
		GUICtrlSetData($Input6, $Settings[6])
		GUICtrlSetData($Input7, $Settings[7])
		GUICtrlSetData($Input8, $Settings[8])
	Else
		Return
	EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Александр
Я поправил свой пример.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
отмечу тему решенной, когда проверю оба варианта. madmasles
и AZJIO, спасибо.
madmasles, модеры не спят? ;)
знаю что это такое
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Ganibal95, переменная является массивом. только из массива выпадают нужные данные. из за чего скрипт дает ошибку.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
проверил оба варианта. все работает..можно у авторов спросить - что лучше в данной функции? я понимаю что "для всякой вещи есть место и время". ;)
 
Верх