1 (изменено: Indrik, 2015-02-18 03:41:33)

Тема: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

День добрый!
Помогите чем можете. Есть простой скрипт, он проверят наличие файла message.txt в папке и в случае его наличия, выводит его содержимое в окне GUI. Проверяет он постоянно, висит в процессах всё время (это модуль моей программы по отправке сообщений между компьютерами локальной сети). Собственно, вот скрипт:

#SingleInstance force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 3

path = C:\Share
sender = Джубадзе
name = message.txt
col = navy
font = Calibri

setworkingdir, %path%

loop
{
sleep, 2000
ifexist, %name%
{
fileread, file, %name%
if file
{
gui, font, s14 c%col%, %font%
gui, add, text, w380 center, %file%
gui, add, button, x155 default, Хорошо!
gui, show, w400 center, Сообщение от %sender%
return

buttonХорошо!:
guiclose:
gui, destroy
filedelete, %name%
reload
return

}
}
}
exitapp

Так вот. Скрипт в данном виде работает так как я хочу, всё ОК. Но! Обратите внимание на этот кусок:

buttonХорошо!:
guiclose:
gui, destroy
filedelete, %name%
reload
return

Здесь прописана инструкция что делать если нажата кнопка Хорошо! или крестик. Окно убирается, файл сообщения удаляется. А дальше, мне пришлось прописать директиву reload, чтобы всё работало как надо. Если reload не прописать, то цикл loop не начинается заново. Насколько я понял, это происходит потому, что после команды return скрипт опять ждёт нажатия Хорошо! или крестика, и на этом зацикливается. То есть, после обработки нажатия, дальнейшего продвижения по телу цикла не происходит.
Вопрос: как сделать так, чтобы цикл выполнялся дальше после обработки нажатия в окне, без необходимости перезагружать скрипт? (а дальше, как видно из кода, должна идти его новая итерация)
Всё-таки, перезагрузка скрипта, это как-то по-варварски.
msgbox не предлагать

2

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Indrik, ознакомьтесь с этой темой, отредактируйте заголовок.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

+ Оff Top (По замечанию модератора teadrinker)

Уже можно отвечать или же требуется правка автора?
Видимо требуется, судя по датам, но я решил спросить... всё же.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4 (изменено: Indrik, 2015-02-18 03:49:20)

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Тему поправил.

5

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Например, вынести Gui из цикла, переходить на него с помощью GoSub и ждать закрытия окна Gui (WinWaitClose).

6

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

и ждать закрытия окна Gui (WinWaitClose)

Так, интересно. А где ждать? Внутри обработки кнопок или после них. Если ждать после, то до того момента дело просто не дойдёт (всё из-за того же зацикливания). Если ждать до, то это сработает, но подпрограмма не будет закрыта и, как следствие, после каждого показанного сообщения объём памяти, используемый скриптом, будет увеличиваться (а это ещё хуже, чем reload).

7

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

SetTitleMatchMode, 2
Gosub, Gui
WinWaitClose, Сообщение от
Msgbox Продолжение цикла
ExitApp
 
Gui:
gui, font, s14 c%col%, %font%
gui, add, text, w380 center, %file%
gui, add, button, x155 default, Хорошо!
gui, show, w400 center, Сообщение от %sender%
return

buttonХорошо!:
guiclose:
gui, destroy
filedelete, %name%
return

8 (изменено: Indrik, 2015-02-18 04:16:15)

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Попробую, но вряд ли это сработает. Если выполнение зацикливалось в блоке buttonХорошо!-return раньше, то что ему мешает зациклиться там и в вашем варианте? До команды winwaitclose дело просто не дойдёт, как не доходило у меня до закрывающих фигурных скобок.
И потом, где у вас второй return? Первый (в самом низу) относится к блоку buttonХорошо!, а за ним по идее должен идти второй, который будет относится уже к подпрограмме Gui, разве нет?
Нужно как-то выйти из блока buttonХорошо!-return так, чтобы подпрограмма закрылась и для новой не выделялось новое место в памяти. Команда continue не помогает, как и exit, break, и дополнительный return.

9

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Почитайте внимательнее про GoSub.

