С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.03.2019
Сообщений: 3

Как задать имя подпрограммы в качестве формального параметра

24.03.2019, 11:26. Показов 1631. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу реализовать переопределение имени подпрограммы. Программа должна обращаться к соответствующей
подпрограмме в зависимости от выбора в Combo1 (A1 или A2) и выдавать результат в Text1.Text
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim a(2)
Public TT As String
Private Sub Command1_Click()
TT = Form1.Combo1.Text  : ' считываем имя подпрограммы A1 или А2
Call TT(a()) : '  Здесь жалуется Expected prosedure, not variable
t = a(1) + a(2)
Form1.Text1.Text = t
Form1.Refresh
End Sub
 
Sub A1(a())
a(1) = 1: a(2) = 2
End Sub
 
Sub A2(a())
a(1) = 10: a(2) = 20
End Sub
 
Private Sub Command3_Click()
End
End Sub
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2019, 11:26
Ответы с готовыми решениями:

Как прередать контрол в качестве параметра?
Как решить сабж, не прибегая к индексации контролов?? т.е если писать sub rr(contr as Controls) contr.combo1. .... ...

Как передать функцию в качестве параметра?
Как передать функцию в качестве параметра?

Как передать модулю ListBox в качестве параметра?
У меня есть модуль, в который мне нужно передать листбокс из Form2 в качестве параметра, я сделал что-то вроде такого : Public Sub...

8
 Аватар для Kogb
367 / 128 / 28
Регистрация: 17.07.2011
Сообщений: 253
Записей в блоге: 1
24.03.2019, 15:23
поля в комбобоксе - строки, а имена процедур - объекты. Можно сделать так:
Visual Basic
1
2
3
Private Sub Form_Load()
If Form1.Combo1.Text = "A1" Then Call A1 Else Call A2
End Sub
1
0 / 0 / 0
Регистрация: 24.03.2019
Сообщений: 3
24.03.2019, 16:30  [ТС]
Спасибо за вариант решения, но меня интересует метод решения этой задачи без использования оператора If, так как в моем случае количество подпрограмм не два (A1, A2), а намного больше (порядка сотни). Т.Е. меня интересует решение, когда параметр ТТ будет определен (может быть с помощью класса) как имя подпрограммы.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
24.03.2019, 16:32
Ravsh, вообще подход неправильный.

Хотя бы так, что ли...


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim a(2)
 
Private Sub Command1_Click()
    Form1.Text1.Text = GetTT(Form1.Combo1.Text, a)
End Sub
 
Function GetTT(ByVal s, ByRef a) As Integer
    Select Case s
       Case "A1": a(1) = 1: a(2) = 2
       Case "A2": a(1) = 10: a(2) = 20
    End Select
    GetTT = a(1) + a(2)
End Function
 
 
Private Sub Command3_Click()
End
End Sub
1
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
24.03.2019, 18:19
Лучший ответ Сообщение было отмечено Ravsh как решение

Решение

Цитата Сообщение от Ravsh Посмотреть сообщение
может быть с помощью класса
Да, можно
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
'код класса clsmySubs
 
Option Explicit
 
Public Sub A1(a())
a(1) = 1: a(2) = 2
End Sub
 
Public Sub A2(a())
a(1) = 10: a(2) = 20
End Sub
 
'код формы
 
Option Explicit
 
Dim a(2), t
Public TT As String, objMySubs As New clsMySubs
 
Private Sub Command1_Click()
TT = Form1.Combo1.Text:   ' считываем имя подпрограммы A1 или А2
CallByName objMySubs, TT, VbMethod, a() '  теперь не жалуется
t = a(1) + a(2)
Form1.Text1.Text = t
Form1.Refresh
End Sub
 
Private Sub Command3_Click()
End
End Sub
 
Private Sub Form_Load()
  Combo1.List(0) = "A1"
  Combo1.List(1) = "A2"
End Sub
Но вообще "порядка сотни подпрограмм" это странно. Неужели они все разные по логике, их невозможно заменить несколькими подпрограммами с параметрами?
2
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
24.03.2019, 18:43
Нужно использовать полиморфизм. Создаешь общий интерфейс а логику засовываешь в классы. Со стороны клиента бкдет выглядеть как:
Visual Basic
1
2
3
4
5
Dim c As ISomeAction
 
...
 
c.DoSomething(...)  ' // В зависимости от класса будет выполнено то или иное действие
1
0 / 0 / 0
Регистрация: 24.03.2019
Сообщений: 3
25.03.2019, 08:45  [ТС]
Использование оператора On Case меня не устраивает, т.к. ввиду большого количества подпрограмм (A1, A2, ..., An) мне придется набирать все эти названия подпрограмм. У меня эти названия формируются внутри вложенных циклов. Идеально было бы если текст из Combo1, который имеет формат String был преобразован в формат Object.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
26.03.2019, 08:49
The trick, а вызов по указателю?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
31.03.2019, 18:20
Цитата Сообщение от Catstail Посмотреть сообщение
а вызов по указателю?
В VB олицетворением вызова по указателю является вызов метода интерфейса - следует использовать его если прямо не оговорено другое.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2019, 18:20
Помогаю со студенческими работами здесь

Из каталога, имя которого указано в качестве формального параметра, копировать все файлы с расширением .C
Имеется задание: Создавать резервную копию исходных файлов. Копировать все исходные файлы с расширением .С в каталог указанном в...

Как указать ссылку на указатель в качестве формального параметра
Здравствуйте! Есть функция включения элементов в стек. Как правильно написать прототип функции. т.е. как указать ссылку на указатель в...

Как передать функции в качестве параметра имя объекта jQuery?
Имеется функция, которая работает с объектом например: $('.photos img'). Имя селектора CSS И выглядело все так: function...

Передача массива, как формального параметра в функцию
#include <iostream> #include <ctime> using namespace std; const int MAX_SIZE = 100; void print_array(int a, int size)...

Короткое имя файла в качестве параметра
Написать командный файл, который: принимает в качестве параметра короткое имя файла вызывает файл 1.bat передавая имя файла и текущую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru