Vsh

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

25.05.2007, 19:54. Показов 1100. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru