Прерывание выполнения цепочки событий
От: Аноним  
Дата: 15.12.04 03:56
Оценка:
Вопрос такой. Если есть событие на него навешано несколько обработчиков. Как можно прервать выполнение все цепочки из какого — нибудь из этих обработчиков, Если можно конечно. Суть проблемы такова. Есть базовая форма диалога там стоят кнопки ОК и отмена. На Ок стоит вызов события проверки валидности введенных данных. В формах наследниках на ОК предполагается вешать ещё чего-нибудь. Но надо чтобы это чего-нибудь выполнялось или не выполнялось в зависимости от результатов проверки.
Re: Прерывание выполнения цепочки событий
От: Notecola  
Дата: 15.12.04 04:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос такой. Если есть событие на него навешано несколько обработчиков. Как можно прервать выполнение все цепочки из какого — нибудь из этих обработчиков, Если можно конечно. Суть проблемы такова. Есть базовая форма диалога там стоят кнопки ОК и отмена. На Ок стоит вызов события проверки валидности введенных данных. В формах наследниках на ОК предполагается вешать ещё чего-нибудь. Но надо чтобы это чего-нибудь выполнялось или не выполнялось в зависимости от результатов проверки.


В общем случае, можно завести член класса формы, содержащий флаг проверки условия.
В наследниках проверять этот флаг в обработчиках клика на кнопке OK.
Таким образом можно будет делать в наследниках разную реакцию на неправильные данные.
Например, где-то сообщение выдать, а где то фокус переместить.
Re: Прерывание выполнения цепочки событий
От: rockandroll Казахстан  
Дата: 15.12.04 06:03
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>Вопрос такой. Если есть событие на него навешано несколько обработчиков. Как можно прервать выполнение все цепочки из какого — нибудь из этих обработчиков, Если можно конечно. Суть проблемы такова. Есть базовая форма диалога там стоят кнопки ОК и отмена. На Ок стоит вызов события проверки валидности введенных данных. В формах наследниках на ОК предполагается вешать ещё чего-нибудь. Но надо чтобы это чего-нибудь выполнялось или не выполнялось в зависимости от результатов проверки.


А может проверку вынести в отдельный метод. А из наследников уже вызывать его и решать, что делать дальше...
... << RSDN@Home 1.1.4 >>
Re: Прерывание выполнения цепочки событий
От: Maxeemus  
Дата: 15.12.04 07:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос такой. Если есть событие на него навешано несколько обработчиков. Как можно прервать выполнение все цепочки из какого — нибудь из этих обработчиков, Если можно конечно. Суть проблемы такова. Есть базовая форма диалога там стоят кнопки ОК и отмена. На Ок стоит вызов события проверки валидности введенных данных. В формах наследниках на ОК предполагается вешать ещё чего-нибудь. Но надо чтобы это чего-нибудь выполнялось или не выполнялось в зависимости от результатов проверки.


Вроде порядок вызова обработчиков событий — неопределен.
Так что не факт что обработчик из класса базовой формы будет вызван первым.
Re: Прерывание выполнения цепочки событий
От: Merle Австрия http://rsdn.ru
Дата: 15.12.04 07:41
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>Вопрос такой. Если есть событие на него навешано несколько обработчиков. Как можно прервать выполнение все цепочки из какого — нибудь из этих обработчиков, Если можно конечно.

Способ 1. Выбросить эксепшен, после эксепшена в одном из обработчиков дальнейшая вызовы обработчиков дальше по цепочке прекратятся. Для валидатора вполне логично.
Способ 2. Воспользоваться методом делегата GetInvocationList и организовать в нем в ручную логику вызова цепочки обработчиков.
... [ RSDN@Home 1.1.4 rev 0 ]
Мы уже победили, просто это еще не так заметно...
Re[2]: Прерывание выполнения цепочки событий
От: Merle Австрия http://rsdn.ru
Дата: 15.12.04 08:18
Оценка:
Здравствуйте, Maxeemus, Вы писали:

M>Вроде порядок вызова обработчиков событий — неопределен.

M>Так что не факт что обработчик из класса базовой формы будет вызван первым.
Почему не определен? Если я правильно помню, в MulticastDelegate есть приватное поле MulticastDelegate _prev, которое ссылается на предыдущий обработчик, каждый новый обработчик добавляется в конец этой цепочки и ни смысла, ни возможности нарушить порядок вызова я не вижу, так что порядок вполне определен...
... [ RSDN@Home 1.1.4 rev 0 ]
Мы уже победили, просто это еще не так заметно...
Re[3]: Прерывание выполнения цепочки событий
От: TK Лес кывт.рф
Дата: 15.12.04 08:33
Оценка:
Hello, "Merle"
>
> M>Вроде порядок вызова обработчиков событий — неопределен.
> M>Так что не факт что обработчик из класса базовой формы будет вызван первым.
> Почему не определен? Если я правильно помню, в MulticastDelegate есть приватное поле MulticastDelegate _prev, которое ссылается на предыдущий обработчик, каждый новый обработчик добавляется в конец этой цепочки и ни смысла, ни возможности нарушить порядок вызова я не вижу, так что порядок вполне определен...

Приватные поля на то и приватные, что могут исчезнуть в следующих версиях.
Чтобы гарантировался порядок вызова делегатов метод MulticastDelegate.CombineImpl должен называться... например, MulticastDelegate.AppendImpl
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: Прерывание выполнения цепочки событий
От: Merle Австрия http://rsdn.ru
Дата: 15.12.04 08:55
Оценка:
Здравствуйте, TK, Вы писали:

TK>Приватные поля на то и приватные, что могут исчезнуть в следующих версиях.

Поле-то приватное, а вот свойство MulticastDelegate.Previous вполне себе публичное, правда internal..

TK>Чтобы гарантировался порядок вызова делегатов метод MulticastDelegate.CombineImpl должен называться... например, MulticastDelegate.AppendImpl

Ну, закладываться на порядок вызова вообще, конечно, дело не благодарное, но в данном случае если очень хочется, то думаю можно.
... [ RSDN@Home 1.1.4 rev 0 ]
Мы уже победили, просто это еще не так заметно...
Re: Прерывание выполнения цепочки событий
От: Аноним  
Дата: 15.12.04 06:07
Оценка:
На событие цепляется только форма — родитель и делается метод по паттерну "ШАБЛОННЫЙ МЕТОД"

для примера базовый класс:
on_ok_pressd(object sender,EventArgs e)
{
DoOkProcess();
}

protected void DoOkProcess()
{
doBeforeValidation();
bool valid = GetIsValid();
doAfterValidation();
if(valid)doOnValid();
else doOnNotValid();
}
protected virtual void doBeforeValidation(){}
protected virtual void doAfterValidation(){}
protected virtual bool GetIsValid(){return true;}
protected virtual void doOnValid(){}
protected virtual void doOnNotValid(){}
,
все в наследниках перекрываете нужные методы и никаких флагов или "прерывания цепочки событий"


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Прерывание выполнения цепочки событий
От: Andrbig  
Дата: 15.12.04 11:41
Оценка:
Здравствуйте, Merle, Вы писали:

M>Поле-то приватное, а вот свойство MulticastDelegate.Previous вполне себе публичное, правда internal..

public internal?
Re[6]: Прерывание выполнения цепочки событий
От: Merle Австрия http://rsdn.ru
Дата: 15.12.04 12:00
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>public internal?

Нет конечно, просто internal..
... [ RSDN@Home 1.1.4 rev 0 ]
Мы уже победили, просто это еще не так заметно...
Re[2]: Прерывание выполнения цепочки событий
От: Аноним  
Дата: 17.12.04 06:20
Оценка:
Здравствуйте, Merle, Вы писали:

M>Способ 1. Выбросить эксепшен, после эксепшена в одном из обработчиков дальнейшая вызовы обработчиков дальше по цепочке прекратятся. Для валидатора вполне логично.

M>Способ 2. Воспользоваться методом делегата GetInvocationList и организовать в нем в ручную логику вызова цепочки обработчиков.
Эксепшин не пойдет по слдующей причине. Поскольку он выбрасывается за пределы формы, а форма при этом закрывается. А надо чтобы она оставалась. Ловить внутри смысла нету.
Второй момент. Поскольку это базовая форма диалога, то требование к ней таково, что при нажатии кнопки ОК при неправльно введеннеых данных(на форму вешается дополнительное событие проверки данных) она не должна скрываться. И надо чтобы в наследниках, когда вешается обработчик на кнопку ОК жалетельно не ставить никаких условий (формой будет пользоваться неск. человек.) по результатам работы события.

Перегружать класс кнопки, чтобы там изменить вызов события OnClick() вариант не приемлимый совсем.

Вот и возникает ситуация. По нажатию кнопки ОК нужно вызвать событие проверки и по результатам проверки продолжить работу или оборвать все остальное выполнение.
Re[3]: Прерывание выполнения цепочки событий
От: Igor Trofimov  
Дата: 17.12.04 18:03
Оценка:
А>Эксепшин не пойдет по слдующей причине. Поскольку он выбрасывается за пределы формы, а форма при этом закрывается. А надо чтобы она оставалась.

Я в базовой форме ловлю эксепшены в WndProc. Это по сути, получается отлов эксепшенов, инициированных действиями пользователя с формой (нажатия кнопок и т.п.).
Re: Прерывание выполнения цепочки событий
От: vdimas Россия  
Дата: 21.12.04 02:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос такой. Если есть событие на него навешано несколько обработчиков. Как можно прервать выполнение все цепочки из какого — нибудь из этих обработчиков, Если можно конечно. Суть проблемы такова. Есть базовая форма диалога там стоят кнопки ОК и отмена. На Ок стоит вызов события проверки валидности введенных данных. В формах наследниках на ОК предполагается вешать ещё чего-нибудь. Но надо чтобы это чего-нибудь выполнялось или не выполнялось в зависимости от результатов проверки.



public class MyEventArgs : EventArgs {
    public bool IsStopped = false;
}

[...]

public void XXX_yyy(object sender, MyEventArgs args) {
    if(!args.IsStopped) {
        try {
        [...]
        } catch (Exception e) {
            [...]
            args.IsStopped = true;
        }
    }
}



Другой способ заключается в выбросе ексепшена валидатором. Если указанное событие запускаешь ты сам из кода, то возьми в try-catch место запуска события и ничего не упадет.
Re[4]: Прерывание выполнения цепочки событий
От: Аноним  
Дата: 21.12.04 04:52
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Я в базовой форме ловлю эксепшены в WndProc. Это по сути, получается отлов эксепшенов, инициированных действиями пользователя с формой (нажатия кнопок и т.п.)


Не подскажешь какими сообщениями передаются нажатия кнопок? Под рукой никакой книжки нету...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.