Что нового

Как сахранить Checkbox

kolosov

Новичок
Сообщения
137
Репутация
0
Ребят такой вапрос. У меня в окне есть Checkboxи по стондарту я устонавил там значение "40".
И вапрос собствено в том, что дописать в скрипте чтобы в закампелированом
окне когда меняеш например значение с сорока на пять к примеру, программа это запомнила и всё время там стояло 5 даже после перезапуска.


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

Можете привести какой-то пример?
 

inx

Знающий
Сообщения
43
Репутация
12
там значение "40".

Может быть не "Checkbox", а Input ?

Код:
;~ Фрагмент кода: Прочитать из файла настроек значение некого элемента GUI
$SearchStr = IniRead("file.ini", "search", "$SearchStr", "40")

;~ Фрагмент кода: Создать некий элемент GUI
$Input_FindWhat = GUICtrlCreateInput($SearchStr, 312, 288, 89, 21)

;~ Фрагмент кода: Прочитать из элемента GUI значение
$SearchStr = GUICtrlRead($Input_FindWhat)

;~ Фрагмент кода: Записать это значение в файл настроек при выходе из приложения
Case $GUI_EVENT_CLOSE
	IniWrite("file.ini", "search", "$SearchStr", $SearchStr)
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
kolosov

1. вариант вам уже показали
2. хранить значение в реестре
3. записывать значения в сам исполняющий файл (в оверлей)
 

inx

Знающий
Сообщения
43
Репутация
12
Можете привести какой-то пример?
Если с чекбоксом, то я так понял надо его текст сохранить.
Вот пример с сохранением текста и состояния.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>

Global $fCheck
Global $CheckboxState = IniRead("file.ini", "check", "$CheckboxState", "1")
Global $CheckboxText = IniRead("file.ini", "check", "$CheckboxText", "1")

GUICreate('', 150, 60)
$nCheckbox = GUICtrlCreateCheckbox($CheckboxText, 20, 10, 120, 20)
Switch $CheckboxState
    Case 1
        GUICtrlSetState($nCheckbox, $GUI_CHECKED)
    Case 0
        GUICtrlSetState($nCheckbox, $GUI_UNCHECKED)
EndSwitch
$nButton = GUICtrlCreateButton('Изменить описание', 15, 35, 120, 20)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            $CheckboxText = GUICtrlRead($nCheckbox, 1) ; 1 - получить дополнительную информацию, в данном случае текст чекбокса
            IniWrite("file.ini", "check", "$CheckboxText", $CheckboxText)
            Local $st = BitAND(GUICtrlRead($nCheckbox), $GUI_CHECKED)
                If $st = 1 Then
                    IniWrite("file.ini", "check", "$CheckboxState", "1")
                Else
                    IniWrite("file.ini", "check", "$CheckboxState", "0")
                EndIf
            Exit
        Case $nButton
            $Random = Random(10,100)
            GUICtrlSetData($nCheckbox,$Random)
    EndSwitch
WEnd


Тут правда не все состояния чекбокса рассмотрены, есть еще $GUI_INDETERMINATE, неопределенное.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
inx
При запуске скрипта Checkbox по умолчанию GUI_UNCHECKED, поэтому эта строка лишняя.
При сохранении можно тоже упростить:
Код:
Local $st = BitAND(GUICtrlRead($nCheckbox), $GUI_CHECKED)
IniWrite("file.ini", "check", "$CheckboxState", $st)

Почему так? Потому что $st будет содержать 0 или 1, то есть уже готовый результат для сохранения.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
kolosov,
Вы проверяйте, что ли, свои посты на ошибки перед публикацией, а то глаза режет.
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Модератор.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
madmasles
Вы проверяйте, что ли, свои посты на ошибки перед публикацией, а то глаза режет.
Вот и я про то же... Вчера ему в ЛС написал...
P.S. Современные браузеры Firefox и Chrome тоже умеют исправлять ошибки...
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
Viktor1703 [?]
3. записывать значения в сам исполняющий файл (в оверлей)
А вот с этого места можно чуть подробнее? Кто есть оверлей и как туда писать?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
OffTopic:
alex33
madmasles
А может он просто хохол? ;D
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
OffTopic:
MnM [?]
А может он просто хохол?
А я тогда кацап, москаль и т.д. и т.п..., и что?
А китайцы тогда будут на форуме писать по китайски?



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

