События, как их заполучить?

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

События, как их заполучить?

Сообщение Moron » 26.05.2005 (Чт) 13:40

Вот такая задачка:
Есть класс А и класс Б. Они имеют одинаковые по названию методы, свойства и события. Отличается только "наполнение" методов.
В классе С объявил объект MyObject класса Object. Там же в С написал метод
Код: Выделить всё
Public Sub MakeClass(ClassType As Byte)
  Select Case ClassType
    Case 0
      Set MyObject = New А
    Case 1
      Set MyObject = New Б
  End Select
End Sub

Теперь при вызове этой функции создаётся соответствующий объект. Однако объект без событий! А как сделать чтобы и события из А или Б в С можно было отловить?
Не успел глаза продрать - руки уже к клаве тянутся...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.05.2005 (Чт) 13:44

Как декларирован класс? Добавь опцию WithEvents.
Lasciate ogni speranza, voi ch'entrate.

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 26.05.2005 (Чт) 13:48

alibek писал(а):Как декларирован класс? Добавь опцию WithEvents.

Так декларирован:
Код: Выделить всё
Private MyObject As Object

а так не работает, ошибку выдаёт, красным выделяет.
Код: Выделить всё
Private WithEvents  MyObject As Object
Не успел глаза продрать - руки уже к клаве тянутся...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.05.2005 (Чт) 13:59

Ты в классе его определяешь, не в модуле?
Lasciate ogni speranza, voi ch'entrate.

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 26.05.2005 (Чт) 14:11

Хм... вроде нет, в смысле не в модуле. :)
Вот весь код класса С, так наверное понятнее будет
Код: Выделить всё
Option Explicit
Public Event ClassCEvent()
Public MyObject As Object 'Public WithEvents MyObject As Object
Public Sub MakeClass(ClassType As Byte)
  Select Case ClassType
    Case 0
      Set MyObject = New Class2
    Case 1
      Set MyObject = New Class3
  End Select
End Sub
Public Sub TestClass()
  MyObject.Message
End Sub
Private Sub MyObject_InnerClassEvent()
  RaiseEvent ClassCEvent
End Sub

А вот А и Б, они только месягами отличаются:
Код: Выделить всё
Option Explicit
Public Event InnerClassEvent()
Public Sub Message()
  MsgBox ("Это класс А") '
  RaiseEvent InnerClassEvent
End Sub
Не успел глаза продрать - руки уже к клаве тянутся...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.05.2005 (Чт) 14:23

Код: Выделить всё
Private WithEvents MyObject as Class2

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 26.05.2005 (Чт) 14:32

Konst_One писал(а):
Код: Выделить всё
Private WithEvents MyObject as Class2

Ага. Это проходили. :wink: Оно конечно работает, но вот так:
Код: Выделить всё
Private WithEvents MyObject1 as Class2
Private WithEvents MyObject2 as Class3
Public Sub TestClass(ClassType As Byte)
  Select Case ClassType
    Case 0
      MyObject1.Message
    Case 1
      MyObject2.Message
  End Select
End Sub

Плюсы - работает :wink:, минусы - громоздкие селекты, объявлять надо все классы (их 7 и может стать больше).
А в один объект и чтобы с событиями никак?
Не успел глаза продрать - руки уже к клаве тянутся...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.05.2005 (Чт) 14:36

Object не поддерживает WithEvents

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.05.2005 (Чт) 14:38

а может ты скажешь сначала зачем тебе нужны сразу семь одинаковых классов?

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 26.05.2005 (Чт) 14:47

Konst_One писал(а):Object не поддерживает WithEvents

Ясно теперь, почему не работает... :?
Konst_One писал(а):а может ты скажешь сначала зачем тебе нужны сразу семь одинаковых классов?

Они разные, отличаются "наполнением" методов. Это только в тесте один метод с "месягой" внутри. :?
Общую задачу долго описывать, придётся практически ТЗ тут выложить :(.
Не успел глаза продрать - руки уже к клаве тянутся...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.05.2005 (Чт) 14:49

Может быть "начинку" реализовать в отдельных классах, а событие будет в одном классе?
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.05.2005 (Чт) 14:55

и все равно не понятно зачем нужно управлять разными классами через один, задавая их тип :?:
может хотя бы общую идею своего ТЗ озвучишь? ну, например, надо организовать отображение состояния автоматов, реагирующих на внешниеи воздействия от видов датчиков ....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.05.2005 (Чт) 14:57

Да например те же плугины :)
Нужен единый интерфейс снаружи и разная функциональность внутри.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.05.2005 (Чт) 14:59

плагины вроде бы не так реализуют обычно, как наш автор пишет

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 26.05.2005 (Чт) 15:02

Общую идею, могу. Ща сформулирую.
Надо по расписанию запрашивать с нескольких приборов разных типов различные данные и по этим данным генерить документы. Ю-Зверь должен мочь редактировать расписание, добавлять/удалять задачи опроса.
Не успел глаза продрать - руки уже к клаве тянутся...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.05.2005 (Чт) 15:05

ну так и реализуй это в одном классе, при инициализации задавай вид прибора, а события будут унифицированы

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 26.05.2005 (Чт) 15:19

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

Я нашёл решение. Сделал объект, назвал Messager. У него только один метод: RaiseInnerEvent и одно событие InnerClassEvent. При создании объекта С создаётся и Messager, затем ссылка на него передаётся в MyObject любого класса. А классы А и Б работают уже с методом RaiseInnerEvent а не райзят события сами. :wink:
Не успел глаза продрать - руки уже к клаве тянутся...

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 26.05.2005 (Чт) 15:23

Кстати, вся эта возня с событиями понадобилась с одной целью: на ходу отображать ход опроса приборов. :?
Не успел глаза продрать - руки уже к клаве тянутся...

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

Сообщение tyomitch » 26.05.2005 (Чт) 20:26

2Moron: сорри что пропустил дискуссию, но есть такой интересный оператор Implements. Он бы тебя, похоже, спас.
Объявляешь интерфейс в одном классе и имплементишь его в семи остальных.
Все переменные объявляешь как объекты первого класса.
Изображение

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 27.05.2005 (Пт) 7:38

tyomitch
Ничего, лучше поздно чем никогда :) Спасибо, сейчас читаю про Implements.
Всем спасибо за советы. :D
Не успел глаза продрать - руки уже к клаве тянутся...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 30.05.2005 (Пн) 15:32

2tyomitch:это не касается событий, увы. Я бы посоветовал для реализации однотипных методов использовать Implements, а для ловли событий - vbControlExtender.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение GSerg » 30.05.2005 (Пн) 15:39

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

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

Сообщение tyomitch » 30.05.2005 (Пн) 17:34

ANDLL писал(а):2tyomitch:это не касается событий, увы. Я бы посоветовал для реализации однотипных методов использовать Implements, а для ловли событий - vbControlExtender.

Или же передачу синка в объект, как например в сабклассере GSerg-а ;-)
Говорят, что это ещё и быстрее работает: события связываются по DispID, а методы синка - напрямую.
Последний раз редактировалось tyomitch 30.05.2005 (Пн) 17:47, всего редактировалось 1 раз.
Изображение

Moron
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.03.2005 (Ср) 12:28
Откуда: Сами мы местные...

Сообщение Moron » 30.05.2005 (Пн) 17:46

До сабклассинга GSerg мне ещё как до луны пешком... я пока даже не понимаю что это такое :( Эх, разбираться ещё и разбираться. :wink:
Не успел глаза продрать - руки уже к клаве тянутся...


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

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

Сейчас этот форум просматривают: Google-бот и гости: 102

    TopList