<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Передача массива как типа данных VARIANT]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=12410&amp;type=atom" />
	<updated>2017-02-09T03:15:33Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=12410</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=112023#p112023" />
			<content type="html"><![CDATA[<p>Скорее, чтобы компиляторы могли отлавливать ошибки программистов.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2017-02-09T03:15:33Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=112023#p112023</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=112016#p112016" />
			<content type="html"><![CDATA[<p>Спасибо, после АНК конечно все эти типы кажутся чем то лишним. Это вообще нужно только для повышения производительности?</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-02-08T22:30:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=112016#p112016</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111990#p111990" />
			<content type="html"><![CDATA[<p>Сами массивы передаются оба в Вариантах, но у gpCode члены имеют тип Integer, а у dataValue они тоже Варианты. Возможно, в этом массиве нужна возможность передавать разные типы, поэтому члены массива и обернули в Варианты. Т.е. формально все элементы массива имеют один тип, Вариант, один размер, как и положено. Но внутри Вариантов уже могут быть данные разных типов и размеров. Для этого, наверно, тип Вариант и был когда-то выдуман.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2017-02-08T12:14:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111990#p111990</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111987#p111987" />
			<content type="html"><![CDATA[<p><strong>YMP</strong><br />Спасибо огромное, работает!</p><p>Следующий параметр FilterData почему то надо передавать как VT_VARIANT := 12, не подскажете почему так, ведь в справке тип такой же указан. VBA это непонятно.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-02-08T11:07:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111987#p111987</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111983#p111983" />
			<content type="html"><![CDATA[<p>Массив будет завёрнут в Вариант при передаче методу, АНК сам это сделает. А члены массива заворачивать не надо, судя по этому:<br /></p><div class="codebox"><pre><code>
Dim gpCode(0) As Integer
Dim dataValue(0) As Variant
</code></pre></div><p>Если члены тоже Варианты, то это объявляется явным образом. Значит, они просто целые числа. Но Integer в VBA, как я нагулил, это 16-битные числа, а не 32-битные. Так что, наверно, надо так:<br /></p><div class="codebox"><pre><code>
arr := ComObjArray(VT_I2 := 2, 1)
arr[0] := 62
ComObj.Method(arr)
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2017-02-08T03:28:30Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111983#p111983</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111980#p111980" />
			<content type="html"><![CDATA[<p>Ругается всё равно.<br /></p><div class="quotebox"><blockquote><p>Error:&nbsp; 0x80070057 - Параметр задан неверно.<br />Source:		AutoCAD<br />Description:	Недопустимый аргумент FilterType в Select</p></blockquote></div><p><a href="http://help.autodesk.com/cloudhelp/2015/ENU/AutoCAD-ActiveX/files/GUID-4CDE43DD-E3EF-4EF8-B377-4B9ED03E4C96.htm?guid=GUID-4CDE43DD-E3EF-4EF8-B377-4B9ED03E4C96">Не пойму из справки</a> (параметр FilterType) что ему надо.</p><p>VBA программист пишет:<br /></p><div class="quotebox"><blockquote><p>В таком виде 62 и 3 задавать нельзя. Это же <strong>массивы &quot;завернутые&quot; в Variant</strong>, а не просто целые числа.</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-02-07T17:27:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111980#p111980</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111974#p111974" />
			<content type="html"><![CDATA[<p>Вот так передаётся массив 32-битных целых:<br /></p><div class="codebox"><pre><code>
arr := ComObjArray(VT_I4 := 3, 1)
arr[0] := 62
ComObj.Method(arr)
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2017-02-07T12:32:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111974#p111974</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111973#p111973" />
			<content type="html"><![CDATA[<p>Проверил на своём объекте код из первого поста — методу передаётся тип VT_ARRAY | VT_VARIANT. Т.е. массив вариантов. Может, вашему объекту надо массив целых чисел? Т.е. VT_ARRAY | VT_I4, например. Сам массив, конечно, в варианте передаётся, но его члены, возможно, в варианты упаковывать не надо.</p><p>Код из второго поста передаёт тип VT_DISPATCH, т.е. объект.</p><p>Код от <strong>Malcev</strong>&#039;a — ссылку на пустой вариант.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2017-02-07T12:29:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111973#p111973</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111968#p111968" />
			<content type="html"><![CDATA[<p>Так тоже пробовал, но это вроде аналог byref.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-02-07T11:04:52Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111968#p111968</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111966#p111966" />
			<content type="html"><![CDATA[<p>Опечатка:<br /></p><div class="codebox"><pre><code>ComObj.Method(arr.ref)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2017-02-07T10:19:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111966#p111966</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111959#p111959" />
			<content type="html"><![CDATA[<p>В справке <a href="https://autohotkey.com/docs/commands/ComObjActive.htm#Examples">такой пример нашёл</a>, тоже не получается.</p><div class="codebox"><pre><code>
arr := ComVar()
arr[0] := 62 
ComObj.Method(arr)



; ComVar: Creates an object which can be used to pass a value ByRef.
;   ComVar[] retrieves the value.
;   ComVar[] := Val sets the value.
;   ComVar.ref retrieves a ByRef object for passing to a COM function.
ComVar(Type=0xC)
{
    static base := { __Get: &quot;ComVarGet&quot;, __Set: &quot;ComVarSet&quot;, __Delete: &quot;ComVarDel&quot; }
    ; Create an array of 1 VARIANT.  This method allows built-in code to take
    ; care of all conversions between VARIANT and AutoHotkey internal types.
    arr := ComObjArray(Type, 1)
    ; Lock the array and retrieve a pointer to the VARIANT.
    DllCall(&quot;oleaut32\SafeArrayAccessData&quot;, &quot;ptr&quot;, ComObjValue(arr), &quot;ptr*&quot;, arr_data)
    ; Store the array and an object which can be used to pass the VARIANT ByRef.
    return { ref: ComObject(0x4000|Type, arr_data), _: arr, base: base }
}

ComVarGet(cv, p*) { ; Called when script accesses an unknown field.
    if p.MaxIndex() = &quot;&quot; ; No name/parameters, i.e. cv[]
        return cv._[0]
}

ComVarSet(cv, v, p*) { ; Called when script sets an unknown field.
    if p.MaxIndex() = &quot;&quot; ; No name/parameters, i.e. cv[]:=v
        return cv._[0] := v
}

ComVarDel(cv) { ; Called when the object is being freed.
    ; This must be done to allow the internal array to be freed.
    DllCall(&quot;oleaut32\SafeArrayUnaccessData&quot;, &quot;ptr&quot;, ComObjValue(cv._))
}
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-02-07T00:32:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111959#p111959</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Передача массива как типа данных VARIANT]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111955#p111955" />
			<content type="html"><![CDATA[<p>Пытаюсь методу сом объекта передать массив в типе данных VARIANT:</p><div class="codebox"><pre><code>arr := ComObjArray(VT_VARIANT := 12, 1)
arr[0] := 62
ComObj.Method(arr)
</code></pre></div><p> Который ему требуется, судя по коду VBA.<br /></p><div class="codebox"><pre><code>Dim gpCode(0) As Integer 
gpCode(0) = 62
Dim groupCode As Variant
groupCode = gpCode
&#039; указываю groupCode как передаваемый параметр</code></pre></div><p>Может вообще не туда копаю?</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-02-07T00:08:20Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111955#p111955</id>
		</entry>
</feed>