10

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Почитал. Ничего нового не вычитал. Что вы имеете в виду?
gosub, label1 переводит выполнение на подпрограмму, начинающуюся с label1: и заканчивающуюся return. Когда скрипт встречает return, он возвращается к той строке, что идёт сразу после вызова подпрограммы. Вот только ваш return относится не к подпрограмме, а к блоку buttonХорошо! (по крайней мере, по принципу вложенности, это должно быть так), который, как известно, требует return в обязательном порядке.
...к тому же, выполнение же всё равно зациклится на блоке buttonХорошо!... (он же не изменился)
Ладно, иду спать, завтра буду пробовать, может что и получится. Спасибо за советы. Отпишусь.

11 (изменено: Malcev, 2015-02-18 04:52:07)

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Я не понимаю про какой мой return вы говорите.
Для GoSub нету понятия его return или не его, если по пути не встретился другой GoSub.
После выполнения

gui, show, w400 center, Сообщение от %sender%
return

скрипт возвращается к строке

WinWaitClose, Сообщение от

и соответственно ждет, когда вы закроете гуи.

12 (изменено: YMP, 2015-02-18 08:27:09)

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Indrik, каждый раз создавать и разрушать Gui — это из той же оперы, что Reload для продолжения цикла. Гуи создают один раз, а потом только показывают или прячут по мере необходимости. Обработчики кнопок помещать внутрь цикла — это тоже не дело. Попробуйте вот этот вариант:


#SingleInstance force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 3

path = C:\Share
sender = Джубадзе
name = message.txt
col = navy
font = Calibri

setworkingdir, %path%

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w380 center, %file%
gui, add, button, x155 default, Хорошо!

loop
{
    sleep, 2000
    ifexist, %name%
    {
        fileread, file, %name%
        if file
        {
            gui, show, w400 center, Сообщение от %sender%
            winwaitclose, ahk_id %guihwnd%
        }
    }
}

buttonХорошо!:
guiclose:
gui, hide
filedelete, %name%
return

13 (изменено: Indomito, 2015-02-18 23:45:59)

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Indrik пишет:

Всё-таки, перезагрузка скрипта, это как-то по-варварски.
msgbox не предлагать.

Почему же?

Вот, может пригодится, мой MsgBox.

Весь исходный код(без файлов wav, png)

+ Функция GMsgBox
;************************************************************************************
;---------------Начало секции инициализации всех функций-----------------------------
If A_IsCompiled
    {
      vDirGMB  := "AllAddFunc.res\GMsgBox.res"
      IfNotExist, AllAddFunc.res\GMsgBox.res
          {
            FileCreateDir, AllAddFunc.res\GMsgBox.res ; Создаём папку для ресурсов
            FileSetAttrib, +H+A+R, AllAddFunc.res              ; Делаем её архивной, только для чтения и скрытой 
            FileSetAttrib, +H+A+R, AllAddFunc.res\GMsgBox.res  ; Делаем её архивной, только для чтения и скрытой 
          }
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\GMB.ini,       AllAddFunc.res\GMsgBox.res\GMB.ini
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Default.wav,   AllAddFunc.res\GMsgBox.res\Default.wav
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Done.wav,      AllAddFunc.res\GMsgBox.res\Done.wav
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Error.wav,     AllAddFunc.res\GMsgBox.res\Error.wav
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Question.wav,  AllAddFunc.res\GMsgBox.res\Question.wav
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Alert.wav,     AllAddFunc.res\GMsgBox.res\Alert.wav
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Info.wav,      AllAddFunc.res\GMsgBox.res\Info.wav
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Default.png,   AllAddFunc.res\GMsgBox.res\Default.png
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Done.png,      AllAddFunc.res\GMsgBox.res\Done.png
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Error.png,     AllAddFunc.res\GMsgBox.res\Error.png
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Question.png,  AllAddFunc.res\GMsgBox.res\Question.png
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Alert.png,     AllAddFunc.res\GMsgBox.res\Alert.png
      FileInstall, C:\AHK\Include\AllAddFunc.res\GMsgBox.res\Info.png,      AllAddFunc.res\GMsgBox.res\Info.png
    }
  Else
    {
     vDirGMB  := "C:\AHK\Include\AllAddFunc.res\GMsgBox.res"
    }

