Тема: AHK: Closure(Замыкание) функции
Здравствуйте.
Подскажите пожалуйста как организовать замыкание в AHK?
А если нельзя делать замыкание, то подскажите, плиз, лучший путь для обхода ограничения.
Пример: функция открывает подсказку с закрытием по истечению времени, при закрытии должен быть произведен обратный вызов (если он передан)
; Обертка для вызова подсказки (предполагается что с обратным вызовом по таймауту)
UIToolTip(text = "", delay = 2000, coordX = "", coordY = "", endCallback = "")
{
ToolTip % text, coordX, coordY,
SetTimer, RemoveToolTip, %delay% ; Установка таймера на закрытие
return
; Метка деактивации всплывшей подсказки
RemoveToolTip:
{
SetTimer, %A_ThisLabel%, Off ; Деактивация таймера
ToolTip,
if (IsFunc(endCallback))
endCallback.Call(text) ; Активация обратного вызова
return
}
}Пример вызова:
^F7:: ; Ctrl + F7 - тестирование
{
UIToolTip("My Notify", 1000,,, Func("ShowText"))
}
ShowText(text)
{
MsgBox % text
return
}К сожалению Label вызывается без контекста(окружения) и переданные в функцию значение {endCallback, text} физически не видит. Печально (((
На данный момент обошелся глобальной переменной с биндом, но хотелось бы все же решить с Closure
global GUIToolTipCallback := ""
; Обертка для вызова подсказки (предполагается что с обратным вызовом по таймауту)
UIToolTip(text = "", delay = 2000, coordX = "", coordY = "", endCallback = "")
{
GUIToolTipCallback := endCallback.Bind(text)
ToolTip % text, coordX, coordY,
SetTimer, RemoveToolTip, %delay% ; Установка таймера на закрытие
return
; Метка деактивации всплывшей подсказки
RemoveToolTip:
{
SetTimer, %A_ThisLabel%, Off ; Деактивация таймера
ToolTip,
if (IsObject(GUIToolTipCallback))
GUIToolTipCallback.Call() ; Активация обратного вызова
return
}
}Заранее спасибо!

