Вызов события

Создание, использование компонентов ActiveX
Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Вызов события

Сообщение Brusco » 25.10.2004 (Пн) 1:11

Возникла такая проблема: нужно вызвать событие или функцию из стандартного модуля находящиеся в пользовательском контроле. Проект под ActiveX без формы. Всё перепробовал - ничего не получается :!: :?: Всё, что в модуле 'Public' видно везде, а из контрола не видно ничего :!:

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

Сообщение tyomitch » 25.10.2004 (Пн) 3:19

Чтобы из контрола вызвать событие, нужно его сначала объявить:
Код: Выделить всё
Event MyEvent(Param1 As Long, Param2 As String)

После этого его можно вызывать из кода:
Код: Выделить всё
RaiseEvent MyEvent(123, "abc")
Изображение

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 29.10.2004 (Пт) 2:32

Всё это уже написано :!: А вот это нужно вызать из стандартного модуля:
Код: Выделить всё
RaiseEvent MyEvent(123, "abc")

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 31.10.2004 (Вс) 1:55

Просто у меня в стандартном модуле находятся процедуры сабклассинга (больше их некуда деть) :( И когда сообщение Windows отлавливается надо сгенерировать событие в UserControl. В принципе событие можно поместить в функцию, но как её тогда вызвать :?: Из формы, было бы всё просто - Form1.UserControl1.NameFunction(), но формы то нет :!:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 31.10.2004 (Вс) 2:33

Сделай в контроле Friend-метод и вызывай его, а в нем уже рэйзи что хочешь. Если метод объявлен как Friend, а не Public, то снаружи контрола он виден не будет.

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 06.11.2004 (Сб) 2:47

А можно пожалуйста по подробней про этот Friend-метод. Никогда про такой не слышал :!:

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

Сообщение tyomitch » 08.11.2004 (Пн) 12:36

Brusco писал(а):Всё это уже написано :!: А вот это нужно вызать из стандартного модуля:
Код: Выделить всё
RaiseEvent MyEvent(123, "abc")

Это невозможно. События могут поднимать только классы.

Friend-метод: пишешь как обычно, только вместо слова Public или Private пишешь слово Friend. Тогда метод будет доступен всем модулям в твоём проекте, и невидим снаружи проекта.

Только в модуль нужно будет ещё передавать экземпляр твоего класса, чтобы было у чего вызывать этот метод... В общем, посмотри сабклассер GSerg-а в Наших Проектах, там это всё уже есть :-)
Изображение

Brusco
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 22.10.2004 (Пт) 3:16
Откуда: Reutov, Russia

Сообщение Brusco » 12.11.2004 (Пт) 3:41

Вот что у меня получилось:

Код: Выделить всё
'В контроле
Public Event MyEvent()
Private Handle As Long

Public Sub EnableTimer(ByVal hWnd As Long, ByVal Interval As Long)
Handle = hWnd
SetTimer Handle, 0, Interval, AddressOf TimerProc
End Sub

Public Sub Timer()
RaiseEvent MyEvent
End Sub

Private Sub UserControl_Show()
Call ObjectID(UserControl.Extender)
End Sub

Private Sub UserControl_Terminate()
Set Obj = Nothing
KillTimer Handle, 0
End Sub

'В модуле
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long

Public Obj As Object

Public Function ObjectID(ByVal ID As Object)
Set Obj = ID
End Function

Public Sub TimerProc(ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    Call Obj.Timer
End Sub

Работает, но только одно но :( - процедура Timer видна везде, где только можно и нельзя :!:
Наверно лучше функцию вызывать по адресу, но из статьи на сайте я мало чего понял (там всё сводится к вызову API-функций)!?
И где можно почитать этот сабклассер GSerg'a :?:

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

Сообщение GSerg » 12.11.2004 (Пт) 5:14

Его не читать надо, а юзать :)
Я с этим сабклассером... хм... как ты, Тёмыч, с обёрткой :D

http://bbs.vbstreets.ru/viewtopic.php?p=39485#39485
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Компоненты

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList