Что нового

Как вернутся к редактированию GUI если запись в ini показывает ошибку в GUI ?

dr.room

Новичок
Сообщения
283
Репутация
0
Всем привет!
У меня есть GUI содержавшее 2 взаимосвязанные элемента:
  • Список: выполняет роль вопроса
  • Поле ввода: для ответа
По условию - если выбран вопрос, то ответ обязателен. Если нет - то нет, соответственно.
Контроль - построен на анализе записей в ini

Я тут не знаю как в случае обнаружения ошибки
  • Прервать проверку
  • Вывести Msgbox - о точной причине ошибки
  • Автоматически вернутся к редактированию GUI чтобы исправить ошибку, для ввода нужных данных в поле ввода
  • Если ошибок нет: вывести сообщение и скрыть GUI для возможности продолжения выполнения кода


Примечания:
В данном GUI только 2 элемента типа Вопрос/Ответ. Чтобы я мог понять сам прицип
Спасибо за помощь

Gui
Код:
#cs ----------------------------------------------------------------------------
Я не знал какие #include для данного GUI нужны и добавил все :)

#ce ----------------------------------------------------------------------------
#include <AVIConstants.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <DateTimeConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListboxConstants.au3>
#include <ListviewConstants.au3>
#include <ProgressConstants.au3>
#include <RichEditConstants.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <TreeviewConstants.au3>
#include <UpdownConstants.au3>
#include <WindowsConstants.au3>



#Region ### START Koda GUI section ### Form=D:\В Облака\IDrive - снхронизация\Общин настройки ПК\Общая оптимизация\AutoIt\Нужные мне скрипты\Биржы и почтовики\socpublic\Тесты\GUI для почтовика\Чтение настроек INI\Чтение зависимых  настроек\С GUI\Form1.kxf
$Form1 = GUICreate("Form1", 515, 292, -1, -1)
GUISetFont(10, 400, 0, "MS Sans Serif")
$iCombo1 = GUICtrlCreateCombo("", 168, 80, 207, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Январь|Февраль")
$Label1 = GUICtrlCreateLabel("Выберите месяц ", 168, 40, 134, 24)
$Label2 = GUICtrlCreateLabel("Укажите день ", 168, 120, 115, 24)
$Button1 = GUICtrlCreateButton("Старт", 400, 232, 75, 25)
$Input =  GUICtrlCreateInput("", 168, 160, 207, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button1
				$ini=@ScriptDir & '\setting.ini'
				$ini_1=FileOpen($ini, 8+2)
				FileClose($ini_1)

				Sleep(500)
				if Not  FileExists($ini) Then
				 MsgBox (262192,"Сообщение ","файл setting.ini - не найден",5)
				Exit
				EndIf

				#include "Zapic v ini .au3"
				#include "Proverka.au3"


	EndSwitch
WEnd
MsgBox (262208,"","Проверки завершены",3)
GUIDelete()
Zapic v ini .au3
Код:
#CS
Пишем значения в ini
#CE

$sRead1 = GUICtrlRead($iCombo1,1); чтение значения -  выбранного элемента
if  $sRead1 Then
IniWrite($ini, "Шаг 1", "Вопрос", $sRead1) ; запись полученных значений элемента - в ini файл
Endif


$sRead2 = GUICtrlRead($Input,1); чтение значения -  выбранного элемента
if  $sRead2 Then
IniWrite($ini, "Шаг 2", "Ответ", $sRead2) ; запись полученных значений элемента - в ini файл
Endif
Proverka.au3
Код:
$IniRead3 = IniRead($ini, "Шаг 1", "Вопрос", "") ;Проверка списка
If $IniRead3 Then

	$IniRead4 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
	If Not $IniRead4 Then
		MsgBox(262192, "Обнраужена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")

	Else
		MsgBox(262208, "", "Ошибок нет ", 3)
	EndIf
Else
	MsgBox(262208, "", "Ошибок нет ", 3)
EndIf
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Другие файлы стоит вынести в функции, или наоборот, надо создать функции внутри этих файлов и подключить их один раз в начале скрипта. Теперь если проверка "пройдена", цикл опроса GUI завершается, можно дальше писать что-то свое
Код:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>

#Region ### START Koda GUI section ### Form=D:\В Облака\IDrive - снхронизация\Общин настройки ПК\Общая оптимизация\AutoIt\Нужные мне скрипты\Биржы и почтовики\socpublic\Тесты\GUI для почтовика\Чтение настроек INI\Чтение зависимых  настроек\С GUI\Form1.kxf
$Form1 = GUICreate("Form1", 515, 292, -1, -1)
GUISetFont(10, 400, 0, "MS Sans Serif")
$iCombo1 = GUICtrlCreateCombo("", 168, 80, 207, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Январь|Февраль")
$Label1 = GUICtrlCreateLabel("Выберите месяц ", 168, 40, 134, 24)
$Label2 = GUICtrlCreateLabel("Укажите день ", 168, 120, 115, 24)
$Button1 = GUICtrlCreateButton("Старт", 400, 232, 75, 25)
$Input =  GUICtrlCreateInput("", 168, 160, 207, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While True
   Switch GUIGetMsg()
	  Case $GUI_EVENT_CLOSE
		 Exit

	  Case $Button1
		 $ini=@ScriptDir & '\setting.ini'
		 $ini_1=FileOpen($ini, 8+2)
		 FileClose($ini_1)

		 Sleep(500)
		 If Not  FileExists($ini) Then Exit MsgBox (262192,"Сообщение ","файл setting.ini - не найден",5)

		 _ZapicVIni()
		 If _Proverka() = True Then ExitLoop
    EndSwitch
WEnd
MsgBox (262208,"","Проверки завершены",3)
GUIDelete()

Func _ZapicVIni() 
   $sRead1 = GUICtrlRead($iCombo1,1); чтение значения -  выбранного элемента
   if $sRead1 Then
   IniWrite($ini, "Шаг 1", "Вопрос", $sRead1) ; запись полученных значений элемента - в ini файл
   Endif


   $sRead2 = GUICtrlRead($Input,1); чтение значения -  выбранного элемента
   If $sRead2 Then
	  IniWrite($ini, "Шаг 2", "Ответ", $sRead2) ; запись полученных значений элемента - в ini файл
   Endif
EndFunc

Func _Proverka() ; Возвращает True, если ошибок нет
   $IniRead3 = IniRead($ini, "Шаг 1", "Вопрос", "") ;Проверка списка
   If $IniRead3 Then
	  $IniRead4 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
	  If Not $IniRead4 Then
		 MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
		 Return False
	  EndIf
   EndIf
   Return True
EndFunc
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Спасибо огромное. gunter123
Можно еще вопросы?
Если я понял правильно, с помощью Retutn выполняется сразу 2 задачи (раньше просто не применял)
  • Опрос функции, как обычной, я не знаю, например, переменной
  • Выход из функции
Правильно ли будет в случае если в GUI множество пар вопрос/ответ просто добавить в функцию к if: ElseIf (для опроса новой пары - как новое условвие) + Return False т.е. по схеме что и прежде
ElseIf $IniRead3, $IniRead5, $IniRead7.... и т,д.

Код:
Func _Proverka() ; Возвращает True, если ошибок нет

	If $IniRead3 Then
		$IniRead4 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
		If Not $IniRead4 Then
			MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
			Return False
		EndIf
	ElseIf $IniRead_N1 Then ; новая пара вопрос/ответ
		$IniRead_N2 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
		If Not $IniRead_N2 Then
			MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
			Return False
		EndIf
		Return True
	EndIf
EndFunc   ;==>_Proverka
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Да, так можно делать, главное не забывать, что по умолчанию функция будет возвращать 0
Код:
Func _Proverka() ; Возвращает True, если ошибок нет

    If $IniRead3 Then
        $IniRead4 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
        If Not $IniRead4 Then
            MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
            Return False
        EndIf
    ElseIf $IniRead_N1 Then ; новая пара вопрос/ответ
        $IniRead_N2 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
        If Not $IniRead_N2 Then
            MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
            Return False
        EndIf
        Return True
    EndIf
    ; Если дойдет до этой строки, возвращаемое значение будет равно 0 (false)
EndFunc   ;==>_Proverka
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Да, так можно делать, главное не забывать, что по умолчанию функция будет возвращать 0
Т.е. нужно просто переопределить значение Return с False на Return True, после завершение проверки т.е. после EndIf, чтобы избежать логической ошибки ?
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Я о том, что при таких проверках может случиться так что не будет выбран ни один из вариантов в блоках If-Else, и по умолчанию когда функция закончит этот "опрос" и дойдет до своей последней строчки, она вернет false, если вручную не записать возвращаемое значение, и стоит учитывать это при построении скрипта.
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Здравствуйте, gunter123

Я попробовал - и у меня что-то не очень получаться при проверке 2х пар вопрос/ответ
в одном GUI

Не хочет переходить к проверке пары вопрос/ответ 2
Не смоделирована ситуация, если найденная ошибка в паре 1 вопрос/ответ - будет исправлена.
Помогите, пожалуйста
Код:
#cs ----------------------------------------------------------------------------
	Нет перехода к проверке пары вопрос/ответ 2
	- в случае если в паре 1 вопрос/ответ  успешно читаются

#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ###
$Form1 = GUICreate("Form1", 891, 293, -1, -1)
GUISetFont(10, 400, 0, "MS Sans Serif")
$iCombo1 = GUICtrlCreateCombo("", 168, 80, 207, 25)
GUICtrlSetData(-1, "Январь|Февраль")
$Label1 = GUICtrlCreateLabel("Выберите месяц зимы", 168, 40, 214, 24)
$Label2 = GUICtrlCreateLabel("Укажите день", 168, 120, 115, 24)
$Button1 = GUICtrlCreateButton("Старт", 400, 232, 75, 25)
$Input1 = GUICtrlCreateInput("", 168, 160, 207, 28)
$Label3 = GUICtrlCreateLabel("Выберите месяц лета", 504, 40, 214, 24)
$iCombo2 = GUICtrlCreateCombo("", 504, 80, 207, 28)
GUICtrlSetData(-1, "Июнь|Июль")
$Label4 = GUICtrlCreateLabel("Укажите день", 504, 120, 115, 24)
$Input2 = GUICtrlCreateInput("", 504, 160, 207, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$ini = @ScriptDir & '\setting.ini'
			$ini_1 = FileOpen($ini, 8 + 2)
			FileClose($ini_1)

			Sleep(500)
			If Not FileExists($ini) Then Exit MsgBox(262192, "Сообщение ", "файл setting.ini - не найден", 5)

			_ZapicVIni()
			If _Proverka() = True Then ExitLoop ; Выход из Цикла а значит из проверки GUI  - только тогда когда -  нет ошибок !! т.е.  True ! Не иначе

	EndSwitch
WEnd


Func _ZapicVIni()
	$sRead1 = GUICtrlRead($iCombo1, 1) ; чтение значения -  выбранного элемента
	If $sRead1 Then
		IniWrite($ini, "Шаг 1", "Вопрос", $sRead1) ; запись полученных значений элемента - в ini файл
	EndIf


	$sRead2 = GUICtrlRead($Input1, 1) ; чтение значения -  выбранного элемента
	If $sRead2 Then
		IniWrite($ini, "Шаг 2", "Ответ", $sRead2) ; запись полученных значений элемента - в ini файл
	EndIf


	$sRead3 = GUICtrlRead($iCombo2, 1) ; чтение значения -  выбранного элемента
	If $sRead3 Then
		IniWrite($ini, "Шаг 3", "Вопрос", $sRead3) ; запись полученных значений элемента - в ini файл
	EndIf


	$sRead4 = GUICtrlRead($Input2, 1) ; чтение значения -  выбранного элемента
	If $sRead4 Then
		IniWrite($ini, "Шаг 4", "Ответ", $sRead4) ; запись полученных значений элемента - в ini файл
	EndIf

EndFunc   ;==>_ZapicVIni

Func _Proverka() ; Возвращает True, если ошибок нет

Local $IniRead_ini1, $IniRead_ini2, $IniRead_ini3, $IniRead_ini4

		$IniRead_ini1 = IniRead($ini, "Шаг 1", "Вопрос", "") ;Проверка списка
	If $IniRead_ini1 Then
		$IniRead_ini2 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
		If Not $IniRead_ini2 Then
			MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
			Return False
		EndIf

		$IniRead_ini3 = IniRead($ini, "Шаг 3", "Вопрос", "") ;Проверка списка
	ElseIf $IniRead_ini3 Then
		$IniRead_ini4 = IniRead($ini, "Шаг 4", "Ответ", "") ; Проверка поля ввода
		If Not $IniRead_ini4 Then
			MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
			Return False
		EndIf


	EndIf
	Return True
EndFunc   ;==>_Proverka
MsgBox(262208, "", "Ошибок нет", 3)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#cs ----------------------------------------------------------------------------
	Нет перехода к проверке пары вопрос/ответ 2
	- в случае если в паре 1 вопрос/ответ  успешно читаются

#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $ini = @ScriptDir & '\setting.ini'
#Region ### START Koda GUI section ###
Global $Form1 = GUICreate("Form1", 891, 293, -1, -1)
GUISetFont(10, 400, 0, "MS Sans Serif")
$iCombo1 = GUICtrlCreateCombo("", 168, 80, 207, 25)
GUICtrlSetData(-1, "Январь|Февраль")
$Label1 = GUICtrlCreateLabel("Выберите месяц зимы", 168, 40, 214, 24)
$Label2 = GUICtrlCreateLabel("Укажите день", 168, 120, 115, 24)
$Button1 = GUICtrlCreateButton("Старт", 400, 232, 75, 25)
$Input1 = GUICtrlCreateInput("", 168, 160, 207, 28)
$Label3 = GUICtrlCreateLabel("Выберите месяц лета", 504, 40, 214, 24)
$iCombo2 = GUICtrlCreateCombo("", 504, 80, 207, 28)
GUICtrlSetData(-1, "Июнь|Июль")
$Label4 = GUICtrlCreateLabel("Укажите день", 504, 120, 115, 24)
$Input2 = GUICtrlCreateInput("", 504, 160, 207, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Local $check = _WR()
			Switch $check
				Case -1
					MsgBox(16, "Сообщение ", "Ошибка создания файла настроек", 0, $Form1)
				Case -2
					MsgBox(16, "Сообщение ", "Заполните поля", 0, $Form1)
				Case 1, 2, 3, 4
					MsgBox(16, "Сообщение ", "Ошибка записи - " & $check, 0, $Form1)
				Case 5, 6
					MsgBox(64, "Сообщение ", "Записано без ошибок", 0, $Form1)
			EndSwitch
	EndSwitch
WEnd

Func _WR()
	Local $ini_1 = FileOpen($ini, 8 + 2)
	If $ini_1 = -1 Then
		MsgBox(16, "Сообщение ", "Ошибка создания файла настроек", 0, $Form1)
		Return -1
	EndIf
	FileClose($ini_1)
	Return _WRtoINI()
EndFunc   ;==>_WR


Func _WRtoINI()
	Local $check = -2
	Local $sRead1 = GUICtrlRead($iCombo1, 1) ; чтение значения -  выбранного элемента
	Local $sRead2 = GUICtrlRead($Input1, 1) ; чтение значения -  выбранного элемента
	If $sRead1 And $sRead2 Then
		Local $wr1 = IniWrite($ini, "Шаг 1", "Вопрос", $sRead1) ; запись полученных значений элемента - в ini файл
		If Not $wr1 Then Return 1
		Local $wr2 = IniWrite($ini, "Шаг 2", "Ответ", $sRead2) ; запись полученных значений элемента - в ini файл
		If Not $wr2 Then Return 2
		$check = 5
	EndIf

	Local $sRead3 = GUICtrlRead($iCombo2, 1) ; чтение значения -  выбранного элемента
	Local $sRead4 = GUICtrlRead($Input2, 1) ; чтение значения -  выбранного элемента
	If $sRead3 And $sRead4 Then
		Local $wr3 = IniWrite($ini, "Шаг 3", "Вопрос", $sRead3) ; запись полученных значений элемента - в ini файл
		If Not $wr3 Then Return 3
		Local $wr4 = IniWrite($ini, "Шаг 4", "Ответ", $sRead4) ; запись полученных значений элемента - в ini файл
		If Not $wr4 Then Return 4
		$check = 6
	EndIf
	Return $check
EndFunc   ;==>_WRtoINI
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
joiner
Спасибо, я не все понял (для меня сложный случай) - попробую разобраться
По минимуму немного не понял почему значение переменной $check меняется т.е. что означают эти цифры: 6,5,-2 и также в отношении Return - что означают разные цифры 1,2,3,4,: это произвольные значения (интересно - не знал что так можно), указывающие на отсутствие записи в ini ?
И похоже - если указать день для зимнего месяца то не проверяет день в летнем месяце, и наоборот :(
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
из всей темы я понял, что нужна проверка пар(блоков). Зима- месяц, день это один блок(пара) и лето-месяц день тоже пара
пары проверяются на наличие записи. если нет одной записи, то пара не пишется, но при этом другая пара может записаться, если она заполнена. проверяются ошибки на запись в файл, они пронумерованы от 1 до 4.
$check - переменная локальная в функции и в основном цикле это разные переменные(читай справку)
$check(5или6) - просто чтобы указать, что было записано. если будет -2, значит в обеих парах не было заполнено хотя бы одно поле
если нужно условие, чтобы все четыре поля были заполнены, то можно в одну строку свести проверку чтения, если хотя бы один элемент при чтении возвращает ноль, то функция выходит с ошибкой - не все поля заполнены
короче, я сделал пример как понял задачу. если что-то не понял, то :smile:

OffTopic:
как совет - учись не "абракадабрить" коды. в первую очередь - всегда объявляй переменные(локальные или глобальные) и так далее
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Зима- месяц, день это один блок(пара) и лето-месяц день тоже пара
А - я понял. Блоком, по условию, есть месяц/день - не месяц/месяц/день/день
Месяц - вопрос, день - ответ
если нужно условие, чтобы все четыре поля были заполнены
  • Нужно чтобы были все поля заполнены что соответствуют статусу: ответ т.е. "дни"
  • Но только в случае, если - задан вопрос т.е. заполнено поле "месяц"
  • В сообщении об ошибке, должна быть возможность: точно указать какое поле требуется заполнить но сейчас не заполнено
Это все условия :smile:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Local $check = _WRtoINI()
			Switch $check
				Case -1
					MsgBox(16, "Сообщение ", "Ошибка создания файла настроек", 0, $Form1)
				Case 1, 2, 3, 4
					MsgBox(16, "Сообщение ", "Ошибка записи - " & $check, 0, $Form1)
				Case 5
					MsgBox(64, "Сообщение ", "Записано без ошибок", 0, $Form1)
				Case Else
					 MsgBox(16, "Сообщение ", "Не заполнены поля" & @CRLF & $check, 0, $Form1)
			EndSwitch
	EndSwitch
WEnd

Func _WRtoINI()
	Local $sEmpty
	Local $aContent[2][4] = [['Месяц Зимы', GUICtrlRead($iCombo1), 'День Зимы', GUICtrlRead($Input1)], ['Месяц Лета', GUICtrlRead($iCombo2), 'День Лета', GUICtrlRead($Input2)]]
	For $i = 0 To 1
		If Not $aContent[$i][1] Then $sEmpty &= $aContent[$i][0] & @CRLF
		If Not $aContent[$i][3] Then $sEmpty &= $aContent[$i][2] & @CRLF
	Next
	If $sEmpty Then Return $sEmpty
		Local $ini_1 = FileOpen($ini, 8 + 2)
	If $ini_1 = -1 Then
		MsgBox(16, "Сообщение ", "Ошибка создания файла настроек", 0, $Form1)
		Return -1
	EndIf
	FileClose($ini_1)
	If Not IniWrite($ini, "Шаг 1", "Вопрос", $aContent[0][1]) Then Return 1
	If Not IniWrite($ini, "Шаг 2", "Ответ", $aContent[0][3]) Then Return 2
	If Not IniWrite($ini, "Шаг 3", "Вопрос", $aContent[1][1]) Then Return 3
	If Not IniWrite($ini, "Шаг 4", "Ответ", $aContent[1][3]) Then Return 4
	Return 5
EndFunc   ;==>_WRtoINI
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Спасибо, joiner
По меньшей мере 1 условие учтено. Но этого, к сожалению, не достаточно.
Я не предполагал даже что задача может оказаться настолько не простой
Эх, надо было тему в разделе Стол заказов создавать :(
Спасибо Вам за Ваше терпение.
 

Вложения

  • 3 условия.png
    3 условия.png
    16.7 КБ · Просмотры: 13

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
я бы так спросил - если заполнен Месяц, то должен быть заполнен день
статусы, ответы-вопросы - эти термины лишние в обсуждение.
Код:
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Local $check = _WRtoINI()
			Switch $check
				Case -1
					MsgBox(64, "Сообщение ", "Нет данных для записи", 0, $Form1)
				Case -2
					MsgBox(16, "Сообщение ", "Ошибка создания файла настроек", 0, $Form1)
				Case 1, 2, 3, 4
					MsgBox(16, "Сообщение ", "Ошибка записи - " & $check, 0, $Form1)
				Case 5
					MsgBox(64, "Сообщение ", "Записано без ошибок", 0, $Form1)
				Case Else
					MsgBox(16, "Сообщение ", "Не заполнены поля" & @CRLF & $check, 0, $Form1)
			EndSwitch
	EndSwitch
WEnd

Func _WRtoINI()
	Local $sEmpty
	Local $count
	Local $aContent[2][4] = [['Месяц Зимы', GUICtrlRead($iCombo1), 'День Зимы', GUICtrlRead($Input1)], ['Месяц Лета', GUICtrlRead($iCombo2), 'День Лета', GUICtrlRead($Input2)]]
	For $i = 0 To 1
		If $aContent[$i][1] Then
			If Not $aContent[$i][3] Then $sEmpty &= $aContent[$i][2] & @CRLF
		Else
			$count += 1
		EndIf
	Next
	If $count = UBound($aContent) Then Return -1
	If $sEmpty Then Return $sEmpty
	Local $ini_1 = FileOpen($ini, 8 + 2)
	If $ini_1 = -1 Then Return -2
	FileClose($ini_1)
	If Not IniWrite($ini, "Шаг 1", "Вопрос", $aContent[0][1]) Then Return 1
	If Not IniWrite($ini, "Шаг 2", "Ответ", $aContent[0][3]) Then Return 2
	If Not IniWrite($ini, "Шаг 3", "Вопрос", $aContent[1][1]) Then Return 3
	If Not IniWrite($ini, "Шаг 4", "Ответ", $aContent[1][3]) Then Return 4
	Return 5
EndFunc   ;==>_WRtoINI
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Все работает, joiner. Фантастика !
Вы использовали массивы в скрипте - а это то что я редко использую. Наверное из-за этого запутался. А мне очень нужно понять как всё работает чтобы масштабировать Ваш пример
Пожалуйста прокомментируйте строки
Например я не могу понять строки
Код:
Local $aContent[2][4] = [['Месяц Зимы', GUICtrlRead($iCombo1), 'День Зимы', GUICtrlRead($Input1)], ['Месяц Лета', GUICtrlRead($iCombo2), 'День Лета', GUICtrlRead($Input2)]]
    For $i = 0 To 1
        If $aContent[$i][1] Then
            If Not $aContent[$i][3] Then $sEmpty &= $aContent[$i][2] & @CRLF
        Else
            $count += 1
        EndIf
    Next
    If $count = UBound($aContent) Then Return -1
    If $sEmpty Then Return $sEmpty


А еше в этой строке, разве необходимо: & @CRLF?
Код:
If Not $aContent[$i][3] Then $sEmpty &= $aContent[$i][2] & @CRLF
 

joiner

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

в цикле опрашиваем - заполнены ли поля Месяц, если да, то сразу проверяем заполнено ли поле День. Если не заполнен День. то собираем строку для вывода в сообщение
Код:
$sEmpty &= $aContent[$i][2] & @CRLF
...................................................
If $sEmpty Then Return $sEmpty

символ переноса нужен для того, чтобы данные в MsgBox были столбиком. Ну а там как душе угодно, можно и в одну строку все расположить

Код:
$count += 1

если не заполнены поля Месяц, то эта переменная суммирует количество полей
Код:
If $count = UBound($aContent) Then Return -1

в итоге, если все поля Месяц не заполнены, то будет сообщение, что нет данных для записи
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
joiner
Огромное спасибо за подсказки!
Мне нужно было время чтобы немного улучшить своё представление о массивах, иначе трудно было разобраться.
Затем - было нужно получить представление об массиве из GUI
Код:
#include <Array.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ###
Global $Form1 = GUICreate("Form1  Display", 891, 293, -1, -1)
GUISetFont(10, 400, 0, "MS Sans Serif")
$iCombo1 = GUICtrlCreateCombo("", 168, 80, 207, 25)
GUICtrlSetData(-1, "Январь|Февраль")
$Label1 = GUICtrlCreateLabel("Выберите месяц зимы", 168, 40, 214, 24)
$Label2 = GUICtrlCreateLabel("Укажите день", 168, 120, 115, 24)
$Button1 = GUICtrlCreateButton("Старт", 400, 232, 75, 25)
$Input1 = GUICtrlCreateInput("", 168, 160, 207, 28)
$Label3 = GUICtrlCreateLabel("Выберите месяц лета", 504, 40, 214, 24)
$iCombo2 = GUICtrlCreateCombo("", 504, 80, 207, 28)
GUICtrlSetData(-1, "Июнь|Июль")
$Label4 = GUICtrlCreateLabel("Укажите день", 504, 120, 115, 24)
$Input2 = GUICtrlCreateInput("", 504, 160, 207, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
			Local $aContent[2][4] = [['Месяц Зимы', GUICtrlRead($iCombo1), 'День Зимы', GUICtrlRead($Input1)], ['Месяц Лета', GUICtrlRead($iCombo2), 'День Лета', GUICtrlRead($Input2)]]
			_ArrayDisplay($aContent,"Что тут у нас...  :)")
    EndSwitch
WEnd
Дальше я почти все понял ;) и переписал GUI - добавив 3-тий блок для проверки
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=C:\Users\User\Documents\Autoit Test\Форма\3 строки.kxf
$Form1 = GUICreate("Form1", 1025, 288, -1, -1)
GUISetFont(10, 400, 0, "MS Sans Serif")
$iCombo1 = GUICtrlCreateCombo("", 96, 80, 207, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Январь|Февраль")
$Label1 = GUICtrlCreateLabel("Выберите месяц зимы", 96, 40, 214, 24)
$Label2 = GUICtrlCreateLabel("Укажите день", 96, 120, 115, 24)
$Button1 = GUICtrlCreateButton("Старт", 475, 232, 75, 25)
$Input1 = GUICtrlCreateInput("", 96, 160, 207, 28)
$Label3 = GUICtrlCreateLabel("Выберите месяц лета", 416, 40, 214, 24)
$iCombo2 = GUICtrlCreateCombo("", 416, 80, 207, 28, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Июнь|Июль")
$Label4 = GUICtrlCreateLabel("Укажите день", 416, 120, 115, 24)
$Input2 = GUICtrlCreateInput("", 416, 160, 207, 28)
$Label5 = GUICtrlCreateLabel("Выберите месяц весны", 712, 40, 214, 24)
$iCombo3 = GUICtrlCreateCombo("", 712, 80, 207, 28, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Апрель|Май")
$Label6 = GUICtrlCreateLabel("Укажите день", 712, 120, 115, 24)
$Input3 = GUICtrlCreateInput("", 712, 160, 207, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Local $check = _WRtoINI()
			Switch $check
				Case -1
					MsgBox(64, "Сообщение ", "Нет данных для записи", 0, $Form1)
				Case -2
					MsgBox(16, "Сообщение ", "Ошибка создания файла настроек", 0, $Form1)
				Case 1, 2, 3, 4
					MsgBox(16, "Сообщение ", "Ошибка записи - " & $check, 0, $Form1)
				Case 5
					MsgBox(64, "Сообщение ", "Записано без ошибок", 0, $Form1)
				Case Else
					MsgBox(16, "Сообщение ", "Не заполнены поля" & @CRLF & $check, 0, $Form1)
			EndSwitch

	EndSwitch
WEnd


Func _WRtoINI()
    Local $sEmpty
    Local $count
    Local $aContent[3][4] =[['Месяц Зимы', GUICtrlRead($iCombo1), 'День Зимы', GUICtrlRead($Input1)],['Месяц Лета', GUICtrlRead($iCombo2), 'День Лета', GUICtrlRead($Input2)],['Месяц Весны', GUICtrlRead($iCombo3), 'День Весны', GUICtrlRead($Input3)]]




    For $i = 0 To 2
        If $aContent[$i][1] Then
            If Not $aContent[$i][3] Then $sEmpty &= $aContent[$i][2] & @CRLF
        Else
            $count += 1
        EndIf
    Next
    If $count = UBound($aContent) Then Return -1
    If $sEmpty Then Return $sEmpty
    Return 5
EndFunc   ;==>_WRtoINI
И все получилось :ok:
Поражает компактность Вашего кода и вместе с тем - функциональность ... Что собственно и подтолкнуло меня на его дальнейшее изучение

Если можно еще пару вопросов?
Почему у переменной $count 2 действия т.е. += а не просто =
Код:
$count += 1

И я не совсем представляю как цикл взаимодействует с массивом.
Цикл проводит проверку всех элементов массива - создавая как бы таблицу и опрашивая по-срочно её элементы ? Причем циклу нужен всего 1 проход? Пока не индекс строки не совпадает с конечным числом переменной счётчика?

А и еще - чтобы продолжить работу скрипта - нужно выйти из цикла через ExitLoop или просто добавить GUIDelete() ?
И нельзя ли что-то придумать чтобы значения массива писать не в 1 строку а переносить на новую строку: чтобы удобно в просмотре было. Хотя с переносом строк вроде есть решение уже
Код:
Local $aContent[3][4] =[ _
	['Месяц Зимы', GUICtrlRead($iCombo1), 'День Зимы', GUICtrlRead($Input1)], _
	['Месяц Лета', GUICtrlRead($iCombo2), 'День Лета', GUICtrlRead($Input2)], _
	['Месяц Весны', GUICtrlRead($iCombo3), 'День Весны', GUICtrlRead($Input3)] _
	]

Спасибо
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
dr.room [?]
Почему у переменной $count 2 действия т.е. += а не просто =
это обычное сложение
Код:
;подробный вариант
$count = $count + 1
;в компактном варианте
$count += 1


Цикл проводит проверку всех элементов массива - создавая как бы таблицу и опрашивая по-срочно её элементы ? Причем циклу нужен всего 1 проход? Пока не индекс строки не совпадает с конечным числом переменной счётчика?
да, построчно. Не один проход, два. В массиве две строки(индекса) - 0,1

А и еще - чтобы продолжить работу скрипта - нужно выйти из цикла через ExitLoop или просто добавить GUIDelete() ?
смотря в каких случаях. пример
Код:
#include <GUIConstantsEx.au3>

Global $Form1 = GUICreate("Form1", 850, 440, -1, -1)
Local $BT = GUICtrlCreateButton('Кнопка', 20, 20, 70, 25)
Global $LB = GUICtrlCreateLabel('', 20, 50, 100, 25)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $BT
			_NW()

	EndSwitch
WEnd

Func _NW()
	Local $Form2 = GUICreate("Form1", 200, 100, -1, -1, -1, -1, $Form1)
	GUISetState()
	Local $i
	While 1
		$i += 1
		GUICtrlSetData($LB, $i)
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				GUICtrlSetData($LB, '')
				GUIDelete($Form2); удаляет дочернее окно
				ExitLoop;выход из цикла дочернего окна, продолжает работать цикл основного окна, в данном случае можно использовать Return как выход из функции
				;если нет других действий в самой функции
				; оба условия обязательны

		EndSwitch
	WEnd
EndFunc   ;==>_NW

второй пример
Код:
#include <GUIConstantsEx.au3>

Local $Form1 = GUICreate("Form1", 850, 440, -1, -1)
Local $BT = GUICtrlCreateButton('Кнопка', 20, 20, 70, 25)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $BT
			GUIDelete($Form1)
			ExitLoop

	EndSwitch
WEnd

_NW()

Func _NW()
	Local $Form2 = GUICreate("Form1", 200, 100, -1, -1)
	Local $LB = GUICtrlCreateLabel('', 20, 50, 50, 25)
	GUISetState()
	Local $i
	While 1
		$i += 1
		GUICtrlSetData($LB, $i)
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit

		EndSwitch
	WEnd
EndFunc   ;==>_NW
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Не один проход, два. В массиве две строки(индекса) - 0,1
Но считывает эти строки цикл - за одно повторение ? Иначе если за 2, то я не понимаю, как тогда скрипт запоминает (и где хранит) полученные данные из массива? Ведь эти данные передаются в Msgbox.

Чтобы быть уверенным что UBound сообщает что 2 = Указано неверное измерение массива. Понял. Значит ли что если при опросе массива, данные не получены это и есть неверное измерение массива (т.е. 1 из таких случаев)?
 
Верх