1

Тема: AHK: Хранения измененных значений переменных внутри скрипта

Как реализовать запоминание текущего значения переменных (когда скрипт запущен), чтобы при следующем запуске он считал последние запомненные значения?

2

Re: AHK: Хранения измененных значений переменных внутри скрипта

В файл, в реестр, в include-файл... Можно записывать в сам скрипт, если он не скомпилирован.

3 (изменено: Странникх, 2015-08-30 00:16:07)

Re: AHK: Хранения измененных значений переменных внутри скрипта

Можете скинуть ссылки на примеры записи в сам скрипт?

4

Re: AHK: Хранения измененных значений переменных внутри скрипта

Таких примеров, наверное, нет, поскольку это извращение.

Простейшая реализация такая:

  • записываем в переменную всё, что изменяется (имена переменных и их значения) плюс неизменную часть скрипта

  • командой FileAppend создаём новый файл скрипта, но с другим именем

  • удаляем старый файл скрипта

  • переименовываем новый файл - даём ему старое имя

5 (изменено: Странникх, 2015-08-30 01:36:15)

Re: AHK: Хранения измененных значений переменных внутри скрипта

Пробую сделать через реестр, почему-то не получается. Может я чего-то не понимаю?


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%
Return

6 (изменено: Alectric, 2015-08-30 09:06:35)

Re: AHK: Хранения измененных значений переменных внутри скрипта

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
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

7

Re: AHK: Хранения измененных значений переменных внутри скрипта

ypppu пишет:

Таких примеров, наверное, нет, поскольку это извращение.

Ну раз нет, значит будут. ))
Насчет "извращения" согласен, в абсолютном большинстве случаев. Разве что вопрос хранения настроек именно в самом скрипте принципиально важен.
Такой вариант - все имена переменных, чьи значения нужно хранить, заносятся в массив 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

8 (изменено: Странникх, 2015-08-30 19:59:49)

Re: AHK: Хранения измененных значений переменных внутри скрипта

Alectric пишет:

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?

9 (изменено: Alectric, 2015-08-30 20:26:16)

Re: AHK: Хранения измененных значений переменных внутри скрипта

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
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

10

Re: AHK: Хранения измененных значений переменных внутри скрипта

Возможно нужно обновить AHK.

Обновил, ошибка осталась.

11 (изменено: Alectric, 2015-08-30 20:28:07)

Re: 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.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

12 (изменено: Странникх, 2015-08-30 20:51:20)

Re: AHK: Хранения измененных значений переменных внутри скрипта

Нашел ошибку. Я разделил пробелами знак равенства ( = ) везде.
Вставил это:

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

13 (изменено: Странникх, 2015-08-30 21:05:06)

Re: AHK: Хранения измененных значений переменных внутри скрипта

Нашел очередную ошибку. Нужно было добавить

Gosub, LoadSettings

после Gui
Alectric, спасибо за код!

14 (изменено: Alectric, 2015-08-30 21:20:28)

Re: AHK: Хранения измененных значений переменных внутри скрипта

Метки SaveSettings/LoadSettings не нужно переписывать, они уже готовы к использованию.

Ааа, понял. Для тебя непривычен формат записи когда вокруг "=" нет пробелов? Но именно в таком виде и нужно составлять список переменных для сохранения, т.к. если в значении по умолчанию будет "=", то опять будут ошибки, хотя редко встретишь в настройках "="...

Ладно, неважно...

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

15

Re: AHK: Хранения измененных значений переменных внутри скрипта

если в значении по умолчанию будет "=", то опять будут ошибки.

Не будут, мы же их пропускаем кодом:

%A_Space%%A_Tab%

16 (изменено: Alectric, 2015-08-30 21:32:45)

Re: AHK: Хранения измененных значений переменных внутри скрипта

Добавь в список:

var = ha ha = var

и сохрани настройки.


Но, вообще, можно закрыть уже тему, это как я уже сказал редкий случай.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.