Goto PointBypass_AllAddFunc  ;Обход активной части модуля

;************************************************************************************
; Подпрограмма иницализации вызвать после подключения по... 
; #Include C:\AHK\Include\AllAddFunc.ahk
;--------Beginning the initialization section of all functions---------------------------------

;--------Beginning of the initialization functions of GMsgBox----------------------------------
Install_GMsgBox:
  fInstall_GMsgBox := False
  
  сMsgOkInfoModal   :=0+8192+64 ;only an OK button + Task Modal + Icon Asterisk(info)
  сMsgOkErModal     :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)
  сMsgOkAlertModal  :=0+8192+48 ;only an OK button + Task Modal + Icon Exclamation
  сMsgYNQuestModal  :=4+8192+32 ;Yes/No button  + Task Modal + Icon Question
  сMsgYNInfoModal   :=4+8192+64 ;Yes/No button + Task Modal +  Icon Asterisk (info)
  
  ; Проверка файлов на существование
 ; Описание массива Звук + ICO для простоты вызова 
  ; Simple beep
  cSoundDefault := "Default.wav",   cIcoDefault  := "Default.png"
  ; Done
  cSoundDone    := "Done.wav",      cIcoDone    := "Done.png"
  ; Error
  cSoundError   := "Error.wav",     cIcoError   := "Error.png",
  ; Question
  cSoundQuest   := "Question.wav",  cIcoQuest   := "Question.png",
  ; Alert
  cSoundAlert   := "Alert.wav",     cIcoAlert   := "Alert.png"
  ; Info
  cSoundInfo  := "Info.wav",       cIcoInfo    := "Info.png"
  iSetOfButtonMin   := iSetOfButtonBeep  :=1
  iSetOfButtonDone  :=2
  iSetOfButtonError :=3
  iSetOfButtonQuest :=4
  iSetOfButtonAlert :=5
  iSetOfButtonMax   := iSetOfButtonInfo  :=6
  arSoundIco    := [[cSoundDefault,cIcoDefault,"Default"]
                   ,[cSoundDone,cIcoDone,"Done"]
                   ,[cSoundError,cIcoError,"Error"]                   
                   ,[cSoundQuest,cIcoQuest,"Question"]                   
                   ,[cSoundAlert,cIcoAlert,"Alert"]                   
                   ,[cSoundInfo,cIcoInfo,"Info"]]

;Коды комбинаций кнопок, If ((cBtOk || cBtOkC || cBtYN || cBtYNC)<0) Then Left-Most Else Right-Most                   
  cButtonKeyNot := False, cButtonKeyOk   := 1, cButtonKeyOkC  := 2, cButtonKeyYN   := 3, cButtonKeyYNC  := 4

  ;Имена кнопок(можно менять)
iNameEng := 1
iNameRus := 2
  arNameBT  := [["OK","Cansel","Yes","No"]
              ,["ОК","Отмена","Да","Нет"]]

Gosub lCheckUsedFiles

fInstall_GMsgBox := True
Return
;-----------End of the initialization functions of GMsgBox--------------------

;--------End of the initialization section of all functions-------------------
;************************************************************************************

