массив вариантов передать в ActiveX
От: AndyZ  
Дата: 17.09.01 09:04
Оценка:
Помогите пожалуста разобраться. Каким образом можно передать массив вариантов (на самом деле там будут храниться целые числа) из клиентской программы написанной на VB в программу которая преставляет собой компонент ActiveX. Так же как принять этот массив в ActiveX-е ? Визард ActiveX показывает, что можно задать тип VARIANT, а вот как передать массив вариантов (тобиш собственный тип через COM как передать) ? Заранее спасибо.
Re: массив вариантов передать в ActiveX
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.09.01 20:33
Оценка:
Здравствуйте AndyZ, вы писали:

AZ>Помогите пожалуста разобраться. Каким образом можно передать массив вариантов (на самом деле там будут храниться целые числа) из клиентской программы написанной на VB в программу которая преставляет собой компонент ActiveX. Так же как принять этот массив в ActiveX-е ? Визард ActiveX показывает, что можно задать тип VARIANT, а вот как передать массив вариантов (тобиш собственный тип через COM как передать) ? Заранее спасибо.


Читай про SAFEARRAY (в MSDN и в этих конфах).

А по вопросу... так что собственно нужно? А то у вас каша какая-то. :(

Массив целых — это массив целых... вариант — вариант... и что Вы понимаете под названием "собственный тип"?

В IDL массив целых это: [in] SAFEARRAY(long) psaInt
массив вариантов [in] SAFEARRAY(VARIANT) psaVar
своих структур: [in] SAFEARRAY(MyStruct) psaMyStruct
своих структур по ссылке: [in, out] SAFEARRAY(MyStruct) * ppsaMyStruct

ну и так далее...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: массив вариантов передать в ActiveX
От: Bailif  
Дата: 21.09.01 06:13
Оценка:
Здравствуйте AndyZ, вы писали:

AZ>Помогите пожалуста разобраться. Каким образом можно передать массив вариантов (на самом деле там будут храниться целые числа) из клиентской программы написанной на VB в программу которая преставляет собой компонент ActiveX. Так же как принять этот массив в ActiveX-е ? Визард ActiveX показывает, что можно задать тип VARIANT, а вот как передать массив вариантов (тобиш собственный тип через COM как передать) ? Заранее спасибо.


IMHO SafeArray лучше передавать через VARIANT т.е. запихнуть в вариант ссылку на энтот самый массив

STDMETHODIMP Func(/*[out, retval]*/ VARIANT *pFieldsNamesArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
VARIANT var;
VariantInit(&var);
var.vt = VT_BSTR; //здесь указываем тот тип который забиваем в массив

long nPos = 0;

rgsabound[0].lLbound = 0;
rgsabound[0].cElements = //размер

psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
if (psa == NULL)
{
return E_FAIL;
}

//цикл заполнения
{
var.bstrVal = //чего нибудь
SafeArrayPutElement(psa, &nPos, &var);
nPos++;
}

(*pFieldsNamesArray).vt = VT_ARRAY | VT_VARIANT;
(*pFieldsNamesArray).parray = psa;

return S_OK;
}

— а для работы со скриптом это ед. что он внятно понимает.
Re[2]: массив вариантов передать в ActiveX
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.09.01 18:03
Оценка:
Здравствуйте Bailif.

Для работы в скриптовых языках, не лучше, а обязательно через VARIANT. Для остальных случаев как раз лучше по-нормальному (комплит ворды, контроль при компиляции, скорость работы... знаете ли ;o) ).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: массив вариантов передать в ActiveX
От: AndyZ  
Дата: 22.09.01 00:59
Оценка:
Спасибо всем за ответы. С массивом вариантов (VT_ARRAY |VT_I4) разобрался , все оказалось не так сложно. Вот единственное что осталось так это научиться задавать массив сразу на VB. Если вопрос не сюда, сильно не бейте. Если бы клиент был написан на VC++, проблем нет одним махом (сразу все элементы без обращения по индексу) задается вариантный массив, который превращается в SAFEARRAY. А вот в бэйсике можно задать только одномерный массив DIM A= Array (1,4,5,6,7). А как задать двумерный (многомерный)?
Re[3]: массив вариантов передать в ActiveX
От: Bailif  
Дата: 22.09.01 06:09
Оценка:
Здравствуйте VladD2, вы писали:

VD>Здравствуйте Bailif.


VD>Для работы в скриптовых языках, не лучше, а обязательно через VARIANT. Для остальных случаев как раз лучше по-нормальному (комплит ворды, контроль при компиляции, скорость работы... знаете ли ;o) ).


— IMHO "остальные" случаи составляют как правило исключения, 80% компонентов пишется для использования скриптами — в таком виде поймет и VB и VBS. Просто я сам набил на этом кучу шишек и нехочу чтобы это делали другие...
Относительно "лучше" — согласен ошибочка вышла...
Re[4]: массив вариантов передать в ActiveX
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.09.01 10:20
Оценка:
Здравствуйте Bailif, вы писали:

