Тема: AHK: Хранения измененных значений переменных внутри скрипта
Как реализовать запоминание текущего значения переменных (когда скрипт запущен), чтобы при следующем запуске он считал последние запомненные значения?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как реализовать запоминание текущего значения переменных (когда скрипт запущен), чтобы при следующем запуске он считал последние запомненные значения?
В файл, в реестр, в include-файл... Можно записывать в сам скрипт, если он не скомпилирован.
Можете скинуть ссылки на примеры записи в сам скрипт?
Таких примеров, наверное, нет, поскольку это извращение. ![]()
Простейшая реализация такая:
записываем в переменную всё, что изменяется (имена переменных и их значения) плюс неизменную часть скрипта
командой FileAppend создаём новый файл скрипта, но с другим именем
удаляем старый файл скрипта
переименовываем новый файл - даём ему старое имя
Пробую сделать через реестр, почему-то не получается. Может я чего-то не понимаю?
Gui, LAUNCHER: +LastFound
Gui, LAUNCHER: Margin, 0, 0
Gui, LAUNCHER: Add, Text, x10 y45 h20, Auto Accept:
Gui, LAUNCHER: Add, DropDownList, x10 y65 w100 h20 R2 vDropDownList_Auto_Accept, Enable|Disable
Gui, LAUNCHER: Show, Center w120 h95, %A_ScriptName%
RegRead, Auto_Accept, HKEY_LOCAL_MACHINE, TestData, Auto_Accept_Reg
if (Auto_Accept = "Enable" || ErrorLevel = 1)
GuiControl, LAUNCHER: Choose, vDropDownList_Auto_Accept, 1
if (Auto_Accept = "Disable")
GuiControl, LAUNCHER: Choose, vDropDownList_Auto_Accept, 2
Return
1::
Gui, LAUNCHER: Submit, NoHide
RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, TestData, Auto_Accept_Reg, % DropDownList_Auto_Accept
Return
RWin::
RegRead, Auto_Accept, HKEY_LOCAL_MACHINE, TestData, Auto_Accept_Reg
MsgBox, %Auto_Accept%
ReturnAHK: Удобный метод сохранения/загрузки настроек в реестре.
Settingspath=Unknown_AHK_Script
; full path = HKCU\SOFTWARE\Unknown_AHK_Script
SettingsDefault=
(
DropDownList_Auto_Accept=
Auto_Accept=
)
gosub,LoadSettings
Gui, LAUNCHER: +LastFound
Gui, LAUNCHER: Margin, 0, 0
Gui, LAUNCHER: Add, Text, x10 y45 h20, Auto Accept:
Gui, LAUNCHER: Add, DropDownList, x10 y65 w100 h20 R2 vDropDownList_Auto_Accept, Enable|Disable
Gui, LAUNCHER: Show, Center w120 h95, %A_ScriptName%
if (Auto_Accept = "Enable" || ErrorLevel = 1)
GuiControl, LAUNCHER: Choose,DropDownList_Auto_Accept, 1 ; буква v не нужна в начале названия переменной.
if (Auto_Accept = "Disable")
GuiControl, LAUNCHER: Choose,DropDownList_Auto_Accept, 2
Return
1::
Gui, LAUNCHER: Submit, NoHide
Auto_Accept:=DropDownList_Auto_Accept ; этой строки не хватало
gosub,SaveSettings
Return
RWin::
gosub,LoadSettings
MsgBox, %Auto_Accept%
Return
SaveSettings:
if Settingspath=
Settingspath=SOFTWARE\Unknown_AHK_Script
if SettingsDefault=
return
loop,parse,SettingsDefault,`n
{
Loop,parse,a_loopfield,=
{
if a_index=1
{
Setting:=a_loopfield
Break
}
}
RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,% %Setting%
}
LoadSettings:
if Settingspath=
Settingspath=SOFTWARE\Unknown_AHK_Script
if SettingsDefault=
return
loop,parse,SettingsDefault,`n
{
Loop,parse,a_loopfield,=
{
if a_index=1
Setting:=a_loopfield
else if a_index=2
Default:=a_loopfield
else
Default.="=" a_loopfield
}
RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
if errorlevel
{
RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Default%
RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
}
}
Return
Таких примеров, наверное, нет, поскольку это извращение.
Ну раз нет, значит будут. ))
Насчет "извращения" согласен, в абсолютном большинстве случаев. Разве что вопрос хранения настроек именно в самом скрипте принципиально важен.
Такой вариант - все имена переменных, чьи значения нужно хранить, заносятся в массив My_StaticVars, и в последствии на выходе скрипт перезаписывает сам себя с новыми значениями.
Само собой, способ подходит только для нескомпилированных скриптов.
OnExit, Exit
My_StaticVars := {ClickCount: "0", nStart: "1"}
for k,v in My_StaticVars
%k% := v
MsgBox % "Количество запусков: " . nStart . "`nЛКМ: " . ClickCount
nStart++
Return
~LButton:: ClickCount++
Exit:
tmpfile := A_ScriptDir . "\_" . A_Now . ".tmp"
newvars := "My_StaticVars := {"
for k,v in My_StaticVars
newvars .= k . ": """ . %k% . """, "
newvars := SubStr(newvars,1, -2) . "}"
Loop, Read, %A_ScriptFullPath%, %tmpfile%
if (InStr(A_LoopReadLine, "My_StaticVars :=") = 1)
FileAppend, %newvars%`n
else
FileAppend, %A_LoopReadLine%`n
FileMove, %tmpfile%, %A_ScriptFullPath%, 1
ExitApp
AHK: Удобный метод сохранения/загрузки настроек в реестре.
+ готовый вариант, открывать только если самому лень разбиратьсяSettingspath=Unknown_AHK_Script ; full path = HKCU\SOFTWARE\Unknown_AHK_Script SettingsDefault= ( DropDownList_Auto_Accept= Auto_Accept= ) gosub,LoadSettings Gui, LAUNCHER: +LastFound Gui, LAUNCHER: Margin, 0, 0 Gui, LAUNCHER: Add, Text, x10 y45 h20, Auto Accept: Gui, LAUNCHER: Add, DropDownList, x10 y65 w100 h20 R2 vDropDownList_Auto_Accept, Enable|Disable Gui, LAUNCHER: Show, Center w120 h95, %A_ScriptName% if (Auto_Accept = "Enable" || ErrorLevel = 1) GuiControl, LAUNCHER: Choose,DropDownList_Auto_Accept, 1 ; буква v не нужна в начале названия переменной. if (Auto_Accept = "Disable") GuiControl, LAUNCHER: Choose,DropDownList_Auto_Accept, 2 Return 1:: Gui, LAUNCHER: Submit, NoHide Auto_Accept:=DropDownList_Auto_Accept ; этой строки не хватало gosub,SaveSettings Return RWin:: gosub,LoadSettings MsgBox, %Auto_Accept% Return SaveSettings: if Settingspath= Settingspath=SOFTWARE\Unknown_AHK_Script if SettingsDefault= return loop,parse,SettingsDefault,`n { Loop,parse,a_loopfield,= { if a_index=1 { Setting:=a_loopfield Break } } RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,% %Setting% } LoadSettings: if Settingspath= Settingspath=SOFTWARE\Unknown_AHK_Script if SettingsDefault= return loop,parse,SettingsDefault,`n { Loop,parse,a_loopfield,= { if a_index=1 Setting:=a_loopfield else if a_index=2 Default:=a_loopfield else Default.="=" a_loopfield } RegRead,%Setting%,HKCU,%Settingspath%,%Setting% if errorlevel { RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Default% RegRead,%Setting%,HKCU,%Settingspath%,%Setting% } } Return
Error: The following variable contains an illegal character:
Ошибка в строке:
RegRead, %Setting%, HKCU, %Settingspath%, %Setting%Не могу сам разобраться.
И как реализовать Gui, Submit, NoHide сразу же после выбора чего-либо из DropList?
Error: The following variable contains an illegal character:
Возможно нужно обновить AHK.
И как реализовать Gui, Submit, NoHide сразу же после выбора чего-либо из DropList?
Добавить метку перехода в контрол:
Gui, LAUNCHER: Add, DropDownList, x10 y65 w100 h20 R2 glabel vDropDownList_Auto_Accept, Enable|Disable
label:
Gui, LAUNCHER: Submit, NoHide
msgbox,% DropDownList_Auto_Accept
return
Возможно нужно обновить AHK.
Обновил, ошибка осталась.
Готовый код:
Settingspath=Unknown_AHK_Script
; full path = HKCU\SOFTWARE\Unknown_AHK_Script
SettingsDefault=
(
DropDownList_Auto_Accept=
Auto_Accept=
)
gosub,LoadSettings
Gui, LAUNCHER: +LastFound
Gui, LAUNCHER: Margin, 0, 0
Gui, LAUNCHER: Add, Text, x10 y45 h20, Auto Accept:
Gui, LAUNCHER: Add, DropDownList, x10 y65 w100 h20 R2 glabel vDropDownList_Auto_Accept, Enable|Disable
Gui, LAUNCHER: Show, Center w120 h95, %A_ScriptName%
if (Auto_Accept = "Enable" || ErrorLevel = 1)
GuiControl, LAUNCHER: Choose,DropDownList_Auto_Accept, 1
if (Auto_Accept = "Disable")
GuiControl, LAUNCHER: Choose,DropDownList_Auto_Accept, 2
Return
1::
label:
Gui, LAUNCHER: Submit, NoHide
Auto_Accept:=DropDownList_Auto_Accept
tooltip,% DropDownList_Auto_Accept
gosub,SaveSettings
Return
RWin::
gosub,LoadSettings
MsgBox, %Auto_Accept%
Return
SaveSettings:
if Settingspath=
Settingspath=SOFTWARE\Unknown_AHK_Script
if SettingsDefault=
return
loop,parse,SettingsDefault,`n
{
Loop,parse,a_loopfield,=
{
if a_index=1
{
Setting:=a_loopfield
Break
}
}
RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,% %Setting%
}
LoadSettings:
if Settingspath=
Settingspath=SOFTWARE\Unknown_AHK_Script
if SettingsDefault=
return
loop,parse,SettingsDefault,`n
{
Loop,parse,a_loopfield,=
{
if a_index=1
Setting:=a_loopfield
else if a_index=2
Default:=a_loopfield
else
Default.="=" a_loopfield
}
RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
if errorlevel
{
RegWrite,REG_SZ,HKCU,%Settingspath%,%Setting%,%Default%
RegRead,%Setting%,HKCU,%Settingspath%,%Setting%
}
}
Return
У меня все работает.
Кодировка юникод, win 7 x64, AHK v1.1.22.03.
Нашел ошибку. Я разделил пробелами знак равенства ( = ) везде.
Вставил это:
Loop, parse, A_loopfield, =, %A_Space%%A_Tab%Ошибка исчезла, но настройки не загружает..
Полный код:
Settingspath = Unknown_AHK_Script ; Полный путь = HKCU\SOFTWARE\Unknown_AHK_Script
SettingsDefault =
( LTrim
DropDownList_Auto_Accept =
Auto_Accept =
)
Gosub, LoadSettings
Gui, LAUNCHER: +LastFound
Gui, LAUNCHER: Margin, 0, 0
Gui, LAUNCHER: Add, Button, x10 y10 w100 h25, Reload
Gui, LAUNCHER: Add, Text, x10 y45 h20, Auto Accept:
Gui, LAUNCHER: Add, DropDownList, x10 y65 w100 h20 R2 gSaveGui vDropDownList_Auto_Accept, Enable|Disable
Gui, LAUNCHER: Show, Center w120 h95, %A_ScriptName%
Return
LAUNCHERButtonReload:
Gosub, SaveSettings
Reload
Return
Exit:
LAUNCHERGuiClose:
Gosub, SaveSettings
ExitApp
Return
RWin::
Gosub, LoadSettings
MsgBox, %Auto_Accept%
Return
SaveGui:
{
Gui, LAUNCHER: Submit, NoHide
Auto_Accept := DropDownList_Auto_Accept
}
Return
SaveSettings:
{
if Settingspath =
Settingspath = SOFTWARE\Unknown_AHK_Script
if SettingsDefault =
Return
Loop, parse, SettingsDefault, `n
{
Loop, parse, A_loopfield, =, %A_Space%%A_Tab%
{
if A_index = 1
{
Setting := A_loopfield
Break
}
}
RegWrite, REG_SZ,HKCU, %Settingspath%, %Setting%, % %Setting%
}
}
Return
LoadSettings:
{
if Settingspath =
Settingspath = SOFTWARE\Unknown_AHK_ScriptWarlock
if SettingsDefault =
Return
Loop, parse, SettingsDefault, `n
{
Loop, parse, A_loopfield, =, %A_Space%%A_Tab%
{
if A_index = 1
Setting := A_loopfield
Else if A_index = 2
Default := A_loopfield
Else
Default .= "=" A_loopfield
}
RegRead, %Setting%, HKCU, %Settingspath%, %Setting%
if Errorlevel
{
RegWrite, REG_SZ, HKCU, %Settingspath%, %Setting%, %Default%
RegRead, %Setting%, HKCU, %Settingspath%, %Setting%
}
}
if Auto_Accept =
GuiControl, LAUNCHER: Choose, DropDownList_Auto_Accept, 0
if (Auto_Accept = "Enable")
GuiControl, LAUNCHER: Choose, DropDownList_Auto_Accept, 1
if (Auto_Accept = "Disable")
GuiControl, LAUNCHER: Choose, DropDownList_Auto_Accept, 2
}
Return
Нашел очередную ошибку. Нужно было добавить
Gosub, LoadSettings после Gui
Alectric, спасибо за код!
Метки SaveSettings/LoadSettings не нужно переписывать, они уже готовы к использованию.
Ааа, понял. Для тебя непривычен формат записи когда вокруг "=" нет пробелов? Но именно в таком виде и нужно составлять список переменных для сохранения, т.к. если в значении по умолчанию будет "=", то опять будут ошибки, хотя редко встретишь в настройках "="...
Ладно, неважно...
если в значении по умолчанию будет "=", то опять будут ошибки.Не будут, мы же их пропускаем кодом:
%A_Space%%A_Tab%Добавь в список:
var = ha ha = var
и сохрани настройки.
Но, вообще, можно закрыть уже тему, это как я уже сказал редкий случай.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться