Назначен ли обработчик?
От: Lombrozo  
Дата: 21.06.04 13:18
Оценка:
Дано:
кнопка Button1
Обработчик события Button1.Click — Sub Button1_Click(Sender as Object) Handles Button1.Click

Как же мне узнать, имеется ли обработчик события для объекта Button1?
(навроде как в Delphi: if (Assigned(FOnClick)) then ... )

Усложним вопрос.
Ничего ведь нам не мешает сделать так:

AddHandler Button1.Click, AddressOf pAnotherForm.Button_EventHandler
AddHandler Button1.Click, AddressOf pAnotherForm.Button_EventHandler

, т.е. вызывать AddHandler дважды?

Как мне узнать, сколько на этот евент подписано обработчиков?
Re: Назначен ли обработчик?
От: FL  
Дата: 21.06.04 14:22
Оценка:
Здравствуйте, Lombrozo, Вы писали:

L>Как же мне узнать, имеется ли обработчик события для объекта Button1?

L>(навроде как в Delphi: if (Assigned(FOnClick)) then ... )
Вообще, Button1.Click — это обычный делегат. Соотв, можно попробовать работать с ним, как с делегатом. Например, для проверки наличия обработчика можно (по крайней мере, в C#) проверять его на null —
if (Button1.Click != null)
{/*есть обработчик*/}


L>Как мне узнать, сколько на этот евент подписано обработчиков?

Button1.Click.GetInvocationList() должен подойти.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Назначен ли обработчик?
От: Lombrozo  
Дата: 21.06.04 14:27
Оценка:
Здравствуйте, FL, Вы писали:

L>>Как мне узнать, сколько на этот евент подписано обработчиков?

FL>Button1.Click.GetInvocationList() должен подойти.

Спасибо, супер. Но у меня бейсик ) Я уже его и так и эдак...
Re[2]: Назначен ли обработчик?
От: orangy Россия
Дата: 21.06.04 14:29
Оценка: 22 (1) +1
Здравствуйте, FL, Вы писали:

FL>Здравствуйте, Lombrozo, Вы писали:


L>>Как же мне узнать, имеется ли обработчик события для объекта Button1?

L>>(навроде как в Delphi: if (Assigned(FOnClick)) then ... )
FL>Вообще, Button1.Click — это обычный делегат.
Неверно. Button1.Click — это событие, и это не то же самое, что делегат. Как с делегатом, с ним можно обращаться только внутри класса, где он определен. Извне класса использовать только операции += и -=

L>>Как мне узнать, сколько на этот евент подписано обработчиков?

FL>Button1.Click.GetInvocationList() должен подойти.
Нескомпилируется.
... << RSDN@Home 1.1.4 beta 2 >>
"Develop with pleasure!"
Re[3]: Назначен ли обработчик?
От: Peter Fleischer Германия www.informtoools.de
Дата: 22.06.04 04:08
Оценка:
Lombrozo wrote:
> Здравствуйте, FL, Вы писали:
>
> L>>Как мне узнать, сколько на этот евент подписано обработчиков?
> FL>Button1.Click.GetInvocationList() должен подойти.
>
> Спасибо, супер. Но у меня бейсик ) Я уже его и так и эдак...

Для того, чтобы использовать GetInvocationList тебе надо переменная типа MulticastDelegate. Для демонстрации маленький пример:

  Dim cl4 As New myClass4
  Dim MultiDel As myClass4.e4EventHandler

' добавить Eventhandler
  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

' удалить Eventhandler
  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()
    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


Peter
Posted via RSDN NNTP Server 1.8
Re[4]: Назначен ли обработчик?
От: Peter Fleischer Германия www.informtoools.de
Дата: 22.06.04 04:13
Оценка: 14 (1)
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


Peter
Posted via RSDN NNTP Server 1.8
Re[5]: Назначен ли обработчик?
От: Аноним  
Дата: 22.06.04 21:26
Оценка:
Спасибо, работает.

Lombrozo
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.