Тема: 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

