Что нового

Как реализовать возможности Сохранить и Загрузить настройки GUI ?

dr.room

Новичок
Сообщения
275
Репутация
0
Всем привет
Есть, как пример GUI с несколькими элементами. Есть ли возможность как-то сохранять и загружать полученные значения ?
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form2 = GUICreate("Form", 610, 352, 364, 167)
$Label1 = GUICtrlCreateLabel("Поле ввода", 40, 40, 81, 20)
$Label2 = GUICtrlCreateLabel("Выпадающий список", 40, 120, 147, 20)
$Label3 = GUICtrlCreateLabel("Checkbox", 40, 80, 64, 20)
$Edit1 = GUICtrlCreateEdit("", 216, 40, 233, 25, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, "Edit1")
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 216, 88, 97, 17)
$Combo1 = GUICtrlCreateCombo("", 216, 120, 145, 25, BitOR($GUI_SS_DEFAULT_COMBO,$CBS_SIMPLE))
GUICtrlSetData(-1, "Элемент ‚1|Элемент ‚2|Элемент ‚3|Элемент ‚4")
$Button1 = GUICtrlCreateButton("Сохранить настройки ", 40, 256, 171, 33)
$Button2 = GUICtrlCreateButton("Загрузить настройки ", 264, 255, 171, 33)
$Button3 = GUICtrlCreateButton("Ок", 480, 256, 91, 33)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

ps
Поправил GUICtrlCreateEdit - забыл стили добавить из-за чего поле ввода становилось не редактируемым :(
Заранее спасибо
 

Hikari

Новичок
Сообщения
22
Репутация
0
В текстовый файл можно сохранять(думаю код для этого не надо приводить)
 
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Если ещё актуально, то , как по мне удобнее для сохранений настроек использовать ini файл , например так :
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $IniFile = @ScriptDir & '\data.ini'

$Form2 = GUICreate("Form", 610, 352, 364, 167)
$Label1 = GUICtrlCreateLabel("Поле ввода", 40, 40, 81, 20)
$Label2 = GUICtrlCreateLabel("Выпадающий список", 40, 120, 147, 20)
$Label3 = GUICtrlCreateLabel("Checkbox", 40, 80, 64, 20)
$Edit1 = GUICtrlCreateEdit("", 216, 40, 233, 25, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
GUICtrlSetData(-1, "Edit1")
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 216, 88, 97, 17)
$Combo1 = GUICtrlCreateCombo("", 216, 120, 145, 25, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE))
GUICtrlSetData(-1, "Элемент ‚1|Элемент ‚2|Элемент ‚3|Элемент ‚4")
$Button1 = GUICtrlCreateButton("Сохранить настройки ", 40, 256, 171, 33)
$Button2 = GUICtrlCreateButton("Загрузить настройки ", 264, 255, 171, 33)
$Button3 = GUICtrlCreateButton("Ок", 480, 256, 91, 33)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			IniWrite($IniFile, 'Form', '$Edit1', GUICtrlRead($Edit1))
			If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
				IniWrite($IniFile, 'Form', '$Checkbox1', 1)
			Else
				IniWrite($IniFile, 'Form', '$Checkbox1', 0)
			EndIf

			IniWrite($IniFile, 'Form', '$Combo1', GUICtrlRead($Combo1))
		Case $Button2
			GUICtrlSetData($Edit1, IniRead($IniFile, 'Form', '$Edit1', ''))
			If IniRead($IniFile, 'Form', '$Checkbox1', 0) = 1 Then
				GUICtrlSetState($Checkbox1, $GUI_CHECKED)
			Else
				GUICtrlSetState($Checkbox1, $GUI_UNCHECKED)
			EndIf

			GUICtrlSetData($Combo1, IniRead($IniFile, 'Form', '$Combo1', ''))
	EndSwitch