;************************************************************************************
;                         Начало описания функций
;************************************************************************************
;------------------Начало определения функции GMsgBox (Свой MsgBox)------------------
GMsgBox(i,TittleGMB,TextGMB
        ,DelayGMB := 30.5, ButtonKey := False, ButtonLng := 2
        ,SizeTextGMB := 12, ColorTextGMB := "000000", FontWeightTextGMB :=  "300", FontTextGMB := "Verdana"
        ,SizeButnGMB := 14, ColorButnGMB := "000000", FontWeightButnGMB :=  "850", FontButnGMB := "MS sans serif")
{
Global vDirGMB, arSoundIco, arNameBT, сMsgOkErModal,  iSetOfButtonMin,  iSetOfButtonMax
  ; If ((BtOk || BtOkC || BtYN || BtYNC)<0) Then Left-Most Else Right-Most
  BtNot := False, BtOk   := 1, BtOkC  := 2, BtYN   := 3, BtYNC  := 4
  retDef :=  False ; Значение не определено
  retTimeOut := 100, retOk := retYes := 1, retNo := 2, retESC  := 3, retCross  := 4, retCancel := -1
  
  Gosub lAllCheck ;Проверяем валидность входных данных, т.е. которые можем проверить - выход без условный при ошибке
  DelayGMB := Ceil(Round(DelayGMB,1)*10) ; Коррекция и установка времени задержки с точностью до одной десятой секунды.
  DelayStep := 100 ; Шаг ожидания в цикле, даёт эквивалент для  DelayGMB времени ожидания в секундах
  SoundGMB  := vDirGMB "\" arSoundIco[i,1]   ; Установка звукового сигнала
  PicGMB    := vDirGMB "\" arSoundIco[i,2]   ; Установка титульной картинки

  ButOk      := arNameBT[ButtonLng,1] ; Имя кнопки ОК
  ButCancel  := arNameBT[ButtonLng,2] ; Имя кнопки Cancel
  ButYes     := arNameBT[ButtonLng,3] ; Имя кнопки Yes
  ButNo      := arNameBT[ButtonLng,4] ; Имя кнопки No
  
  If (ButtonKey < 0)        ; Расчёт позиционировани кнопок
        posBT:= "xm y+m"          ; Слева
     Else
        posBT:= "x+m y+m"         ; Справа
        
  ButtonKey := Abs(ButtonKey)   ;Сброс значения кнопок в абсолютное значение
  
  Gosub lCreateGMB    ; Создание окна MsgBox
  Gosub lWaitGMB      ; Ожидание кода возвората по событию или по тайм-ауту
Return  ret

lCreateGMB:
  Gui, New , -maximizebox -minimizebox +AlwaysOnTop +Caption, %TittleGMB%
  Gui, Font, c%ColorTextGMB% s%SizeTextGMB% w%FontWeightTextGMB%, %FontTextGMB%
  Gui, Add, Picture, xm ym, %PicGMB%
  Gui, Add, Text,xm, %TextGMB%
  Gui, Font, c%ColorButnGMB% s%SizeButnGMB% w%FontWeightButnGMB%, %FontButnGMB%
  If (ButtonKey = BtOk)
          Gui, Add, Button, section Default %posBT% gSubOk, &%ButOk%

    Else If (ButtonKey = BtOkC)
            {
              Gui, Add, Button, section Default %posBT% gSubOk, &%ButOk%
              Gui, Add, Button, section Default x+m gSubCancel, %ButCancel%
            }
    Else If (ButtonKey = BtYN)
            {
              Gui, Add, Button, section Default %posBT% gSubYes, &%ButYes%
              Gui, Add, Button, section Default x+m gSubNo, %ButNo%
            }
    Else If (ButtonKey = BtYNC)
            {
              Gui, Add, Button, section Default %posBT% gSubYes, &%ButYes%
              Gui, Add, Button, section Default x+m gSubNo, %ButNo%
              Gui, Add, Button, section Default x+m gSubCancel, %ButCancel%
            }
    Else
      {
       ;Ошибочный код, просто не выводим кнопки, эквивалент BtNot
      }
 
  Gui, Show, AutoSize Center
  SoundPlay %SoundGMB%
  fGMB := False
Return

;Подпрограмма тайм-аута
lWaitGMB:
  Loop %DelayGMB% ; N секунд 
    {
    If (fGMB)
          Break
    Sleep %DelayStep%
   }
  If (ret = retDef) 
        ret :=  retTimeOut
  Gui, Cancel
Return

;Подпрограммы событий нажатия на кнопки
SubOk:
  ret   :=  retOk
  fGMB  := True
Return

SubCancel:
  ret   :=  retCancel
  fGMB  := True
Return

SubYes:
  ret   :=  retYes
  fGMB  := True
Return

SubNo:
  ret   :=  retNo
  fGMB  := True
Return

GuiEscape:
  ret   :=  retESC
  fGMB  := True
Return

GuiClose:
  ret   :=  retCross
  fGMB  := True
Return

;Подпрограмма валидности входных данных
lAllCheck:
  txtErr1 := "Ошибка в при вызове функциии GMsgBox  `n`n"
  txtErr2 := "`n`n`n Критическое завершение программы"
 If (i < iSetOfButtonMin || i > iSetOfButtonMax)
      txtErr0 := "Ошибка в индексе набора звука и иконок"
  Else If (DelayGMB<0)
       txtErr0 := "Ошибка в задержке, она не должана быть отрпицатильным числом"
  Else If (ButtonLng<=0 || ButtonLng>2)
      txtErr0 := "Ошибка в индексе языка кнопок"
  Else If (fInstall_GMsgBox = False)
       txtErr0 := "Ошибка - не проведена ининициализация функции GMsgBox"
  Else 
    Return  ; Всё нормально
    
  MsgBox %  сMsgOkErModal, Ошибка использования GMsgBox
            ,%txtErr1% %txtErr0% %txtErr2%
            ,30
  ExitApp
Return
}
;------------------Конец определения функции GMsgBox (Свой MsgBox)------------------

