Страница: 1 |
Страница: 1 |
Вопрос: Удалить обработчик событий
Добавлено: 02.11.06 16:42
Автор вопроса: Sacred Phoenix | ICQ: 304238252
Private Sub Form1_Load(ByVal eventSender As Object, ByVal eventArgs As System.EventArgs) Handles Me.Load
[myClass].RemoveEventHandler(Me)
End Sub
Private Sub Button1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Button1.Click
MessageBox.Show("Button1_Click")
End Sub
End Class
Public Class [myClass]
Public Shared Sub RemoveEventHandler(ByVal mainForm As Form)
AddHandler mainForm.Controls("Button1").Click, AddressOf Button1_MyHandler
End Sub
Private Shared Sub Button1_MyHandler(ByVal eventSender As Object, ByVal eventArgs As System.EventArgs)
MessageBox.Show("Button1_MyHandler")
End Sub
End Class
Здесь добавляется новый обработчик события Button1.Click. А как удалить старый (т.е. Form1.Button1_Click)?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 02.11.06 22:03
ByVal e As System.EventArgs) Handles MyBase.Load
RemoveHandler Button1.Click, AddressOf Button1_Click
End Sub
Номер ответа: 2
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #2
Добавлено: 02.11.06 23:00
Если бы было так хитро, я бы и не спрашивал
Удалить обработчик нада из [myClass].
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 03.11.06 00:15
А что тебе мешает передать в процедуру в качестве параметра ссылку на этот делегат?
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 03.11.06 00:36
вот как то так ...
Private Sub Form1_Load(ByVal eventSender As Object, _
ByVal eventArgs As System.EventArgs) Handles Me.Load
TestEventHandlerClass.ReplaceEventHandler(Button1, _
AddressOf Button1_Click)
End Sub
Private Sub Button1_Click(ByVal eventSender As System.Object, _
ByVal eventArgs As System.EventArgs) Handles Button1.Click
MessageBox.Show("Button1_Click"
End Sub
End Class
Public Class TestEventHandlerClass
Public Shared Sub ReplaceEventHandler(ByVal Ctrl As Button, _
ByVal MyEventHandler As EventHandler)
If Ctrl Is Nothing OrElse _
MyEventHandler Is Nothing Then
Throw New ArgumentException
End If
RemoveHandler Ctrl.Click, MyEventHandler
AddHandler Ctrl.Click, AddressOf Button1_MyHandler
End Sub
Private Shared Sub Button1_MyHandler(ByVal eventSender As Object, _
ByVal eventArgs As System.EventArgs)
MessageBox.Show("Button1_MyHandler"
End Sub
End Class
Номер ответа: 5
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #5
Добавлено: 03.11.06 11:08
таки дела: пишу все тот проект с плагинами. Хочу добиться того, чтобы можно было переопределять обработчики событий нужных контролов. На данный момент нельзя же точно сказать, чей и какой обработчик нужно удалить. Соответственно ничего определенного передать тоже не удастся.
Я вот копал-копал, нашел mainForm.Controls("Button1".GetType().GetEvent("Click".EventHandlerType. Мож это как-то поможет?
Кстати, можно ли, зная System.Type объекта, получить сам объект?
Номер ответа: 6
Автор ответа:
SergeyR
Вопросов: 5
Ответов: 9
Профиль | | #6
Добавлено: 03.11.06 13:39
Activator.CreateInstance(t)
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 03.11.06 15:56
1. GetEvent("Click" возвращает объект EventInfo, который в свою очередь имеет метод RemoveEventHandler которому опять таки необходимы 2 (ДВА) параметра.. объект и делегат!
Признаться честно, я вообще не понимаю твоей логики.. ты пытаешься инкапсулировать в классе то, чего сам еще не знаешь. Ничего не напоминает? Принеси то, не знаю что.. и т.д. по аналогии..
Постарайся ответить для себя на следующие вопросы..
- Откуда твой класс будет знать На какой из процедур в mainForm висит обработчик события для этой кнопки? А может этот обработчик подключен к нескольким делегатам???
-Есть ли на той форме эта кнопка вообще???
-А если в той форме обработчик события объвлен как Private, что тогда??
имхо.. слишком много неизвестных входных параметров. Даже если через рефлексию получить список методов той формы, то как ты предполагаешь получить количество процедур, на которых висит нужный тебе обработчик?
имхо.. на мой взгляд без передачи параметров из формы в класс в тебе не обойтись...
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 03.11.06 16:00
Ну вот смотри.. ты сам ответил на свой вопрос.. Чтобы их переопределить ты их должен, как минимум - знать!!!.. контрол и делегат..
А вот в тот момент, когда можно будет это точно сформулировать и определить и дергай процедуру своего класса с передачей необходимых параметров для переопределения делегата..
Номер ответа: 9
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #9
Добавлено: 03.11.06 19:12
If (TypeOf mainForm.Controls("Button1" Is Button) Then MessageBox.Show("Кнопка есть"
Узнаю не только, что такой контрол есть, но и еще что это кнопка
Конечно, тут два выхода:
1) Максимально продумать устройство плагинов, чтобы предусмотреть как можно большее
2) в данном примере с переопределением обработчика Click кнопки поступить по-другому: скрыть или удалить кнопку с формы и создать программно другую, с подгонкой свойств
Хм...
mainForm.Controls.Remove(myButton)
myButton.Name = "Button2"
mainForm.Controls.Add(myButton)
Старый обработчик остался... Он получается "вшит" в этот экземпляр?..
Номер ответа: 10
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #10
Добавлено: 03.11.06 19:25
блин, так че, получается тока такой выход?
With mainForm.Controls("Button1"
myNewButton.Anchor = .Anchor
myNewButton.Bounds = .Bounds
myNewButton.Text = .Text
End With
mainForm.Controls.Remove(mainForm.Controls("Button1")
mainForm.Controls.Add(myNewButton)
AddHandler myNewButton.Click, AddressOf Button1_MyHandler
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 03.11.06 23:14
А откуда твой класс будет знать, что это кнопка называется именно Button1? )))) Через интерфейс?
Разумеется нет! Это стандартная ошибка, которую допускают очень многие.. Фишка в том, что:
НЕ СОЗДАЕТ НОВЫЙ ЭКЗЕМЛЯР КНОПКИ!
Ты просто получил ссылку на уже существующую кнопку со всеми ее свойствами и делегатами.. После чего ты удалил ее из коллекции Controls, дал ей новое имя и снова добавил в ту же коллекцию.. И после этого ты думаешь,что обработчик куда то денется??? Объект-то остался один и тот же.. только с новым именем..)) Надеюсь не надо тебе рассказывать о значении ключевого слова New ? )
Номер ответа: 12
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #12
Добавлено: 04.11.06 10:16