Что нового

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

joiner

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


Добавлено:
Сообщение автоматически объединено:

в теме мы обсуждаем код-пример, но в твоей настоящей программе, возможно, все нужно будет делать чуть по другому.
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Большое спасибо, joiner !!
Были не ясности :stars: с построением цикла For и формирование переменной $sEmpty "на лету", так сказать - теперь все :ok:

Вот пример как можно опросить массив на предмет типа данных из GUI
В примере: предполагается что дни месяца нужно представить числом а не иначе Иначе - будет ошибкой.
Код:
#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 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][3]  Then
			$Read = Execute($aContent[$i][3])
           If Not IsNumber($Read) Then $sEmpty &= $aContent[$i][2] & @CRLF

        EndIf
    Next
    If $sEmpty Then Return $sEmpty
    Return 5
EndFunc   ;==>_WRtoINI

Еще раз спасибо
ps
Если можно еще вопрос
Код:
$sEmpty &=

Это также сокращенная запись? Её можно полнее расписать?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
dr.room [?]
В примере: предполагается что дни месяца нужно представить числом

Код:
$Input1 = GUICtrlCreateInput("", 96, 160, 207, 28, $ES_NUMBER)

и не нужно проверять - число это или нет

Это также сокращенная запись? Её можно полнее расписать?
то же самое как и в сложении(пример выше)



Добавлено:
Сообщение автоматически объединено:

может так все сделать?
Код:
#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

Global $ini = @ScriptDir & '\setting.ini'
$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, $ES_NUMBER)
$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, $ES_NUMBER)
$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, $ES_NUMBER)
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 Else
					If IsString($check) Then
						MsgBox(16, "Сообщение ", "Не заполнены поля" & @CRLF & $check, 0, $Form1)
					Else
						MsgBox(64, "Сообщение ", "Записано без ошибок", 0, $Form1)
					EndIf
			EndSwitch
			ConsoleWrite(Number($check))
	EndSwitch
WEnd


Func _WRtoINI()
	Local $sEmpty
	Local $count
	Local $aContent[3][5] = [ _
			['Месяц Зимы', 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 = 3 Then Return -1
	If $sEmpty Then Return $sEmpty
	Local $sData
	For $i = 0 To 2
		If $aContent[$i][1] Then
			$sData &= '[' & $aContent[$i][4] & ']' & @CRLF & 'Вопрос=' & $aContent[$i][1] & @CRLF & 'Ответ=' & $aContent[$i][3] & @CRLF
		EndIf
	Next
	$sData = StringTrimRight($sData, 2)
	Local $ini_1 = FileOpen($ini, 8 + 2)
	If $ini_1 = -1 Then Return -2
	FileWrite($ini_1, $sData)
	FileClose($ini_1)
EndFunc   ;==>_WRtoINI
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
и не нужно проверять - число это или нет
Точно. - 1 проверка !
PS
Эх жалко элемент GUICtrlCreateCombo - не поддерживает :(

И все таки - пока что не понятно выражение :(
Код:
$count += 1

В полной записи то видимо должно быть так
Код:
$count = $count + 1

Но при этом исходно значение $count остается не определено. Может тогда $count = 0 , если оно не определено на старте ? Т.е. возможно нужно было бы так написать значение при объявлении переменой
Код:
Local $count = 0

и в цикле уже затем
Код:
Else
            $count += 1


Тогда после третьего прохода цикла $count = 3

По поводу
Код:
$sEmpty &=

подробный вариант видимо будет таким - но все равно не понятно из-за не определенности переменной :smile:
Код:
$sEmpty = $sEmpty &
 

joiner

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

dr.room

Новичок
Сообщения
283
Репутация
0
Верх