Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Vsh

Как вызывать различные процедуры по одному событию?

25.05.2007, 19:54. Показов 1096. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не подскажите как решить в VB

Несколько различных классов содержат одну и ту же форму, эта форма вызывается из содержащего ее класса. Хочется чтоб при нажатии кнопки на форме вызывался метод из того класса из которого и сама форма. Нечто вроде:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'** Class_1***
private frm as Form... 'содержит кнопку OK
Public Sub ShowFrm()
 frm.Show
End Sub
Public Sub M_Class1()
End sub
 
'** Class_2***
private frm as Form... 'содержит кнопку OK
Public Sub ShowFrm()
 frm.Show
End Sub
Public Sub M_Class2()
End sub
 
'***** использование *****
Dim C1 as new Class_1, C2 as Class_2
C1.Show
'если нажать OK надо выполнять M_Class1
С2.Show
'если нажать OK надо выполнять M_Class2
Ничего в VB про указатели на процедуры я не нашел
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2007, 19:54
Ответы с готовыми решениями:

как сделать и вызывать процедуры БД?
собственно сабж, база майскуль, надо сделать процедуры в самой базе, а не описывать через программу, а потом по именам процедур уже...

По какому-либо событию (клику кнопки) вызывать функцию из определенного класса
Здравствуйте, уважаемые гуру с#. Подскажите, пожалуйста, как сделать так, чтобы по какому-либо событию(например, клику кнопки) вызывалась...

Вызов процедуры по событию
Как в макросе Excel можно вызвать процедуру по событию (например при потере фокуса). Спасибо.

5
Vsh
26.05.2007, 18:56
Забыл добавить:
Речь о VB6

в коде
'** Class_1***
private frm as Form... 'содержит кнопку OK
'** Class_2***
private frm as Form... 'содержит кнопку OK
----------
это одна и таже форма


'** Class_1***
Public Sub M_Class1(s as string)
End sub
'** Class_2***
Public Sub M_Class2(d as double, s as string)
End sub
------
методы могут различатся параметрами

Спасибо
Andy
29.05.2007, 20:34
А ты в модуле создай переменную, типа,
Public intFormLoad%. И в классе 1 пиши

???????
???????
intFormLoad = 1

В классе 2
???????
???????
intFormLoad = 2

В классе 3
???????
???????
intFormLoad = 3

В нужной форме
Private Sub Form_Load()
if intFormLoad = 1 then
////////
elseif intFormLoad = 2 then
///////
elseif intFormLoad = 3 then
////////
end if
End Sub
Vsh
29.05.2007, 22:08
Переменная селектор - не подойдет

1. может быть не 1 - 2 класса а 500
2. Форма - универсальный документ (например заказ вида Номер, дата, сумма), но заказы могут быть разные - один просто записывается, другой при записи делает какие лидо действия (отсылает экземпляр дяде Васе), и т д

Решается наследованием, но нет его, указателями на функции, но и их нет
Mavr
30.05.2007, 08:53
Используй WithEvents:

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
'** Class_1***
Dim frm as New Form1 'содержит кнопку OK
Dim WithEvents btn As CommandButton
 
Public Sub ShowFrm()
frm.Show
Set btn=frm.Command1
End Sub
 
Private Sub btn_Click()
  MsgBox 'Класс1'
End Sub
 
'** Class_2***
Dim frm as New Form1 'содержит кнопку OK
Dim WithEvents btn As CommandButton
 
Public Sub ShowFrm()
frm.Show
Set btn=frm.Command1
End Sub
 
Private Sub btn_Click()
  MsgBox 'Класс2'
End Sub
 
'***** использование *****
Public C1 As New Class_1, C2 As New Class_2
C1.Show
'если нажать Command1 выполнится MsgBox 'Класс1'
 
