Что нового

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

joiner

Модератор
Локальный модератор
Сообщения
3 354
Репутация
581
при сохранении настроек применяется шифрование. сохраняется в текстовый файл. делаю изменения в этом файле, стираю часть . потом делаю загрузку этих настроек. естественно скрипт закрывается с ошибкой. как в функции учесть эту ошибку?
сама функция
Код:
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 319
Александр,
Попробуйте так:
Код:
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 354
Репутация
581
вариант работает. происходит загрузка в первое окно. хотелось бы при ошибке чтобы ничего не загружалось. возможно здесь есть это, я просто не могу понять
 
Автор
joiner

joiner

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

AZJIO

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

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


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

joiner

Модератор
Локальный модератор
Сообщения
3 354
Репутация
581
работает. в итоге получилось так
Код:
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 319
Александр
Я поправил свой пример.
 
Автор
joiner

joiner

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

joiner

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

joiner

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