1

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

Заранее спасибо!

AHK v1.1.22.07 (Unicode)

2

Re: AHK: Closure(Замыкание) функции

Читайте внимательно хэлп про таймер. Его можно организовать не только с помощью метки, но и Func-объекта, к которому можно забиндить нужные параметры.

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

3 (изменено: yalanne, 2015-11-06 18:35:24)

Re: AHK: Closure(Замыкание) функции

Вот так подходит?

tlt := new tlt
Class tlt{
	create(text="" , delay=2000, coordX="" , coordY="",endCallback = ""){
		this.text:=text , this.delay:=delay , this.coordX:=coordX , this.coordY:=coordY , this.endCallback:=endCallback
		ToolTip % text, coordX, coordY
		Settimer % this,% "-" delay
		}
	__Call(name){
		if (name="call"){
			ToolTip
			% (this.endCallback) and this.create(this.text, this.delay,this.coordX,this.coordY,this.endCallback)
		}}}

tlt.create("тест",2000,100,100,1)
F1::tlt.endCallback := ""		; выключить.(тултип повторно не появится после ожидания времени.)

Вариант 2:

tlt := new tlt
Class tlt{
	__Call(name , text="" , delay=2000, coordX="" , coordY="",endCallback = "") {
		if (name = "create") and (this.delay := delay) and (this.endCallback := endCallback) {
			ToolTip % text, coordX, coordY
			Settimer % this,% "-" delay
		} Else If (name = "call")
			if this.endCallback
				Settimer % this,% "-" this.delay
			else
				ToolTip
}}

tlt.create("тест",2000,100,100,1)
F1::tlt.endCallback := ""		; выключить.(тултип повторно не появится после ожидания времени.)