powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как работают события, возвращающие значения?
8 сообщений из 8, страница 1 из 1
Как работают события, возвращающие значения?
    #38860589
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаю класс TaskBar, это что-то вроде панели задач Windows, только в MDI-приложении.

Создала делегат
Код: c#
1.
public delegate Form EventHandlerNewFormCreated(object sender, EventArgNewForm e);


И событие
Код: c#
1.
public event EventHandlerNewFormCreated NewFormCreated;


обработчик этого события в родительской (MDI) форме (ниже) вызывается, когда пользователь на TaskBar'е жмёт кнопку "Создать новое окно":
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        private Form taskBar_NewFormCreated(object sender, EventArgNewForm e)
        {
            Form frmReport = null;
            frmReport = new OLAPTech.frmReport();
            frmReport.MdiParent = this;
            frmReport.Show();
            frmReport.Activate();
            frmReport.Name = e.Name; //чтобы все окна имели те же названия, что и новые создаваемые кнопки
            return frmOLAPPlansReport;
        }


Вызов обработчика в самом TaskBar'е (по нажатию на кнопку "создать новое окно")
Код: c#
1.
Form form = NewFormCreated(this, new EventArgNewForm(newButton.Name)); 


эту форму я уже кидаю в массив, значок там рисую на TaskBar'е и т.д.

Ещё один факт: Если никто не подпишется на NewFormCreated, то по нажатию на кнопку "создать новое окно" выдастся ошибка в последней строке из приведённых, и это нормальная реакция.
Вопрос: Как будет работать код "Form form = NewFormCreated ...", если на событие подпишется сразу несколько обработчиков. Адрес какой формы будет занесён в переменную form? Можно ли как-то отловить все возвращаемые значения? А то каждый обработчик свою форму создаст и..куда она денется? Переменная-то всего одна.
...
Рейтинг: 0 / 0
Как работают события, возвращающие значения?
    #38860591
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня опечатка, в третьем блоке нужно было
Код: c#
1.
return frmReport;
...
Рейтинг: 0 / 0
Как работают события, возвращающие значения?
    #38860601
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnomeАдрес какой формы будет занесён в переменную form?
Последней.
Nika gnomeЕсли никто не подпишется на NewFormCreated, то по нажатию на кнопку "создать новое окно" выдастся ошибка в последней строке из приведённых, и это нормальная реакция.
Надо проверять значение NewFormCreated на null. Если событие только для UI-потока, можно и напрямую, иначе сохранять NewFormCreated в локальную переменную, которую проверять на null и вызывать событие через эту переменную.

P. S. А вообще не рекомендую использовать возвращаемые значения в событиях - лучше сохраняйте их в свойства аргументов события EventArgNewForm. Там можно сделать свойство типа данных коллекции и сохранять сразу несколько значений.
...
Рейтинг: 0 / 0
Как работают события, возвращающие значения?
    #38860649
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnome Вопрос: Как будет работать код "Form form = NewFormCreated ...", если на событие подпишется сразу несколько обработчиков. Адрес какой формы будет занесён в переменную form? Можно ли как-то отловить все возвращаемые значения? А то каждый обработчик свою форму создаст и..куда она денется? Переменная-то всего одна.
При вызове события результатом будет результат последнего отработавшего обработчика (последнего в invocation list), остальные результаты уйдут в никуда - т.е. будут подобраны GC. Нюанс в том, что в общем случае порядок расположения обработчиков в invocation list события недетерминирован - он отдан на откуп реализации, и если сейчас он строго совпадает с порядком навешивания обработчиков на событие в коде, то нет никаких гарантий, что в будущих релизах платформы будет так же. Поэтому на порядок вызова обработчиков полагаться не следует.
За вычетом этого нюанса ничего страшного в событиях, возвращающих значение, не вижу. Как пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public sealed class Program
{
  public static void Main()
  {
    var f = new Foo();
    f.BarIncrementing += n => n%2 == 0;
    f.Inc(0);
    f.Inc(1);
    f.Inc(2);
    f.Inc(3);
    f.Inc(4);
  }
}

public class Foo
{
  public event Func<int, bool> BarIncrementing;

  public int Bar { get; private set; }

  public void Inc(int n)
  {
    var success = false;
    if (BarIncrementing!=null)
      success = BarIncrementing(n);
    if (success) Bar+=n;
    Console.WriteLine("{0} {1}", n, Bar);
  }
}

...
Рейтинг: 0 / 0
Как работают события, возвращающие значения?
    #38860653
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81Nika gnomeАдрес какой формы будет занесён в переменную form?
Последней.

Возможно ли как-то сделать ограничение, чтобы программа выдавала ошибку в случае, если на это событие подпишутся двое? (если нет, то, видимо, буду использовать делегат напрямую, без события)
Либо как-то узнать все возвращаемые значения, или это невозможно?

Ilya81Надо проверять значение NewFormCreated на null.
В общем случае, да. Но в моём пусть выдаёт ошибку, т.к. такое недопустимо.
В общем случае, опять же, если null, то выдавать самописный exception. В моём это не принципиально. Если выдаст ошибку, значит, я накосячила и забыла подписаться..
Ilya81А вообще не рекомендую использовать возвращаемые значения в событиях
Понимаю. Но от того, кто будет пользоваться моим компонентом я требую, чтобы он записал результат, не забыл это сделать. Самый очевидный способ - через return. А так, да, можно и через out, и вашим способом в сочетании с проверкой (if(e.form == null) throw myexception)
...
Рейтинг: 0 / 0
Как работают события, возвращающие значения?
    #38860656
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

спасибо за комментарий))
да, на порядок не надеюсь, т.к. он не описан в документации...
...
Рейтинг: 0 / 0
Как работают события, возвращающие значения?
    #38860667
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnomeВозможно ли как-то сделать ограничение, чтобы программа выдавала ошибку в случае, если на это событие подпишутся двое? (если нет, то, видимо, буду использовать делегат напрямую, без события)
Через явную реализацию события:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private EventHandlerNewFormCreated _newFormCreated

public event EventHandlerNewFormCreated NewFormCreated
{
  add 
  {
    if (_newFormCreated != null)
      throw new InvalidOperationException("...");
    _newFormCreated += value;
  }
  remove
  {
    _newFormCreated -= value;
  }
}


Nika gnomeЛибо как-то узнать все возвращаемые значения, или это невозможно?
Через возвращаемое значение, скорее, не получится, разве что наворотив какую-то особую явную реализацию.
...
Рейтинг: 0 / 0
Как работают события, возвращающие значения?
    #38860678
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81,

а, точно ж! отлично, это подходит!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как работают события, возвращающие значения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]