С2.Show
'если нажать Command1 выполнится MsgBox 'Класс2'
С1 и С2 должны еще жить при нажатии на кнопку, поэтому я их описал как Public, но в принципе можно описывать локально для процедуры, если ты уверен что процедура не закончится покак не выйдут из формы, если она закончится , то возможна ситуация что нажмут на Command1, а С1 и С2 уже не существует и естественно ни чего не сработает.
Lev From URALs
05.06.2007, 13:25
Еще вариант:
в форму помещаем ссылку на родительский класс (объявляем глобально), при создании класса, например, создаем экземпляр формы, присваиваем значение ссылки экземпляру класса.
Далее, где надо работаем с классом - как хотим, через ссылку на экземпляр в тек. экземпляре формы.

Пример: (сделан в MS Excel, т.к. VB на этой машине не стоит. В VB он тоже будет работать)

Итак: открываем новую книгу, на первом листе рисуем 4 кнопки, в проекте добавляем класс MyClass, форму UserForm1, на которую кнопку CB1.

Код:
в UserForm1:

Visual Basic
1
2
3
4
Public ParentClass As MyClass ' Ссылка на родительский класс
Private Sub CB1_Click()
    ParentClass.Click ' Вызываем метод родительского класса
End Sub

в Лист1:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim cl(3) As New MyClass
Private Sub CommandButton1_Click()
    ' Создаем экземпляры класса MyClass.
    cl(1).Name = '1111111111'
    cl(2).Name = '2222222222'
    cl(3).Name = '3333333333'
End Sub
Private Sub CommandButton2_Click()
    cl(1).show
End Sub
Private Sub CommandButton3_Click()
    cl(2).show
End Sub
Private Sub CommandButton4_Click()
    cl(3).show
End Sub

в MyClass:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Name As String
Dim form As New UserForm1
Public Sub Click()
    MsgBox Name
End Sub
Public Sub show()
    ' Класс 'показывает' свой экземпляр формы
    form.show
End Sub
Private Sub Class_Initialize()
    Load form
    ' в дочерней форме ставим ссылку родительского класса 'на себя'
    Set form.ParentClass = Me
End Sub
Выполнение:
1) нажимаем кнопку CommandButton1 -- создание всех объектов

2) нажимаем на кнопки CommandButton2 - CommandButton4
-- соответствующие классы показывают свои экземпляры формы, нажимая на кнопку в которых - вызывается метод этого класса.

PS: конечно же это могли быть экземпляры разных классов - тогда эти классы должны иметь одинаковые методы (в нашем примере - Show), с одинаковым именем и параметрами, а при объявлении ссылку на родительский класс в форме нужно описать с типом Object.

PSS: Проблема предыдущего предложения - когда при работе с формой родительский класс может быть уничтожен - здесь места не имеет, т.к. вся форма - это поле (свойство) класса, при удалении экземпляра класса форма тоже будет удалена.

PSSS: в этом примере маленький минус, который легко обойти: все время жизни экземпляра класса его форма загружена в памяти полностью. Соответственно, если экземпляров 10000, то возникнут проблемы с памятью. Для решения - модифицируем объявление формы в классе, а загрузку и начальные присваивания в форме делаем непосредственно перед показом и сразу за ним удаляем (форму).

Уф. вроде все!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2007, 13:25
Помогаю со студенческими работами здесь

Доступ к событию из процедуры
вот Допустим есть процедура определенная мной procedure TfmMain.Bomb; var I:integer; buf:integer; begin // Выстрелы...

Не работает запуск процедуры по событию
Есть код: uses GraphABC; const size = 0; move = 1; save = 2; procedure NewDraw(method:integer); begin case method of ......

Занести процедуры класса в список и вызывать при необходимости
Доброго времени! Есть вопрос, но ответов не нахожу, такой вопрос : занести кнопки или пикбоксы в аррайлист , и затем в цикле ими...

Можно ли процедуры вынести в отдельный файл и вызывать в основной программе
У меня есть некоторая программа с процедурами и функциями. Вопрос, можно ли процедуры вынести в отдельный файл и вызывать в основной...

Описать процедуры и функции, выполняющие различные задачи с числами
Вот задание. Если честно слабо шарю. Или вообще не шарю. Есть такие кому несложно это выполнить? Скинусь пацанам на пиво даже.;) ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru