1 (изменено: Indomito, 2015-02-14 20:02:34)

Тема: AHK: GUI динамическое задание контролов и их обработка

Я тут собрался написать свой MsgBox, но натолкнулся на проблемы.
После, фрагмента кода их опишу.

;************************************************************************************
;                         Начало описания функций
;************************************************************************************
;------------------Начало определения функции GMsgBox (Свой MsgBox)------------------
GMsgBox(i,TittleGMB,TextGMB
        ,DelayGMB := 30, ButtonKey := False, ButtonLng := 2
        ,SizeTextGMB := 12, ColorTextGMB := "000000", FontTextGMB := "Verdana"
        ,SizeButnGMB := 10, ColorButnGMB := "000000", FontButnGMB  := "Verdana")
{
Global vDirGMB, arSoundIco, arNameBT, сMsgOptionsEr
  ; If ((BtOk || BtOkC || BtYN || BtYNC)<0) Then Left-Most Else Right-Most
  Static BtNot := False, BtOk   := 1, BtOkC  := 2, BtYN   := 3, BtYNC  := 4
  Static retTimeOut := -1, retCancel := False, retOk := retYes := 1, retNo := 2, retESC  := 3, retCross  := 4, 
  
  Gosub lAllCheck ;Проверяем валидность входных данных, т.е. которые можем проверить - выход без условный при ошибке
  DelayGMB := Round(DelayGMB) ; Коррекция и установка времени задержки
  SoundGMB := arSoundIco[i,1]   ; Установка звукового сигнала
  PicGMB   := 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:
;--------------------
; Тут создание окна - проблем нет.
;--------------------

; Задание кнопок по входным условиям - тоже проблем нет.
  If (ButtonKey = BtOk)
          Gui, Add, Button, section Default %posBT%, &%ButOk%

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

; ----> А вот тут, не работает, т.е. не работают обработчики, перепробовал все варианты - не получается.
Button%ButOk%:
  ret :=  retOk
Goto CloseGMB

Button%ButCancel%:
  ret :=  retCancel
Goto CloseGMB

Button%ButnYes%:
  ret :=  retYes
Goto CloseGMB

Button%ButNo%:
  ret :=  retNo
Goto CloseGMB

GuiEscape:
  ret :=  retESC
Goto CloseGMB

GuiClose:
  ret :=  retCross
Goto CloseGMB

lWaitGMB:
  Loop %DelayGMB% ; N секунд
    {
    If (fGMB)
          Break
    Sleep 1000
   }
  ret :=  retTimeOut
CloseGMB:
  fGMB := True
  Gui, Cancel
Return ret

;Подпрограмма валидности входных данных не привожу - в ней не должно быть проблем.
lAllCheck:
Return
}

Дополнительно даю иниациализацию функции, только то что может быть связанно с ошибкой в скрипте.

  arNameBT  := [["OK","Cansel","Yes","No"]
              ,["ОК","Отмена","Да","Нет"]]

 ; Описание массива Звук + ICO для простоты вызова 
  cSoundBeep    := "*-1"      
  cIcoBackup    := "Backup.png"
  cSoundDone    := "Done.wav" 
  cIcoDone      := "Done.png"
  cSoundError   := "*16" 
  cIcoError     := "Error.png"
  cSoundQuest   := "*32" 
  cIcoQuest     := "Question.png"
  cSoundAlert  := "*48" 
  cIcoAlert    := "Alert.png"
  cSoundInfo    := "*64"
  cIcoInfo      := "Info.png"
  arSoundIco    := [[cSoundBeep,cIcoBackup]
                   ,[cSoundDone,cIcoDone]
                   ,[cSoundError,cIcoError]                   
                   ,[cSoundQuest,cIcoQuest]                   
                   ,[cSoundAlert,cIcoAlert]                   
                   ,[cSoundInfo,cIcoInfo]]

И так, если сказать кратко, то не работают две вещи.

Первое.


;----- Этот код(например)
              Gui, Add, Button, section Default %posBT%, &%ButOk%
              Gui, Add, Button, section Default x+m , %ButCancel%

;-----Не доходит до обработчика/Не приходит к обработчи(ку)кам
Button%ButOk%:
  ret :=  retOk
Goto CloseGMB

Button%ButCancel%:
  ret :=  retCancel
Goto CloseGMB

Второе.


;----- Нет кода возврата.
CloseGMB:
  fGMB := True
  Gui, Cancel
Return ret

Я как понимаю писать, так Button%ButCancel%: нельзя, но как иначе я не нашёл.
Ну, а код возврата я найду... со временем.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

2

Re: AHK: GUI динамическое задание контролов и их обработка

Откуда же код возврата у процедуры? Это, батенька, ересь.

3

Re: AHK: GUI динамическое задание контролов и их обработка

Да, упустил, ища основную ошибку, придётся немного перестроить функцию.

А с метками то как быть?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

4

Re: AHK: GUI динамическое задание контролов и их обработка

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

5

Re: AHK: GUI динамическое задание контролов и их обработка

Так их надо экранировать? Или есть другой метод?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

6

Re: AHK: GUI динамическое задание контролов и их обработка

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

7

Re: AHK: GUI динамическое задание контролов и их обработка

Метка обработчика кнопки ведь не обязана содержать имя этой кнопки. Почему так не сделать, например?


Gui, Add, Button, section Default x+m gCancel, %ButCancel%

Cancel:

8 (изменено: Indomito, 2015-02-14 21:17:37)

Re: AHK: GUI динамическое задание контролов и их обработка

Спасибо за идею.

А разве, префикс g не говорит что это подпрограмма, т.е. аналог Gosub Cancel, т.е.  потребуется Return?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

9

Re: AHK: GUI динамическое задание контролов и их обработка

Конечно, потребуется, а где он не требуется? Другое дело, что никакого значения он вернуть не может.

10

Re: AHK: GUI динамическое задание контролов и их обработка

Ещё, раз спасибо - возникнут вопросы по этой теме, тогда я напишу.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro