<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Closure(Замыкание) функции]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11062&amp;type=atom" />
	<updated>2015-11-06T07:56:31Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11062</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Closure(Замыкание) функции]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=98706#p98706" />
			<content type="html"><![CDATA[<p>Вот так подходит?<br /></p><div class="codebox"><pre><code>tlt := new tlt
Class tlt{
	create(text=&quot;&quot; , delay=2000, coordX=&quot;&quot; , coordY=&quot;&quot;,endCallback = &quot;&quot;){
		this.text:=text , this.delay:=delay , this.coordX:=coordX , this.coordY:=coordY , this.endCallback:=endCallback
		ToolTip % text, coordX, coordY
		Settimer % this,% &quot;-&quot; delay
		}
	__Call(name){
		if (name=&quot;call&quot;){
			ToolTip
			% (this.endCallback) and this.create(this.text, this.delay,this.coordX,this.coordY,this.endCallback)
		}}}

tlt.create(&quot;тест&quot;,2000,100,100,1)
F1::tlt.endCallback := &quot;&quot;		; выключить.(тултип повторно не появится после ожидания времени.)</code></pre></div><p>Вариант 2:<br /></p><div class="codebox"><pre><code>tlt := new tlt
Class tlt{
	__Call(name , text=&quot;&quot; , delay=2000, coordX=&quot;&quot; , coordY=&quot;&quot;,endCallback = &quot;&quot;) {
		if (name = &quot;create&quot;) and (this.delay := delay) and (this.endCallback := endCallback) {
			ToolTip % text, coordX, coordY
			Settimer % this,% &quot;-&quot; delay
		} Else If (name = &quot;call&quot;)
			if this.endCallback
				Settimer % this,% &quot;-&quot; this.delay
			else
				ToolTip
}}

tlt.create(&quot;тест&quot;,2000,100,100,1)
F1::tlt.endCallback := &quot;&quot;		; выключить.(тултип повторно не появится после ожидания времени.)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[yalanne]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32850</uri>
			</author>
			<updated>2015-11-06T07:56:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=98706#p98706</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Closure(Замыкание) функции]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=98704#p98704" />
			<content type="html"><![CDATA[<p>Читайте внимательно хэлп про таймер. Его можно организовать не только с помощью метки, но и Func-объекта, к которому можно забиндить нужные параметры.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-11-06T05:43:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=98704#p98704</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Closure(Замыкание) функции]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=98702#p98702" />
			<content type="html"><![CDATA[<p>Здравствуйте.<br />Подскажите пожалуйста как организовать <a href="https://ru.wikipedia.org/wiki/Замыкание_(программирование)">замыкание</a> в AHK?<br />А если нельзя делать замыкание, то подскажите, плиз, лучший путь для обхода ограничения.</p><p>Пример: функция открывает подсказку с закрытием по истечению времени, при закрытии должен быть произведен обратный вызов (если он передан)<br /></p><div class="codebox"><pre><code>; Обертка для вызова подсказки (предполагается что с обратным вызовом по таймауту)
UIToolTip(text = &quot;&quot;, delay = 2000, coordX = &quot;&quot;, coordY = &quot;&quot;, endCallback = &quot;&quot;)
{
	ToolTip % text, coordX, coordY, 
	SetTimer, RemoveToolTip, %delay% 	; Установка таймера на закрытие
	return
	
	; Метка деактивации всплывшей подсказки
	RemoveToolTip:
	{
		SetTimer, %A_ThisLabel%, Off 	; Деактивация таймера
		ToolTip,
		if (IsFunc(endCallback))
			endCallback.Call(text)			; Активация обратного вызова
		return
	}
}</code></pre></div><p>Пример вызова:<br /></p><div class="codebox"><pre><code>^F7:: ; Ctrl + F7 - тестирование
{
	UIToolTip(&quot;My Notify&quot;, 1000,,, Func(&quot;ShowText&quot;))
}

ShowText(text)
{
	MsgBox % text
	return
}</code></pre></div><p>К сожалению Label вызывается без контекста(окружения) и переданные в функцию значение {endCallback, text} физически не видит. Печально (((</p><p>На данный момент обошелся глобальной переменной с биндом, но хотелось бы все же решить с Closure<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>global GUIToolTipCallback := &quot;&quot;

; Обертка для вызова подсказки (предполагается что с обратным вызовом по таймауту)
UIToolTip(text = &quot;&quot;, delay = 2000, coordX = &quot;&quot;, coordY = &quot;&quot;, endCallback = &quot;&quot;)
{
	GUIToolTipCallback := endCallback.Bind(text)
	ToolTip % text, coordX, coordY, 
	SetTimer, RemoveToolTip, %delay% 	; Установка таймера на закрытие
	return
	
	; Метка деактивации всплывшей подсказки
	RemoveToolTip:
	{
		SetTimer, %A_ThisLabel%, Off 	; Деактивация таймера
		ToolTip,
		if (IsObject(GUIToolTipCallback))
			GUIToolTipCallback.Call()		; Активация обратного вызова
		return
	}
}</code></pre></div></div></div><p>Заранее спасибо!</p>]]></content>
			<author>
				<name><![CDATA[sigmov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33397</uri>
			</author>
			<updated>2015-11-06T02:35:18Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=98702#p98702</id>
		</entry>
</feed>