B>Здравствуйте VladD2, вы писали:


VD>>Здравствуйте Bailif.


VD>>Для работы в скриптовых языках, не лучше, а обязательно через VARIANT. Для остальных случаев как раз лучше по-нормальному (комплит ворды, контроль при компиляции, скорость работы... знаете ли ;o) ).


B>- IMHO "остальные" случаи составляют как правило исключения, 80% компонентов пишется для использования скриптами — в таком виде поймет и VB и VBS. Просто я сам набил на этом кучу шишек и нехочу чтобы это делали другие...

B>Относительно "лучше" — согласен ошибочка вышла...

Вы заблуждаетесь. Скрипты реально применяются в основном в ASP, а с появлением ASP.Net надобность в них отпадает. На ASP свет клином не сошолся. Вот и вопрос "массив вариантов передать в ActiveX" говорит о том, что человеку он не нужен. А за универсальность приходится платить неудобствами (о которых я уже говорил). Так, что, все же, лучше выбирать путь под задачу. Если заранее не известно где будет применяться объект, то конечно лучше использовать вариант. Если точно известно, что получать в скрипте массив не прийдется, лучше делать более корректное объявление. Вот небольшой список приожений понимающих SAFEARRAY: VB 5-6, все языки .Net, VBA, C++ все версии на Intel, Дельфи, MS Java (думаю, хватит).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: массив вариантов передать в ActiveX
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.01 17:50
Оценка:
Здравствуйте AndyZ, вы писали:

AZ>Спасибо всем за ответы. С массивом вариантов (VT_ARRAY |VT_I4) разобрался , все оказалось не так сложно. Вот единственное что осталось так это научиться задавать массив сразу на VB. Если вопрос не сюда, сильно не бейте. Если бы клиент был написан на VC++, проблем нет одним махом (сразу все элементы без обращения по индексу) задается вариантный массив, который превращается в SAFEARRAY. А вот в бэйсике можно задать только одномерный массив DIM A= Array (1,4,5,6,7). А как задать двумерный (многомерный)?


В VB все массивы являются SAFEARRAY-ми. ;)

А задавать так:

Dim ary(0 to 10, 1 TO 3) as Type

Где Type — это любай VB-тип.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: массив вариантов передать в ActiveX
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.01 17:52
Оценка:
Здравствуйте VladD2, вы писали:

VD>Здравствуйте AndyZ, вы писали:


AZ>>Спасибо всем за ответы. С массивом вариантов (VT_ARRAY |VT_I4) разобрался , все оказалось не так сложно. Вот единственное что осталось так это научиться задавать массив сразу на VB. Если вопрос не сюда, сильно не бейте. Если бы клиент был написан на VC++, проблем нет одним махом (сразу все элементы без обращения по индексу) задается вариантный массив, который превращается в SAFEARRAY. А вот в бэйсике можно задать только одномерный массив DIM A= Array (1,4,5,6,7). А как задать двумерный (многомерный)?


VD>В VB все массивы являются SAFEARRAY-ми. ;)


VD>А задавать так:


VD>Dim ary(0 to 10, 1 TO 3) as Type


VD>Где Type — это любай VB-тип.


Да! Чуть не забыл!!! Массивы созданные как я показал размещаются статически.

Если нужно перезанимать (расширять, уменьшать размеры) массив, лучше делать так:

Dim ary() as Type

ReDim ary(0 to 10, 1 TO 3)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: массив вариантов передать в ActiveX
От: AndyZ  
Дата: 03.10.01 13:20
Оценка:
Здравствуйте VladD2, вы писали:


VD>>А задавать так:


VD>>Dim ary(0 to 10, 1 TO 3) as Type


VD>ReDim ary(0 to 10, 1 TO 3)


Спасибо. Вот как определить, понятно. А вот как сроазу сказать массиву , что у него будут такие то элементы (т е как задать значения сразу). Например как в С — элементы двумерного задаются в фигурных скобках, а на VB как это сделать?
Re[5]: массив вариантов передать в ActiveX
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.10.01 13:33
Оценка:
Здравствуйте AndyZ, вы писали:

AZ>Здравствуйте VladD2, вы писали:



VD>>>А задавать так:


VD>>>Dim ary(0 to 10, 1 TO 3) as Type


VD>>ReDim ary(0 to 10, 1 TO 3)


AZ>Спасибо. Вот как определить, понятно. А вот как сроазу сказать массиву , что у него будут такие то элементы (т е как задать значения сразу). Например как в С — элементы двумерного задаются в фигурных скобках, а на VB как это сделать?


В VB 6.0 никак. В VB.Net:

Dim ary() as Type = Type(...)

или чтото вроде того.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.