Вызов функции

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

Вызов функции

Сообщение HaSH » 28.07.2006 (Пт) 17:29

Здравствуйте. Такая стоит задача:
в зависимости от значения переменной вызывать определенную функцию. например
Код: Выделить всё

if var="AVN" then AVN()
if var="ABC" then ABC()
' и тд....


можно ли как то сократить код. значени переменной и имя функции совпадают. может можно написать что то типа:
Код: Выделить всё

var = "AVN"
'..........
call var

и автоматически будет вываться функция имя которой совпадает со значание переменной var. А то писать целую кучу if....then не красиво как то...

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 28.07.2006 (Пт) 17:45

CallByName
Если всё делать своими ручками, они скоро отвалятся !

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 28.07.2006 (Пт) 17:58

Что то не получается... Не могу разобраться...Расскажите подробней плиз
имя процедуры AVN, никаких параметров

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 28.07.2006 (Пт) 19:01

Нельзя. Я бы очень многое отдал чтобы было можно. А CallByName может выполнять только МЕТОДЫ классов.

Например

CallByName Form1, "Hide", vbMethod
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 28.07.2006 (Пт) 19:07

Вообще некрасивая архитектура... Но можно создавать массив, в котором имени процедуры будет сопоставляться её адрес, а потом искать циклом нужную процедуру в смассиве и вызывать по указателю.
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 28.07.2006 (Пт) 19:32

Хакер писал(а):Нельзя. Я бы очень многое отдал чтобы было можно. А CallByName может выполнять только МЕТОДЫ классов.

Например

CallByName Form1, "Hide", vbMethod

Или ещё например.
Код: Выделить всё

Rem Код формы
Function AVN() as Long
Me.print "ЫыыыЫ"
End Function

Private Sub Command1_Click()
CallByName Form1, "AVN",vbMethod
End Sub
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение GSerg » 28.07.2006 (Пт) 20:23

А Хакер не знает, что callbyname вызывает функции, а Хакер не знает, что callbyname вызывает функции!..

А оно таки вызывает! И даже результат возвращает. Kovu, почему не показал возвращение резальтата, для полного, так сказать, поражения тов. Хакера? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 28.07.2006 (Пт) 20:31

GSerg писал(а):А Хакер не знает, что callbyname вызывает функции, а Хакер не знает, что callbyname вызывает функции!..

А оно таки вызывает! И даже результат возвращает. Kovu, почему не показал возвращение резальтата, для полного, так сказать, поражения тов. Хакера? :)

:lol:
Код: Выделить всё

Rem Код формы
Function AVN() as Long
Me.print "ЫыыыЫ"
AVN=CLng(Rnd*9+1)
End Function

Private Sub Command1_Click()
Dim RetVal as Long
RetVal=CallByName( Form1, "AVN",vbMethod )
Debug.? RetVal
End Sub
Если всё делать своими ручками, они скоро отвалятся !

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 29.07.2006 (Сб) 0:36

:?: А разве в данном случае AVN() не метод класса form1? :?
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.07.2006 (Сб) 2:10

Метод конечно. Знает это хакер. Или ты GSerg хочешь сказать что она из модуля вызывает? - этого не знаю, расскажи.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение GSerg » 29.07.2006 (Сб) 2:18

... выделенное большими буквами слово МЕТОДЫ говорит о том, что автор выделения различает методы и функции, и считает, что последние, в отличие от первых, вызвать через callbyname нельзя.

... перенести же ответственность на слово "классов" не получится: у классов callbyname вызывает также ПРОПЕРТИ; соответственно, фраза "только МЕТОДЫ классов" либо означает, что автор фразы уверен, что с функциями (в отличие от методов) не работает, либо не знает, что есть ещё и проперти.

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.07.2006 (Сб) 2:31

Гы. Автор топика срашивал о вызове функции. Фукнция и метод - эти почти одно и тоже. Поэтому я и написал МЕТОД, потому что это слово даже содержится в константе, энума, того что определяет тип вызова.

Я зачем же писать ещё и про проперти, если автору топика требует
eval-а от VB. Причём именно вызова функции (а не скажем присвоения переменной).

Например если бы автор задавал такой вопрос:
Есть у меня переменные e1, e2, e3, e4. Почему я не могу к ним обратиться в цикле вот так e(i) = i.

Я бы ответил - что е() это массив, и e(1) совсем не отдно и тоже что e1. e(2) не тоже самое что e2.

Я бы объяснил что то что указывается в скобках - это индекс элеметна. У каждого элемента есть свой "номер" - индекс.

И всё. Но то что я ограничился этим, разве означает что я не знаю что такое многомерные массивы, что делаю LBound, UBound, Erase, ReDim, Preserve, Join ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение GSerg » 29.07.2006 (Сб) 2:39

