0 / 0 / 0
Регистрация: 24.03.2019
Сообщений: 3
1

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

24.03.2019, 11:26. Показов 1381. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2019, 11:26
Ответы с готовыми решениями:

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

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

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

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

8
366 / 127 / 28
Регистрация: 17.07.2011
Сообщений: 253
Записей в блоге: 1
24.03.2019, 15:23 2
поля в комбобоксе - строки, а имена процедур - объекты. Можно сделать так:
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  [ТС] 3
Спасибо за вариант решения, но меня интересует метод решения этой задачи без использования оператора If, так как в моем случае количество подпрограмм не два (A1, A2), а намного больше (порядка сотни). Т.Е. меня интересует решение, когда параметр ТТ будет определен (может быть с помощью класса) как имя подпрограммы.
0
es geht mir gut
11267 / 4749 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
24.03.2019, 16:32 4
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
15142 / 6415 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
24.03.2019, 18:19 5
Лучший ответ Сообщение было отмечено 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
Модератор
9688 / 3651 / 869
Регистрация: 22.02.2013
Сообщений: 5,494
Записей в блоге: 78
24.03.2019, 18:43 6
Нужно использовать полиморфизм. Создаешь общий интерфейс а логику засовываешь в классы. Со стороны клиента бкдет выглядеть как:
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  [ТС] 7
Использование оператора On Case меня не устраивает, т.к. ввиду большого количества подпрограмм (A1, A2, ..., An) мне придется набирать все эти названия подпрограмм. У меня эти названия формируются внутри вложенных циклов. Идеально было бы если текст из Combo1, который имеет формат String был преобразован в формат Object.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
35522 / 19997 / 4186
Регистрация: 12.02.2012
Сообщений: 33,176
Записей в блоге: 13
26.03.2019, 08:49 8
The trick, а вызов по указателю?
0
Модератор
9688 / 3651 / 869
Регистрация: 22.02.2013
Сообщений: 5,494
Записей в блоге: 78
31.03.2019, 18:20 9
Цитата Сообщение от Catstail Посмотреть сообщение
а вызов по указателю?
В VB олицетворением вызова по указателю является вызов метода интерфейса - следует использовать его если прямо не оговорено другое.
1
31.03.2019, 18:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2019, 18:20
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru