Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Перехват событий в Windows.Forms


Автор: Kuvaldis 8.10.2007, 12:07
Всем привет!
Вот прочитал, что для реагирования компонента на какое-нибудь событие можно поступить двояко:
1. Создать делагат на нужную функцию, например:
Код

this.MouseUp += new MouseEventHandler(MainWindow_MouseUp);
 ...
void MainWindow_MouseUp(object sender, MouseEventArgs e)
{}


2. Непосредственное замещение метода:
Код

protected override void OnMouseUp(MouseEventArgs e)
{} 

Поясните, когда что лучше использовать.
Пока вижу только одно различие: в первом случае можно подвесить много делегатов

Автор: tol05 8.10.2007, 12:25
дело в том, что сам контрол (форма) внутри себя тоже может быть подписана на свое же событие. Пример - Paint. Если мы не подписываемся на Paint, то базовый обработчик вызывается делегатом события автоматически. 
Если переопределяем виртуальный метод-обработчик, то всегда вызываем base.OnPaint() явно, ведь старая реализация сама не вызовется.

Если ты используешь вариант 1, то выполнится base.OnMouseUp() и твой MainWindow_MouseUp()
Если ты используешь вариант2, то выполнится только твой OnMouseUp()

Есть еще третий способ - анонимные делегаты.
вот тут есть преймущества - в методе видны переменные с областью действия функции, содержащей объявление делегата.
Код

public void Func()
{
int i = 0;
this.MouseUp += delegate(object sender, MouseEventArgs e)
                                   {
                                        i = 2;
                                   };
}


а по поводу количества обработчиков - метод подписки значения не имеет. Все события - потомки от MulticastDelegate и поддерживают списки обработчиков.

Автор: Kuvaldis 8.10.2007, 12:31
tol05, 
Мдя... сиба за инфу smile Уже не в первый раз...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)