;---------------Addition to the initialization functions of GMsgBox-----------------
lCheckUsedFiles:                   
; Провеки верности и существования INI-файла, файлов звука и файлов картинок.                   
  vPicGMB       := vDirGMB "\GMB.ini"
  IfNotExist, %vPicGMB%
      {
        MsgBox %  сMsgOkErModal, Ошибка инициализации GMsgBox
            ,"Файл " %vPicGMB% "`n Не существует`n Выход из программы."
            ,30
        ExitApp
      }

  i := iSetOfButtonMin
  Loop %iSetOfButtonMax%
    {
      vKey := arSoundIco[i,3] ; Имя ключа

;--------  Проверка файла звука
      IniRead, OutputVar, %vPicGMB%, Sound, %vKey%
      If (OutputVar != arSoundIco[i,1])
            {
              MsgBox %  сMsgOkErModal, Ошибка инициализации GMsgBox
                    ,"Неверное названия файла звука " %OutputVar% "`n `n Выход из программы."
                    ,30
              ExitApp
            }
      vDirTmp := vDirGMB "\" OutputVar
      IfNotExist, %vPicGMB%
            {
              MsgBox %  сMsgOkErModal, "Ошибка инициализации GMsgBox"
                        ,"Файл звука" %vPicGMB% "`n Не существует`n Выход из программы."
                        ,30
              ExitApp
            }
      
;--------  Проверка файла картинки      
      IniRead, OutputVar, %vPicGMB%, Picture, %vKey%
      If (OutputVar != arSoundIco[i,2])
            {
              MsgBox %  сMsgOkErModal, Ошибка инициализации GMsgBox
                    ,"Неверное названия файла картинки " %OutputVar% "`n `n Выход из программы."
                    ,30
              ExitApp
            }
      vDirTmp := vDirGMB "\" OutputVar
      IfNotExist, %vPicGMB%
            {
              MsgBox %  сMsgOkErModal, "Ошибка инициализации GMsgBox"
                        ,"Файл картинки" %vPicGMB% "`n Не существует`n Выход из программы."
                        ,30
              ExitApp
            }
      i++
    }
Return
;------------End of additions to initialization functions of GMsgBox;---------------


;************************************************************************************
;                         Конец описания функций
;************************************************************************************
PointBypass_AllAddFunc:

Файл GMB.ini

[Sound]
Default=Default.wav
Done=Done.wav
Error=Error.wav
Question=Question.wav
Alert=Alert.wav
Info=Info.wav

[Picture]
Default=Default.png
Done=Done.png
Error=Error.png
Question=Question.png
Alert=Alert.png
Info=Info.png

Иницализация.

#Include C:\AHK\Include\AllAddFunc.ahk
Gosub Install_GMsgBox

Примеры вызова.

GMsgBox(iSetOfButtonInfo,"Архивация","Старт архивации программы" "`n`n`t " vGenNameIn,1.5)

GMsgBox(iSetOfButtonError,"Ошибка выполнения программы", vTxtErr  "`n`n Код ошибки = " vExitCode,,-cButtonKeyOk)

Может пригодиться, есть код возврата по событию.

P.S. Убраны остальные функции, не относящиеся к делу.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

14

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

А что это за команда? Нигде не могу найти официальное описание. Вроде похоже на какой-то стиль окна, но в списке стилей этой команды нет.

