Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Form.Closing и Form.FormClosing 
:(
    Опции темы
archeg
Дата 27.8.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 9
Всего: 27



Друг показал интерестную штуку - сам никогда не замечал.

В книге Нейгела (2.0) попадается код, который использует Form.Closing событие. 
Это событие перекочевало с FW 1.1 - в котором оно было единственное. Но в FW 2.0 вместо него присобачили Form.FormClosing. 

Фишка в том, что как Form.Closing, так и Form.FormClosing - работают (это еще не странно, так и должно быть), но IntelliSense "видит" только Form.FormClosing. На введеную Form.Closing он не реагирует будто-бы его нету..

Посмотрев рефлектором обнаружил такой код: 
Код

// "Нормальный" Form.FormClosing:
[SRCategory("CatBehavior"), SRDescription("FormOnFormClosingDescr")]
public event FormClosingEventHandler FormClosing;
// И "заблоченый" Form.Closing:
[EditorBrowsable(EditorBrowsableState.Never), SRCategory("CatBehavior"), SRDescription("FormOnClosingDescr"), Browsable(false)]
public event CancelEventHandler Closing;


Не могу понять, почему в M$ использовали довольно кардинальное решение в виде EditorBrowsable(EditorBrowsableState.Never),  Browsable(false) - почему они не использовали обще-принятое решение в виде ObsoleteAttribute?


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
tol05
Дата 27.8.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



чтоб побыстрее на FormClosing переходили, т.к. лично меня "Obsolete" еще никогда не останавливал smile
к тому же "Obsolete" только warning выдает, так зачем же позволять IntelliSense предлагать тебе Form.Closing, чтою потом warning выдать?

А так - попробуй еще вспомнить, догадаться, найти этот FormClosing... 
Новая "тактика умалчивания", "авось не найдут" smile 

Это сообщение отредактировал(а) tol05 - 27.8.2007, 13:20


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
archeg
Дата 27.8.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 9
Всего: 27



Ну как то я не знаю, это гм....

Тут сидишь-гадаешь, много ли еще прийдется встретить таких тайн  smile 

Нельзя доверять мелкософту smile  smile 

Я когда увидел в аттрибуте "Never" - это меня убило.. это как смертный приговор smile не ожидал такого  smile 

Это сообщение отредактировал(а) archeg - 27.8.2007, 13:28


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Linus
Дата 27.8.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.8.2006
Где: Украина

Репутация: 3
Всего: 4



По MSDN нашёл только 2 отличия:
Form.FormClosing Event 
Occurs before the form is closed. 
Form.Closing Event 
Occurs when the form is closing. 
Caution  : The Closing event is obsolete in the .NET Framework version 2.0; use the FormClosing event instead.

Тут пришла мысль, что "before" было бы более безопасно, чем "when"  smile  Также думаю дело в том, что эти события от 2-х разных делегатов: FormClosingEventHandler и CancelEventHandler.
Код

[HostProtection(SecurityAction.LinkDemand, SharedState=true)]
public delegate void CancelEventHandler(object sender, CancelEventArgs e);

Код

public delegate void FormClosingEventHandler(object sender, FormClosingEventArgs e);

"Старый" делегат юзал  декларативную защиту. И тут наблюдается, что входные параметрами этих делегатов являются разными типами - CancelEventArgs и FormClosingEventArgs.
Код

//Provides the data for a cancelable event
[HostProtection(SecurityAction.LinkDemand, SharedState=true)]
public class CancelEventArgs : EventArgs
{
    // Fields
    private bool cancel;

    // Methods
    public CancelEventArgs();
    public CancelEventArgs(bool cancel);

    // Properties
    public bool Cancel { get; set; }
}


Код

//provides the data for the FormClosing event 
public class FormClosingEventArgs : CancelEventArgs
{
    // Fields
    private CloseReason closeReason;

    // Methods
    public FormClosingEventArgs(CloseReason closeReason, bool cancel);

    // Properties
    public CloseReason CloseReason { get; }
}

Наверное здесь всё и кроется  smile В новом FormClosingEventArgs появилось поле CloseReason, которое определяется так:
Код

public enum CloseReason
{
    None,
    WindowsShutDown,
    MdiFormClosing,
    UserClosing,
    TaskManagerClosing,
    FormOwnerClosing,
    ApplicationExitCall
}

То есть это уже дополнительная информация.

Это сообщение отредактировал(а) Linus - 27.8.2007, 13:54
PM MAIL ICQ   Вверх
Linus
Дата 27.8.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.8.2006
Где: Украина

Репутация: 3
Всего: 4



Также событие Closing не срабатывает, когда вызывается Application.Exit(), в то время как FormClosing срабатывает.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0913 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.