Что нового

[Окна, Диалоги] Сохнанить активне значения Checkox и записать их в INI файл

Fanatmb

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

Есть окно в котором несколько групп элементов, которые задают условия выполнения задачи.
Ключ - Номер сообщения, он же является названием блока в INI файле

Каким образом сохранить данные из каждой группы в файл?
Как лучше записать значение мин./часы.

Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <FTPEx.au3>

Local $name_rules
$sPath_ini = @ScriptDir & "\rules.ini"

#Region ### START Koda GUI section ###
$Form1_1 = GUICreate("Form1", 286, 361, 205, 129)
$Group1 = GUICtrlCreateGroup("Тип события", 16, 10, 255, 71)
$Radio1 = GUICtrlCreateRadio("Входящее", 24, 26, 80, 17)
$Radio2 = GUICtrlCreateRadio("Исходящее", 24, 50, 80, 17)

GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label1 = GUICtrlCreateLabel("Номер сообщения", 120, 26, 98, 17)
$Input1 = GUICtrlCreateInput("", 220, 22, 41, 21)

$Group4 = GUICtrlCreateGroup("Файл-источник", 112, 42, 153, 36)
$Input4 = GUICtrlCreateInput("", 120, 55, 100, 20)
$Button3 = GUICtrlCreateButton("Файл", 221, 54, 41, 20, 0)


$Group2 = GUICtrlCreateGroup("Периодичность", 16, 80, 255, 89)
$Radio3 = GUICtrlCreateRadio("Однократно", 24, 96, 90, 20)
$Radio4 = GUICtrlCreateRadio("Ежедневно в", 145, 96, 85, 20)
$Input5 = GUICtrlCreateInput(_NowTime(4), 230, 96, 35, 20)

$Radio5 = GUICtrlCreateRadio("Повторять каждые", 24, 120, 120, 20)
$Input2 = GUICtrlCreateInput("", 150, 120, 35, 20)
$Combo1 = GUICtrlCreateCombo("", 194, 120, 57, 20)
GUICtrlSetData(-1, "мин.|час.")

$Label2 = GUICtrlCreateLabel("Начало действия", 25, 146, 98, 17)
$Date1 = GUICtrlCreateDate(_NowDate(), 120, 144, 140, 20)


GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("Формат обработки", 16, 176, 255, 49)
$Input3 = GUICtrlCreateInput("**666*ss*33*", 24, 192, 233, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Сохранить", 33, 320, 79, 25, 0)
$Button2 = GUICtrlCreateButton("Отмена", 154, 320, 79, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$nMsg = GUIGetMsg()
$name_rules=GUICtrlRead($input1)
$time_rules=GUICtrlRead($input2)
$format_rules=GUICtrlRead($input3)
$adress_file_rules=GUICtrlRead($input4)

While 1
   Switch $nMsg
	  Case $GUI_EVENT_CLOSE
		 GUIDelete($Form1_1)
		 ExitLoop
	  Case $Button2
		 GUIDelete($Form1_1)
		 ExitLoop
	  Case $Button1
		 If $name_rules="" Then MsgBox(0, "Ошибка", "Введите номер сообщения.")
		 If $format_rules="" Then MsgBox(0, "Ошибка", "Не задан формат сообщения.")
		 If $adress_file_rules="" And BitAND(GUICtrlRead($Radio2), $GUI_CHECKED)=$GUI_CHECKED  Then MsgBox(0, "Ошибка", "Не указан файл с данными.")
		 If $time_rules="" And BitAND(GUICtrlRead($Radio5), $GUI_CHECKED)=$GUI_CHECKED  Then MsgBox(0, "Ошибка", "Не указан интервал времени.")

		 If BitAND(GUICtrlRead($Radio1), $GUI_CHECKED)=$GUI_CHECKED Then
			IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio1=%s\r\n', GUICtrlRead($radio1)))
		 Else
			IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio2=%s\r\n$input4=%s\r\n', GUICtrlRead($radio2), GUICtrlRead($input4)))
			If BitAND(GUICtrlRead($Radio3), $GUI_CHECKED)=$GUI_CHECKED Then
			IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio3=%s\r\n', GUICtrlRead($radio3)))
		 Else
			If BitAND(GUICtrlRead($Radio4), $GUI_CHECKED)=$GUI_CHECKED Then
			   IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio4=%s\r\n$input5=%s\r\n', GUICtrlRead($radio4), GUICtrlRead($input5)))
			Else
			   IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio5=%s\r\n$input2=%s\r\n', GUICtrlRead($radio5), GUICtrlRead($input2)))
			EndIf
		 EndIf
		 EndIf

	  Case $Button3
		 $Button03 = FileOpenDialog("Указать файл", @WorkingDir & "", "Любой (*.*)", 1)
		 If @error Then ContinueLoop
		 GUICtrlSetData($Input4, $Button03)

EndSwitch
WEnd

1. Возможно ли время задать формулой, т.е. что бы при его удалении в окне оставалось 00:00
2...
 
Автор
F

Fanatmb

Новичок
Сообщения
50
Репутация
0
Подправил немного код. Почему-то передается и сохраняется только одно значение chechbox'a.

А как их вместе в группу записать?
 

joiner

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

Код:
Global $sPath_ini = @ScriptDir & "\rules.ini"
Global $Form1_1 = GUICreate("Form1", 286, 361, 205, 129)
$Group1 = GUICtrlCreateGroup("Тип события", 16, 10, 255, 71)
Global $Radio1 = GUICtrlCreateRadio("Входящее", 24, 26, 80, 17)
Global $Radio2 = GUICtrlCreateRadio("Исходящее", 24, 50, 80, 17)
$Label1 = GUICtrlCreateLabel("Номер сообщения", 120, 26, 98, 17)
Global $Input1 = GUICtrlCreateInput("", 220, 22, 41, 21)
$Group4 = GUICtrlCreateGroup("Файл-источник", 112, 42, 153, 36)
Global $Input4 = GUICtrlCreateInput("", 120, 55, 100, 20)
$Button3 = GUICtrlCreateButton("Файл", 221, 54, 41, 20, 0)
$Group2 = GUICtrlCreateGroup("Периодичность", 16, 80, 255, 89)
Global $Radio3 = GUICtrlCreateRadio("Однократно", 24, 96, 90, 20)
Global $Radio4 = GUICtrlCreateRadio("Ежедневно в", 145, 96, 85, 20)
Global $Input5 = GUICtrlCreateInput(_NowTime(4), 230, 96, 35, 20)
Global $Radio5 = GUICtrlCreateRadio("Повторять каждые", 24, 120, 120, 20)
Global $Input2 = GUICtrlCreateInput("", 150, 120, 35, 20)
Global $Combo1 = GUICtrlCreateCombo("", 194, 120, 57, 20)
GUICtrlSetData(-1, "мин.|час.",'мин.')
$Label2 = GUICtrlCreateLabel("Начало действия", 25, 146, 98, 17)
Global $Date1 = GUICtrlCreateDate(_NowDate(), 120, 144, 140, 20)
$Group3 = GUICtrlCreateGroup("Формат обработки", 16, 176, 255, 49)
Global $Input3 = GUICtrlCreateInput("**666*ss*33*", 24, 192, 233, 21)
$Button1 = GUICtrlCreateButton("Сохранить", 33, 320, 79, 25, 0)
$Button2 = GUICtrlCreateButton("Отмена", 154, 320, 79, 25, 0)
GUISetState(@SW_SHOW)
Local $arrayerror[6][2] = [[-1, 'Не указан номер сообщения'], [1, 'Не задан формат сообщения.'], [2, 'Не указан файл с данными.'], [3, 'Не указан интервал времени.'], [4, 'Не указан тип сообщения'], [5, 'Не указана переодичность']]
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button2
			Exit
		Case $Button1
			_ReadData()
			Local $error = @error
			If $error <> 0 Then
				For $i = 0 To UBound($arrayerror) - 1
					If $arrayerror[$i][0] = $error Then MsgBox(16, 'Ошибка', $arrayerror[$i][1],0,$Form1_1)
				Next
			EndIf

		Case $Button3
			$Button03 = FileOpenDialog("Указать файл", @WorkingDir & "", "Любой (*.*)", 1)
			If Not @error Then GUICtrlSetData($Input4, $Button03)

	EndSwitch
WEnd

Func _ReadData()
	Local $name_rules = GUICtrlRead($Input1)
	Local $time_rules = GUICtrlRead($Input2)
	Local $format_rules = GUICtrlRead($Input3)
	Local $adress_file_rules = GUICtrlRead($Input4)
	If $name_rules = '' Then Return SetError(-1, 0, 0)
	If $format_rules = "" Then Return SetError(1, 0, 0)
	If $adress_file_rules = "" Then Return SetError(2, 0, 0)
	If $time_rules = "" Then Return SetError(3, 0, 0)
	If GUICtrlRead($Radio2) = $GUI_UNCHECKED And GUICtrlRead($Radio1) = $GUI_UNCHECKED Then Return SetError(4, 0, 0)
	If GUICtrlRead($Radio3) = $GUI_UNCHECKED And GUICtrlRead($Radio4) = $GUI_UNCHECKED And GUICtrlRead($Radio5) = $GUI_UNCHECKED Then Return SetError(5, 0, 0)
	If GUICtrlRead($Radio1) = $GUI_CHECKED Then
		IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio1=%s\r\n', GUICtrlRead($Radio1)))
	Else
		IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio2=%s\r\n$input4=%s\r\n', GUICtrlRead($Radio2), GUICtrlRead($Input4)))
		If GUICtrlRead($Radio3) = $GUI_CHECKED Then
			IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio3=%s\r\n', GUICtrlRead($Radio3)))
		Else
			If GUICtrlRead($Radio4) = $GUI_CHECKED Then
				IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio4=%s\r\n$input5=%s\r\n', GUICtrlRead($Radio4), GUICtrlRead($Input5)))
			Else
				IniWriteSection($sPath_ini, $name_rules, StringFormat('$Radio5=%s\r\n$input2=%s\r\n', GUICtrlRead($Radio5), GUICtrlRead($Input2)))
			EndIf
		EndIf
	EndIf
EndFunc   ;==>_ReadData
 
Автор
F

Fanatmb

Новичок
Сообщения
50
Репутация
0
joiner сказал(а):
Fanatmb
не стоит на кнопку вешать такую обработку. точнее, лучше вывести все в отдельную функцию.
опрос событий окна нужно вписывать в цикл, а не до него. ну и все остальное мало понятно по логике действия. я переписал код так, как понял.

Я с циклами вообще слаб, но за наводку спасибо. Отложиться на будущее.
Там условия не совсем простые, т.е. если тип "исходящие", то тогда проверяем путь. Если "входящие", то путь не проверяем.
Подправил под эти условия код и все равно при такой расстановки радиоточек в INI мы получаем:

Код:
[202]
$Radio3=1

А надо

Код:
[202]
$Radio2=1
$Input4=E:\YandexDisk\primer-save-in-ini.au3
$Radio3=1
$Input3=**666*ss*33*
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
попробуй так
Код:
Func _ReadData()
	Local $inidata
	Local $name_rules = GUICtrlRead($Input1)
	Local $time_rules = GUICtrlRead($Input2)
	Local $format_rules = GUICtrlRead($Input3)
	Local $adress_file_rules = GUICtrlRead($Input4)
	If $name_rules = '' Then Return SetError(-1, 0, 0)
	If GUICtrlRead($Radio1) = $GUI_CHECKED Then
		$inidata &= '$Radio1=' & GUICtrlRead($Radio1) & @LF
	ElseIf GUICtrlRead($Radio2) = $GUI_CHECKED Then
		If $adress_file_rules = "" Then Return SetError(2, 0, 0)
		$inidata &= '$Radio2=' & GUICtrlRead($Radio2) & @LF
		$inidata &= '$Input4=' & $adress_file_rules & @LF
	Else
		Return SetError(5, 0, 0)
	EndIf
	Local $rd3 = GUICtrlRead($Radio3)
	Local $rd4 = GUICtrlRead($Radio4)
	Local $rd5 = GUICtrlRead($Radio5)
	If $rd3 = 1 Then
		$inidata &= '$Radio3=' & $rd3 & @LF
	ElseIf $rd4 = 1 Then
		Local $inp5 = GUICtrlRead($Input5)
		If $inp5 = '' Then Return SetError(3, 0, 0)
		$inidata &= '$Radio4=' & $rd4 & @LF
		$inidata &= '$Input5=' & $inp5 & @LF
	ElseIf $rd5 = 1 Then
		If $time_rules = "" Then Return SetError(3, 0, 0)
		$inidata &= '$Radio5=' & $rd5 & @LF
		$inidata &= '$Input2=' & $time_rules & @LF
		$inidata &= '$Combo1=' & GUICtrlRead($Combo1) & @LF
	Else
		Return SetError(4, 0, 0)
	EndIf
	If $format_rules <> '' Then
		$inidata &= '$Input3=' & $format_rules & @LF
	Else
		Return SetError(1, 0, 0)
	EndIf
	Local $ndata = GUICtrlRead($Date1)
	If $ndata <> '' Then $inidata &= 'Date1=' & $ndata & @LF
	IniWriteSection($sPath_ini, $name_rules, $inidata)
EndFunc   ;==>_ReadData
 
Автор
F

Fanatmb

Новичок
Сообщения
50
Репутация
0
Суть такова, что надо
1. записать в название блока номер сообщения
2. далее, выбрать между radio1 и radio2, и если будет radio2 дополнительно записать путь.
3. далее, выбрать между radio3-5, и в случает выбора двух последних добавить инфо из input5 и input2 - соответсвенно
4. записать формат сообщения

из предложенной выше схемы, вижу, что не прокатит. Пока пишу с телефона, через пару часов попробую проверить Вашу схему по факту.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Fanatmb
функцию переделал (смотри мое сообщение выше)
теперь при обозначении , к примеру, что тип "Исходящее" я получаю такой файл настроек
Код:
[1]
$Radio2=1
$Input4=C:\1020.log
$Radio5=1
$Input2=2
$Combo1=мин.
$Input3=**666*ss*33*
Date1=28 ноября 2014 г.
я добавил кое что для записи в файл настроек, но это для примера. там уже сам сможешь скорректировать - что писать , а что нет
 

Вложения

  • M.jpg
    M.jpg
    40.7 КБ · Просмотры: 23
Автор
F

Fanatmb

Новичок
Сообщения
50
Репутация
0
:smile: Спасибо. Я тут тоже кое что переделал.

Решил не путаться с минутами и часами и задавать только минуты.
В итоге форма получилась немного иначе, заодно преобразовал нумерацию всех переменных, что бы было как-то логично.
Теперь попробую подогнать Ваш пример под себя )))

И вообще, два дня думал, что схема должна быть именно такая как написано выше, но не знал как правильно подойти к этому вопросу. Потом додумал, а пока к компьютеру дошел, тут и ответ Ваш. Значит ход моих мыслей правилен, только опыта и смекалки в этом деле не хватает.

Итак. Вот, что получилось. Всё супер. Работает!

Код:
#include <GUIConstants.au3>
#include <FTPEx.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>


Func _ReadData()
   Local $inidata
   Local $name_rules = GUICtrlRead($Input1)
   Local $adress_file_rules = GUICtrlRead($Input12)
   Local $time_rules = GUICtrlRead($Input32)
   Local $format_rules = GUICtrlRead($Input4)
   If $name_rules = '' Then Return SetError(-1, 0, 0)

    If GUICtrlRead($Radio11) = $GUI_CHECKED Then
        $inidata &= '$Radio11=' & GUICtrlRead($Radio11) & @LF
    ElseIf GUICtrlRead($Radio12) = $GUI_CHECKED Then
        If $adress_file_rules = "" Then Return SetError(2, 0, 0)
        $inidata &= '$Radio12=' & GUICtrlRead($Radio12) & @LF
        $inidata &= '$Input12=' & $adress_file_rules & @LF
    Else
        Return SetError(4, 0, 0)
    EndIf

    Local $rd31 = GUICtrlRead($Radio31)
    Local $rd32 = GUICtrlRead($Radio32)
    Local $rd33 = GUICtrlRead($Radio33)
    If $rd31 = 1 Then
        $inidata &= '$Radio31=' & $rd31 & @LF
    ElseIf $rd32 = 1 Then
        Local $inp32 = GUICtrlRead($Input32)
        If $inp32 = '' Then Return SetError(6, 0, 0)
        $inidata &= '$Radio32=' & $rd32 & @LF
        $inidata &= '$Input32=' & $inp32 & @LF
   ElseIf $rd33 = 1 Then
	    Local $inp33 = GUICtrlRead($Input33)
        If $inp33 = '' Then Return SetError(3, 0, 0)
        $inidata &= '$Radio33=' & $rd33 & @LF
        $inidata &= '$Input33=' & $inp33 & @LF
    Else
        Return SetError(5, 0, 0)
    EndIf
    If $format_rules <> '' Then
        $inidata &= '$Input4=' & $format_rules & @LF
    Else
        Return SetError(1, 0, 0)
    EndIf
    Local $ndata = GUICtrlRead($Date2)
    If $ndata <> '' Then $inidata &= 'Date2=' & $ndata & @LF
    IniWriteSection($sPath_ini, $name_rules, $inidata)

 EndFunc   ;==>_ReadData