... фраза "Я бы очень многое отдал чтобы было можно." слишком экспрессивна. Я не верю, что это фраза человека, знающего, как вызвать функцию через callbyname. Для человека, знающего это, очевиден простейший трюк с перемещением всех поимённовызываемых функций в отдельный класс и созданием одного глобального экземпляра этого класса только для вызова функций по имени. И естественно, что человек, знающий это, тут же предложил бы этот вариант автору вопроса.
Так что...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.07.2006 (Сб) 2:45

Неа. Я бы вызывал через CallWindowProc
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение GSerg » 29.07.2006 (Сб) 2:50

... что и подтверждает сказанное мною.

... а теперь вернись к началу топика, прочитай его, после чего вернись сюда и покажи вызов функции не с 4 параметрами, по имени, хранящемся в строковой переменной, через callwindowproc...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.07.2006 (Сб) 2:53

Ты правда этого хочешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение GSerg » 29.07.2006 (Сб) 2:57

Правда хочу. Мне интересно, как ты избежишь select case по имени функции в случае callwindowproc. Нет, это возможно, но мне интересно, насколько код для этого по объёму, непонятности и медлительности окажется впереди озвученного выше способа с переносом функций в класс, ибо проигрывать, Хакер, надо уметь...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.07.2006 (Сб) 3:58

Я не буду делать Select Case.

Я буду запоминать какому имени, соответсвует какой конкретный адрес.

А потом я буду CallWindowProc
но только не сам этот адрес, а переходник упаковывающий параметры в стек и делающий Call (начитался твоих статей, что ж делать)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2006 (Сб) 6:38

Хакер
Это глюк или ты действительно просидел всю ночь и спорил с GSerg-ом? Опыт мне подсказывает, что после пяти утра голова уже не фунциклирует... :)
А я все практикую лечение травами...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.07.2006 (Сб) 6:51

Хакер писал(а):Я буду запоминать какому имени, соответсвует какой конкретный адрес.

Где? как?
Напоминаю, что ты пообещал вызывать функцию по имени через CallWindowProc.


2GSerg: вот я бы на месте Хакера записал все адреса по именам в хеш-таблицу, благо и самописный модуль для этого есть. И тогда будет натуральный вызов через CallWindowProc, без Select Case, по именам.
Изображение

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

Сообщение GSerg » 29.07.2006 (Сб) 15:58

Угу. Тока это. Вспоминаем про несовпадение числа параметров и про то, какими каментами придётся снабдить функцию-оболочку ("сюда вот это не передавайте, а вот это - передавайте только вот так").
Вспомнив, сравниваем с callbyname.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.07.2006 (Сб) 16:28

Twister, неработает. Я тут уже начал писать совершенно левый код. Но я люблю чтобы последнее слово было за мной, а значит могу неспать неделями ради этого :wink:

tyomitch
2GSerg: вот я бы на месте Хакера записал все адреса по именам в хеш-таблицу, благо и самописный модуль для этого есть. И тогда будет натуральный вызов через CallWindowProc, без Select Case, по именам.

Вот, я это самое и хотел делать...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.07.2006 (Сб) 16:49

Хакер, передирала :-P


GSerg, достаточно передать вариант с массивом параметров: он займёт как раз 16 байт. И получится самый настоящий IDispatch::Invoke на коленке.
Изображение

S_Grobovshik
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 30.06.2006 (Пт) 14:30
Откуда: Ставрополь

Re: Вызов функции

Сообщение S_Grobovshik » 30.07.2006 (Вс) 11:48

HaSH писал(а): А то писать целую кучу if....then не красиво как то...

А ты попробуй SelectCase ... End Secelt
Не могу и не хочу. Ну если за деньг....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2006 (Вс) 11:52

Гробовщик, а ты хоть понял о чём тут писали?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.07.2006 (Вс) 11:54

S_Grobovshik, прежде чем отвечать в топике, его лучше прочитать.
Изображение

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 31.07.2006 (Пн) 10:31

Товарищи, я прошу прощения за непонятливость, но все же...
Насколько я понял нужно создать класс, а уже в нем обьявить функцию. Прально? Или я опять что то не догнал?

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 31.07.2006 (Пн) 10:40

Пока большие дядьки спорят ты бы давно перепробовал все способы...

Попытка - не пытка...
Пора уже всем хорошим людям собраться и убить всех плохих людей.

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

Сообщение GSerg » 31.07.2006 (Пн) 10:47

HaSH писал(а):Прально?

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

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 31.07.2006 (Пн) 10:52

GSerg писал(а):
HaSH писал(а):Прально?

Прально.


Пасиб


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 89

    TopList