Тема: AHK: Размещение метки "GuiClose" в теле функции.
Здоровья всем.
Понадобилось выполнять частый выбор из множества вариантов и чтобы для каждого варианта выбора не писать отдельный код, решил описать шаблон в функции:
nmbrArr := ["число1","число2","число3","число4","число5","чииислооо6"]
abcArr := ["one", "two", "three", "four", "fivewwwww"]
CreateButton_list(nmbrArr, 1)
CreateButton_list(abcArr, 2)
CreateButton_list(nmbrArr, 3)
!1::Gui, 1: Show,, Числа 1
!2::Gui, 2: Show,, Слова 1
!3::Gui, 3: Show,, Числа 2
!q::MsgBox,, Title, % "Имя -> " clickReturn "`nВ GUI № -> " guiReturn "`nКнопка номер -> " GetBttnNmbr(clickReturn, guiReturn)
CheckNmbrGUI(nmbr_GUI) {
Static checkGUI
if (checkGUI == "")
checkGUI := [-1]
while (A_Index <= checkGUI.Length()) {
if (checkGUI[A_Index] == nmbr_GUI)
return false
}
checkGUI.Push(nmbr_GUI)
return true
}
CreateButton_list(workArr, nmbr_GUI) {
if (CheckNmbrGUI(nmbr_GUI)) {
Global allBttnNames
if (allBttnNames == "")
allBttnNames := {}
ObjRawSet(allBttnNames, nmbr_GUI, workArr)
arrSize := workArr.Length()
xBttn := 10
yBttn := 10
hBttn := 20
bttnLen := 0
while (A_Index <= arrSize) {
if (StrLen(workArr[A_Index]) > bttnLen)
bttnLen := StrLen(workArr[A_Index])
}
wBttn := bttnLen * 9
Gui, %nmbr_GUI%: +AlwaysOnTop +Toolwindow
colBttn := 1
while (A_Index <= arrSize) {
if (colBttn == 20)
colBttn := 1, xBttn := wBttn + 20, yBttn := 10
Gui, %nmbr_GUI%: Add, Button, x%xBttn% y%yBttn% w%wBttn% h%hBttn%, % A_Index " " workArr[A_Index]
yBttn += 22
colBttn++
}
OnMessage(0x202, "bttnClick")
Return
GuiClose:
Gui, %A_Gui%: Show, Hide
MsgBox,, Title, % "GUI № " A_Gui
return
} else {
MsgBox,, Title, % "GUI номер '" nmbr_GUI "' зарезервирован`nОсуществите вызов с другим параметром!`nПосле закрытия этого окна, приложение завершит работу."
ExitApp
}
}
bttnClick() {
Global clickReturn, guiReturn
Static newCntrl
if (newCntrl != A_GuiControl) {
newCntrl := A_GuiControl
ctrlNameArr := StrSplit(A_GuiControl, A_Space)
clickReturn := ctrlNameArr[2]
guiReturn := A_Gui
Gui, %guiReturn%: Show, Hide
}
}
GetBttnNmbr(bttnName, GUInmbr) {
Global allBttnNames
arrSize := allBttnNames[GUInmbr].Length()
while (A_Index <= arrSize) {
if (allBttnNames[GUInmbr][A_Index] == bttnName)
return A_Index
}
}
Результат кликов по кнопкам в сгенерированных GUI хранится в глобальных переменных, отследить который можно при изменении их содержимого, но если окно было закрыто крестиком, результат остаётся без изменений. Метка "GuiClose" работает только для первого созданного GUI. Есть ли альтернатива? Пробовал OnMessage(0x10, "bttnClose"), но реакции на закрытие крестиком нет. Подскажите пожалуйста.