Global $sPath_ini = @ScriptDir & "\rules.ini"
Global $Form1_1 = GUICreate("Form1", 286, 361, 205, 129)
$Group1 = GUICtrlCreateGroup("Тип события", 16, 10, 255, 71)
$Label1 = GUICtrlCreateLabel("Номер сообщения", 120, 26, 98, 17)
Global $Input1 = GUICtrlCreateInput("", 220, 22, 41, 21)

Global $Radio11 = GUICtrlCreateRadio("Входящее", 24, 26, 80, 17)

Global $Radio12 = GUICtrlCreateRadio("Исходящее", 24, 50, 80, 17)
$Group12 = GUICtrlCreateGroup("Файл-источник", 112, 42, 153, 36)
Global $Input12 = GUICtrlCreateInput("", 120, 55, 100, 20)
$Button12 = GUICtrlCreateButton("Файл", 221, 54, 41, 20, 0)

$Group3 = GUICtrlCreateGroup("Периодичность", 16, 80, 255, 89)
Global $Radio31 = GUICtrlCreateRadio("Однократно", 24, 96, 90, 20)

Global $Radio32 = GUICtrlCreateRadio("Ежедневно в", 145, 96, 85, 20)
Global $Input32 = GUICtrlCreateInput(_NowTime(4), 230, 96, 35, 20)