Dm666 [?]
А вот с этого места можно чуть подробнее? Кто есть оверлей и как туда писать?
Я не знаю, к своему сожалению, что такое оверлей, поэтому делаю примерно так.
Код:
#NoTrayIcon
;~ #RequireAdmin;???
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/SO
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <WinAPI.au3>

Opt('MustDeclareVars', 1)

If Not @Compiled Then Exit MsgBox(64, 'Info', 'Run only compiled script!')
If Number(StringReplace(@AutoItVersion, '.', '')) > 3381 Then
	If MsgBox(68, 'Info', 'Not tested on versions older than 3.3.8.1, continue?') <> 6 Then Exit
EndIf
If $CmdLine[0] = 2 Then
	While ProcessExists($CmdLine[2])
		Sleep(100)
	WEnd
	FileMove(@ScriptFullPath, $CmdLine[1], 1)
	Exit
EndIf

If WinExists('[TITLE:{EB2990C3-57E0-4220-A11F-77495D321C54}; CLASS:AutoIt v3]') Then Exit
AutoItWinSetTitle('{EB2990C3-57E0-4220-A11F-77495D321C54}')

Global $hGui, $iComboBox, $sStrComboBox = 'First|Second|Third|Fourth|Fifth', $iChBox, $aiRd[3] = ['Yes', 'No', 'May be'], $aSett[1]

__GetMySetting($aSett)
TraySetState()

$hGui = GUICreate('MyGUI', 200, 140)
$iComboBox = GUICtrlCreateCombo('', 50, 20, 100, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData($iComboBox, $sStrComboBox)
GUICtrlSendMsg($iComboBox, $CB_SETCURSEL, $aSett[0], 0)
$iChBox = GUICtrlCreateCheckbox('Test Checkbox', 50, 60, 100, 20, $BS_AUTO3STATE)
If $aSett[1] Then GUICtrlSetState($iChBox, $aSett[1])
GUICtrlCreateGroup('Select', 5, 80, 190, 50)
For $i = 0 To 2
	$aiRd[$i] = GUICtrlCreateRadio($aiRd[$i], 10 + $i * 60, 100, 50, 20)
	If $aSett[$i + 2] Then GUICtrlSetState($aiRd[$i], $aSett[$i + 2])
Next
GUICtrlCreateGroup('', -99, -99, 1, 1)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $iComboBox
;~ 			ConsoleWrite(GUICtrlSendMsg($iComboBox, $CB_GETCURSEL, 0, 0) & @LF)
		Case $iChBox
;~ 			ConsoleWrite(GUICtrlRead($iChBox) & @LF)
	EndSwitch
WEnd
__SaveMySetting()

Func __GetMySetting(ByRef $a_Sett)
	Local $ab_Check[3] = [2, 0x21335541, 0x36304145], $i_Err = 1, $h_File, $t_Read, $p_Read, $i_Byte, $t_Check, $p_Check, _
			$a_Default[5] = [0, 2, 1, 0, 0]

	If UBound($a_Sett) <> 5 Then ReDim $a_Sett[5]
	$t_Check = DllStructCreate('dword[2]')
	$p_Check = DllStructGetPtr($t_Check)
	$t_Read = DllStructCreate('byte[5]')
	$p_Read = DllStructGetPtr($t_Read)
	Do
		$h_File = _WinAPI_CreateFile(@ScriptFullPath, 2, 2)
		If Not $h_File Then ExitLoop
		_WinAPI_SetFilePointer($h_File, -13, 2)
		If @error Then ExitLoop
		If (Not _WinAPI_ReadFile($h_File, $p_Check, 8, $i_Byte)) Or ($i_Byte <> 8) Then ExitLoop
		For $i = 1 To 2
			If DllStructGetData($t_Check, 1, $i) <> $ab_Check[$i] Then ExitLoop 2
		Next
		If (Not _WinAPI_ReadFile($h_File, $p_Read, 5, $i_Byte)) Or ($i_Byte <> 5) Then ExitLoop
		If @error Then ExitLoop
		For $i = 1 To 5
			$a_Sett[$i - 1] = DllStructGetData($t_Read, 1, $i)
		Next
		$i_Err = 0
	Until 1
	If $h_File Then _WinAPI_CloseHandle($h_File)
	If $i_Err Then $a_Sett = $a_Default
EndFunc   ;==>__GetMySetting

Func __SaveMySetting()
	Local $ab_Check[3] = [2, 0x21335541, 0x36304145], $i_Err = 1, $h_File, $t_Check, $p_Check, $t_ReadWrite, $p_ReadWrite, $i_Byte, $i_Pos = -20, _
			$a_Default[5] = [0, 2, 1, 0, 0], $i_Size, $i_ReadWrite, $t_Sett, $p_Sett, $i_Pid

	$t_Check = DllStructCreate('dword[2]')
	$p_Check = DllStructGetPtr($t_Check)
	$t_Sett = DllStructCreate('byte[5]')
	$p_Sett = DllStructGetPtr($t_Sett)
	$i_Size = FileGetSize(@ScriptFullPath)
	Do
		$h_File = _WinAPI_CreateFile(@ScriptFullPath, 2, 2)
		If Not $h_File Then ExitLoop
		_WinAPI_SetFilePointer($h_File, -13, 2)
		If @error Then ExitLoop
		If (Not _WinAPI_ReadFile($h_File, $p_Check, 8, $i_Byte)) Or ($i_Byte <> 8) Then ExitLoop
		For $i = 1 To 2
			If DllStructGetData($t_Check, 1, $i) <> $ab_Check[$i] Then
				$i_Pos = 0
				$t_ReadWrite = DllStructCreate('byte[' & $i_Size & ']')
				ExitLoop
			EndIf
		Next
		If $i_Pos Then
			$t_ReadWrite = DllStructCreate('byte[' & $i_Size - 5 & ']')
		EndIf
		DllStructSetData($t_Sett, 1, GUICtrlSendMsg($iComboBox, $CB_GETCURSEL, 0, 0), 1)
		DllStructSetData($t_Sett, 1, GUICtrlRead($iChBox), 2)
		For $j = 0 To 2
			DllStructSetData($t_Sett, 1, BitAND(GUICtrlRead($aiRd[$j]), $GUI_CHECKED), $j + 3)
		Next
		$p_ReadWrite = DllStructGetPtr($t_ReadWrite)
		$i_ReadWrite = DllStructGetSize($t_ReadWrite)
		_WinAPI_SetFilePointer($h_File, 0, 0)
		If (Not _WinAPI_ReadFile($h_File, $p_ReadWrite, $i_ReadWrite, $i_Byte)) Or ($i_Byte <> $i_ReadWrite) Then ExitLoop
		_WinAPI_CloseHandle($h_File)
		$h_File = _WinAPI_CreateFile(@TempDir & '\~Temp_MyProg.exe', 1, 4)
		If Not $h_File Then ExitLoop
		If Not _WinAPI_WriteFile($h_File, $p_ReadWrite, $i_ReadWrite, $i_Byte) Or $i_Byte <> $i_ReadWrite Then ExitLoop
		If Not _WinAPI_WriteFile($h_File, $p_Sett, 5, $i_Byte) Or $i_Byte <> 5 Then ExitLoop
		$i_Err = 0
	Until 1
	If $h_File Then _WinAPI_CloseHandle($h_File)
	If $i_Err Then Exit 1
	$i_Pid = Run('"' & @TempDir & '\~Temp_MyProg.exe" "' & @ScriptFullPath & '" "' & @AutoItPID & '"')
	Exit (Number($i_Pid <> 0))
EndFunc   ;==>__SaveMySetting
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Что делает функция __SaveMySetting(), где сохраняет, пишет в начало файла? или в конец, что за временный файлы и зачем там структуры. Антивирусы не ругаются на изменение файла?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
ИМХО, не в этой теме ответы на Ваши вопросы.
 
Верх