gui, +hwndguihwnd

А вот тут:

После выполнения
gui, show, w400 center, Сообщение от %sender%
return
скрипт возвращается к строке
WinWaitClose, Сообщение от

Вот оно что. А я думал, что этот return относится к самому gui, show. Ну тогда понятно. Правда, получается что фокус выполнения раздваивается: он перешёл на строку WinWaitClose, но при этом одновременно может ожидать закрытия окна, хотя до туда он вообще не дошёл. Не знал, что такое возможно.

15

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

YMP, ваш вариант работает, но само сообщение (содержимое файла message.txt) не отображается. Что-то с переменной file. Кажется, в неё не передаётся значение из цикла.

16

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Сделал вот такой вариант. Похоже, переменная file не обновляется в уже созданном gui, поэтому я перенёс часть его внутрь цикла. Так можно делать? Т.е. разбивать описание gui на две части (одна до цикла, а другая в цикле)?

setworkingdir, %path%

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%

loop
{
sleep, 2000
ifexist, %name%
{
fileread, file, %name%
if file
{
gui, add, text, w380 center, %file%
gui, add, button, x155 default, Хорошо!
gui, show, w400 center, Сообщение от %sender%
winwaitclose, ahk_id %guihwnd%
}
}
}

buttonХорошо!:
guiclose:
gui, hide
filedelete, %name%
return

17

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Одно осталось непонятно. Самый главный вопрос. Почему в моём изначальном варианта на блоке buttonХорошо!: (внутри цикла) происходило зацикливание и цикл loop не продолжался, а в новом варианте (вне цикла) этого не происходит? Есть какое-то ограничение на использование обработки нажатий внутри циклов?

18 (изменено: Alectric, 2015-02-19 22:49:39)

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Все что внутри цикла - будет выполняться, если не встретятся: Return, Continue или Break.
А строка с двоеточием это всего лишь метка перехода, цикл ее просто не замечает и идет дальше, если эта метка не была вызвана, если она была вызвана, то начнут работать команды следующие после нее до Return, после чего выполнение вернется в точку вызова этой метки, и продолжится дальше, также не замечая метки.

OFF: Ужас какое сложное предложение составил... и скорей всего не правильно.
Чтобы лучше понимать свой собственный код, форматируй его пробелами или табуляциями:

setworkingdir, %path%

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w380 center vtextspace
gui, add, button, x155 default, Хорошо!

loop
{
  sleep, 2000
  ifexist, %name%
  {
    fileread, file, %name%
    if file
    {
      GuiControl,,textspace,%file%
      gui, show, w400 center, Сообщение от %sender%
      winwaitclose, ahk_id %guihwnd%
    }
  }
}

buttonХорошо!:
guiclose:
gui, hide
filedelete, %name%
return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

19

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

Alectric, спасибо. То есть, в первоначальном варианте мой цикл прерывался сразу после первого же return, а блок buttonХорошо!: срабатывал только потому, что он всегда срабатывает, если вызвана метка, даже если выполнение до него не доходит.
В лом пробелы с табами делать, как-то не привык я к такому. На C# в инт. среде такая штука стоит автоматически, а тут-то всё в Блокноте, приходится самому эти отступы ставить, да ещё следить, чтобы их было сколько надо соответственно уровню вложения. Дикая морока.
Вот когда сделают для Autohotkey свою среду с подсветкой синтаксиса и авто-отступами, это будет здорово. Да ещё бы с собственной системой отладки, чтоб выделяла строку, которая выполняется в данный момент, вообще красота была бы.
А так вроде всё, с gui, +hwndguihwnd я разобрался. Это запоминание ID окна в переменную. Описание GUI разделять можно (судя по тому, что вызывается окно по одному и тому же ID - значит это то же окно).
Ошибок скрипт не выдаёт, ОЗУ не увеличивается, reload-ов нет. Всем спасибо!

20

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

В справке написано про потоки.

Про синтаксис - есть коллекция ссылок, там для разных редакторов можно найти синтаксис, вроде даже авторасстановка пробелов есть.

21

Re: AHK: Продолжение работы скрипта после нажатия кнопки в GUI

http://fincs.ahk4.net/scite4ahk/