WEnd
 
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0
ra4o
Да, актуально, спасибо !
Я так понимаю что тут минимум 3 задачи
  • Сохранить значения в ini. Понял как, спасибо
  • Сохранить этот ini "как" т.е. в другое место под другим именем (Кнопка Сохранить настройки). С использованием диалогового окна сохранения - потому что изначально место сохраенния пока не установлено Чтобы "каталогизировать" Пока не понял как
  • Извлечь значения для элементов из сохраненного ini именно того ini что был "сохранен как". Тут есть почти все понял кроме
    • Если читать настройки из ini что идет по умолчанию (в каталоге скрипта) то это 1 случай. А вот если читать настройки из ini что сохраненн в другом месте (Кнопка загрузить настройки)? Тут как?
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Если читать настройки из ini что идет по умолчанию (в каталоге скрипта) то это 1 случай. А вот если читать настройки из ini что сохраненн в другом месте (Кнопка загрузить настройки)? Тут как?
не совсем понял вопрос, чтение из ini файла выполняется , как Вы уже поняли функцией
Код:
IniRead ( "filename", "section", "key", "default" )
даёте переменной "filename" путь к нужному файлу настроек и читаете его,путь к нужному файлу ini по нажатию кнопки "Загрузить настройки" можно получить функцией
Код:
$filename = FileOpenDialog('выбрать файл настроек', @ScriptDir& "\", "Файлы ini(*.ini)", 1 + 2)
Значение "default" в "IniRead" это и есть значение по умолчанию, его Вы можете оставить для всех одинаковым либо подставлять в зависимости от выбранного файла , вплоть до того, что значение по умолчанию может быть записано в самом файле ini . Не зная Вашей задачи здесь можно только предполагать варианты решений.
 
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0
Здравствуйте, ra4o
У меня не выходит загрузить настройки GUI
Я не понимаю как GUI может: прочитать и перезаписать свои настройки. По тесту что ниже - просто указать на новый файл настроек в результате клика по кнопке "Загрузить настройки": явно не достаточно
вот пример
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


 $filename = @ScriptDir & "\config.ini" ; Это просто путь к первоначальноуму файлу с настройками


#Region ### START Koda GUI section ### Form=Form1.kxf
$Form1_1 = GUICreate("Form1", 522, 220, 211, 134)
GUISetFont(10, 400, 0, "MS Sans Serif")

$fTime1 = IniRead($filename, "etap1", "Input1", "") ; Команда на чтение  данныых  - из файла что уазан выше.  Поле "значение" оставляем пустым, чтобы не менять уже существующее значение а только прочитать.
$Input1 = GUICtrlCreateInput($fTime1, 288, 32, 121, 28); пишем прочитанное значение из ini  - как текст по умолчанию
$Button1 = GUICtrlCreateButton("Ок ", 400, 160, 75, 25)
$Label1 = GUICtrlCreateLabel("Поле ввода", 48, 32, 95, 24)
$Button2 = GUICtrlCreateButton("Загрузить настройки ", 48, 96, 187, 25)
$Button3 = GUICtrlCreateButton("Сохранить  настройки", 288, 96, 187, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Input1
			$Input1_write= GUICtrlRead($Input1,1)
			IniWrite($filename, "etap1", "Input1", $Input1_write)

		Case $Button1 ; клик по кнопен Ок
			ExitLoop

		Case $Button2 ; клик по кнопке Загрузить настройки
			; открываем диалогове окно  - чтобы найти путь к INI файлу
			$filename = FileOpenDialog('выбрать файл настроек', @ScriptDir& "\", "Файлы ini(*.ini)", 1 + 2)

		Case $Button3; клик по кнопке Сохранить  настройки


	EndSwitch
WEnd
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Если по быстрому переделать Ваш вариант, то так :
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


 $filename = @ScriptDir & "\config.ini" ; Это просто путь к первоначальноуму файлу с настройками


#Region ### START Koda GUI section ### Form=Form1.kxf
$Form1_1 = GUICreate("Form1", 522, 220, 211, 134)
GUISetFont(10, 400, 0, "MS Sans Serif")

$fTime1 = IniRead($filename, "etap1", "Input1", "") ; Команда на чтение  данныых  - из файла что уазан выше.  Поле "значение" оставляем пустым, чтобы не менять уже существующее значение а только прочитать.
$Input1 = GUICtrlCreateInput($fTime1, 288, 32, 121, 28); пишем прочитанное значение из ini  - как текст по умолчанию
$Button1 = GUICtrlCreateButton("Ок ", 400, 160, 75, 25)
$Label1 = GUICtrlCreateLabel("Поле ввода", 48, 32, 95, 24)
$Button2 = GUICtrlCreateButton("Загрузить настройки ", 48, 96, 187, 25)
$Button3 = GUICtrlCreateButton("Сохранить  настройки", 288, 96, 187, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button1 ; клик по кнопен Ок
            ExitLoop

        Case $Button2 ; клик по кнопке Загрузить настройки
            ; открываем диалогове окно  - чтобы найти путь к INI файлу
            $filename = FileOpenDialog('выбрать файл настроек', @ScriptDir& "\", "Файлы ini(*.ini)", 1 + 2)
            GUICtrlSetData($Input1,IniRead($filename, "etap1", "Input1",""));Загружаем сохранённое ранее содержимое строки в форму

        Case $Button3; клик по кнопке Сохранить  настройки
            $filename =  FileSaveDialog('выбрать файл настроек', @ScriptDir& "\", "Файлы ini(*.ini)", 2+16);Диалог выбора имнени файла для сохранения настроек
			$Input1_write= GUICtrlRead($Input1,1)
            IniWrite($filename, "etap1", "Input1", $Input1_write);запись содержания строки Input1 в файл настроек

    EndSwitch
WEnd
 
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0
Спасибо огромное, ra4o
Все получилось
Единственно, я бы не торопился очищать поле ввода сразу, вдруг "передумается" открывать файл для загрузки... Получиться новых настроек еще нет, а старых уже нет :smile:
Т.е. после строчки
Код:
$filename = FileOpenDialog('выбрать файл настроек', @ScriptDir& "\", "Файлы ini(*.ini)", 1 + 2)

добавить
Код:
if @error  Then
MsgBox (262208,"","Настройки - не изменились!")
Else
GUICtrlSetData($Input1,IniRead($filename, "etap1", "Input1",""));
EndIf
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
223
Точно так же желательно поступить после диалога сохранения файла
Код:
$filename =  FileSaveDialog('выбрать файл настроек', @ScriptDir& "\", "Файлы ini(*.ini)", 2+16)
 
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0
Здравствуйте, ra4o
Я вот подумал - а как текстовый редактор выполняет задачу "Сохранить как" ?
Неужели точно также:
  • Открыть диалоговое окно пути
  • Дождаться записи и подтверждения создания нового файла с новым имененм
  • Переписать полностью содержимое редактируемого документа в новый документ
Я собственно почему спрашиваю. А что если в GUI не 1 элемент а множество, да на нескольких табах. Ведь придется перезаписать все значения всех элементов :shok: :smile:
Может есть путь проще? Может есть вариант пересоздать текущий документ через ... я не знаю...копирование, например. Но также - с диалоговым окном выбора пути и имени.
Я собственно почему подумал о копировании: дело в том что в скрипте реализована проверка + запись значений при изменении элементов. Т.е. все есть, все записано - дело за малым, скопировать просто текущий документ в новое место, с новым именем по выбору...
 
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0
Кажется я понял - проще решения нет..
 
Верх