Global $Radio33 = GUICtrlCreateRadio("Повторять через (мин)", 24, 120, 137, 20)
Global $Input33 = GUICtrlCreateInput("", 162, 120, 33, 20)
$Label331 = GUICtrlCreateLabel("ч.", 214, 122, 25, 20)
$Label332 = GUICtrlCreateLabel("мин.", 240, 122, 25, 20)

$Label2 = GUICtrlCreateLabel("Начало действия", 25, 146, 98, 17)
Global $Date2 = GUICtrlCreateDate(_NowDate(), 120, 144, 140, 20)

$Group4 = GUICtrlCreateGroup("Формат обработки", 16, 176, 255, 49)
Global $Input4 = GUICtrlCreateInput("**666*ss*33*", 24, 192, 233, 21)

$Button3 = GUICtrlCreateButton("Сохранить", 33, 320, 79, 25, 0)
$Button4 = GUICtrlCreateButton("Отмена", 154, 320, 79, 25, 0)
GUISetState(@SW_SHOW)

Local $arrayerror[7][2] = [[-1, 'Не указан номер сообщения'], [1, 'Не задан формат сообщения.'], [2, 'Не указан файл с данными.'], [3, 'Не указан интервал времени.'], [4, 'Не указан тип сообщения'], [5, 'Не указана периодичность'], [6, 'Не указано время запуска']]
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button4
         GUIDelete($Form1_1)
         ExitLoop
        Case $Button3
            _ReadData()
            Local $error = @error
            If $error <> 0 Then
                For $i = 0 To UBound($arrayerror) - 1
                    If $arrayerror[$i][0] = $error Then MsgBox(16, 'Ошибка', $arrayerror[$i][1],0,$Form1_1)
                Next
            EndIf

        Case $Button12
            $Button012 = FileOpenDialog("Указать файл", @WorkingDir & "", "Любой (*.*)", 1)
            If Not @error Then GUICtrlSetData($Input12, $Button012)

    EndSwitch
WEnd


Осталось понять:
1. как записать дату, что бы потом её считать из INI, в случае повторного открытия для редактирования
2. установить формат для окна времени, что бы всегда было 00:00, прочем можно было только изменить, а удалить нет. ну и по времени от 00:00 до 23:59
3. как сделать, что бы при вводе минут, рассчитывались автоматически часы и минуты, т.е. вводим 100 - сразу видим 1 ч. 40 мин.
4... очень много всего интересного впереди
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Fanatmb сказал(а):
3. как сделать, что бы при вводе минут, рассчитывались автоматически часы и минуты, т.е. вводим 100 - сразу видим 1 ч. 40 мин.
Я обычно делением на 60 делаю. Целая часть часы, остаток минуты.
 

joiner

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