CallByName и неизвестное число аргументов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
michel_s
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 29.08.2003 (Пт) 16:12

CallByName и неизвестное число аргументов

Сообщение michel_s » 22.10.2005 (Сб) 14:56

Предыстория вопроса:

Некий класс имеет ряд методов с различным количеством аргументов:

public sub method_1(arg1 as type, ... , argn as type)
.
.
.

В его конструкторе собирается коллекция описателей этих методов, которая включает в себя имя метода и набор описателей типов аргументов.

Вопрос в том как корректно передать аргументы в вызове функции CallByName.

Пробовал по набору описателей типов аргументов создавать массив variant:

dim v() as variant

for ...
redim preserve v(...)
v(ubound(v))=value 'в зависимости от типа агумента
next

CallByName objref, "method_name", vbMethod, v - не работает

Остановился на том, что каждый метод указанного класса принимает массив variant, а потом разгребает то, что ему передали. Может быть есть более изящное решение?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 15:02

Ничё не понял. Главным образом про начальный класс.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

michel_s
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 29.08.2003 (Пт) 16:12

Сообщение michel_s » 22.10.2005 (Сб) 15:15

Задача, собственно, в том, чтобы используя коллекцию описателей методов класса вызывать эти методы извне с помощью CallByName

michel_s
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 29.08.2003 (Пт) 16:12

Сообщение michel_s » 22.10.2005 (Сб) 15:29

Еще одго уточнение.

В классе obj есть метод:

public sub method(arg1 as string, arg2 as integer)

код вызова метода извне:

dim s as srting
dim i as integer
dim v(1) as variant

s=...
i=...

CallByName obj,"method",vbMethod,ist,i - работает;

v(0)=s
v(1)=i

CallByName obj,"method",vbMethod,v - не работает,

несмотря на то, что последний аргумент CallByName описан как массив variant.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 15:38

Не массив variant, а param array. Это разные вещи.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

michel_s
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 29.08.2003 (Пт) 16:12

Сообщение michel_s » 22.10.2005 (Сб) 15:44

А можно его реализовать для передачи CallByName?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 15:48

Что значит реализовать? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

michel_s
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 29.08.2003 (Пт) 16:12

Сообщение michel_s » 22.10.2005 (Сб) 16:01

На данном этапе я определяю метод так:

public sub method(v() as variant)

проверка v()
некие действия

end sub,

а вызываю так:

dim v(...) as variant

v(...)=...

CallByName obj,"method",vbMethod,v

Хотелось бы определять метод с указанием каждого аргумента:

public sub method(arg1 as type, arg2 as type)

но как вызвать его в run-time с помощью CallByName?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 16:12

:roll:

CallByName obj, "method", vbMethod, arg1, arg2
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

michel_s
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 29.08.2003 (Пт) 16:12

Сообщение michel_s » 22.10.2005 (Сб) 16:21

Другого пути нет? Дело в том, что в run-time я имею только набор описателей (типов и значений) аргументов метода в виде коллекции, но не зарезервированные под них переменные.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 17:57

А тип тебе не нужен. Всё равно через variant пойдёт.

Если хочешь ручками, то можно, IDispatch::Invoke
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

michel_s
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 29.08.2003 (Пт) 16:12

Сообщение michel_s » 23.10.2005 (Вс) 10:11

Примерно ясно, спасибо.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 24.10.2005 (Пн) 7:04

Загрузи TLBINF32.DLL в свой проект. Объект TLIApplication имеет такой метод InvokeHookArray, позволяющий передавать массив вариантов вместо ParamArray.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 1

    TopList