Здравствуйте, FL, Вы писали:
FL>Здравствуйте, Lombrozo, Вы писали:
L>>Как же мне узнать, имеется ли обработчик события для объекта Button1? L>>(навроде как в Delphi: if (Assigned(FOnClick)) then ... ) FL>Вообще, Button1.Click — это обычный делегат.
Неверно. Button1.Click — это событие, и это не то же самое, что делегат. Как с делегатом, с ним можно обращаться только внутри класса, где он определен. Извне класса использовать только операции += и -=
L>>Как мне узнать, сколько на этот евент подписано обработчиков? FL>Button1.Click.GetInvocationList() должен подойти.
Нескомпилируется.
Peter Fleischer wrote:
... > Для того, чтобы использовать GetInvocationList тебе надо переменная > типа MulticastDelegate. Для демонстрации маленький пример:
Извини за маленькую ошибку. Исправленный код:
Dim cl4 As New myClass4
Dim MultiDel As myClass4.e4EventHandler
Private Sub Button4a_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4a.Click
Dim myEvhandler4a As myClass4.e4EventHandler = AddressOf mySub4
AddHandler cl4.e4, myEvhandler4a
MultiDel = CType([Delegate].Combine(MultiDel, myEvhandler4a), myClass4.e4EventHandler)
cl4.mySub4()
ShowNumberOfDelegates()
End Sub
Private Sub Button4b_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4b.Click
Dim myEvhandler4b As myClass4.e4EventHandler = AddressOf mySub4
RemoveHandler cl4.e4, myEvhandler4b
MultiDel = CType([Delegate].Remove(MultiDel, myEvhandler4b), myClass4.e4EventHandler)
cl4.mySub4()
ShowNumberOfDelegates()
End Sub
Private Sub ShowNumberOfDelegates()
If MultiDel Is Nothing Then
Debug.WriteLine("Number of EventHandlers: Nothing")
Else
Dim DelegateList() As [Delegate] = MultiDel.GetInvocationList
Debug.WriteLine("Number of EventHandlers: " & DelegateList.Length)
End If
End Sub
Sub mySub4(ByVal action As String)
Debug.WriteLine(action)
End Sub
Class myClass4
Event e4(ByVal act As String)
Public Sub mySub4()
RaiseEvent e4("Sub Class 4")
End Sub
End Class
Здравствуйте, Lombrozo, Вы писали:
L>Как же мне узнать, имеется ли обработчик события для объекта Button1? L>(навроде как в Delphi: if (Assigned(FOnClick)) then ... )
Вообще, Button1.Click — это обычный делегат. Соотв, можно попробовать работать с ним, как с делегатом. Например, для проверки наличия обработчика можно (по крайней мере, в C#) проверять его на null —
if (Button1.Click != null)
{/*есть обработчик*/}
L>Как мне узнать, сколько на этот евент подписано обработчиков?
Button1.Click.GetInvocationList() должен подойти.
Lombrozo wrote: > Здравствуйте, FL, Вы писали: > > L>>Как мне узнать, сколько на этот евент подписано обработчиков? > FL>Button1.Click.GetInvocationList() должен подойти. > > Спасибо, супер. Но у меня бейсик ) Я уже его и так и эдак...
Для того, чтобы использовать GetInvocationList тебе надо переменная типа MulticastDelegate. Для демонстрации маленький пример:
Dim cl4 As New myClass4
Dim MultiDel As myClass4.e4EventHandler
' добавить EventhandlerPrivate Sub Button4a_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4a.Click
Dim myEvhandler4a As myClass4.e4EventHandler = AddressOf mySub4
AddHandler cl4.e4, myEvhandler4a
MultiDel = CType([Delegate].Combine(MultiDel, myEvhandler4a), myClass4.e4EventHandler)
cl4.mySub4()
ShowNumberOfDelegates()
End Sub' удалить EventhandlerPrivate Sub Button4b_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4b.Click
Dim myEvhandler4b As myClass4.e4EventHandler = AddressOf mySub4
RemoveHandler cl4.e4, myEvhandler4b
MultiDel = CType([Delegate].Remove(MultiDel, myEvhandler4b), myClass4.e4EventHandler)
cl4.mySub4()
ShowNumberOfDelegates()
End Sub
Private Sub ShowNumberOfDelegates()
Dim MultiDel As myClass4.e4EventHandler = CType(AddressOf mySub4, myClass4.e4EventHandler)
If MultiDel Is Nothing Then
Debug.WriteLine("Number of EventHandlers: Nothing")
Else
Dim DelegateList() As [Delegate] = MultiDel.GetInvocationList
Debug.WriteLine("Number of EventHandlers: " & DelegateList.Length)
End If
End Sub
Sub mySub4(ByVal action As String)
Debug.WriteLine(action)
End Sub
Class myClass4
Event e4(ByVal act As String)
Public Sub mySub4()
RaiseEvent e4("Sub Class 4")
End Sub
End Class