delover
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Далеко неочевидные вещи По клику на трейной иконке есть такой код: Код: if (cBuffer.Count == 0) { timerMessage.Enabled = false; if (!Settings.ShowSystemBallon) // && _formHint.Visible) _formHint.Close(); niMessage.Visible = false; } | Есть событие у окна: Код: private void FormHint_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason != CloseReason.WindowsShutDown) { e.Cancel = true; this.Hide(); } } | И есть код пустышка при показе главной формы: Код: // if (_formHint.Handle != (IntPtr)0) // _formHint.Tag = 0; | Так вот когда отрабатывает нажатие на иконку при старте программы (в этом случае я не показываю хинт - он невидим), то потом происходит ошибка когда я хочу показать окно - "FormHint - Disposed". Событие FormClosing не отрабатывает - там брейкпоинт и я в него не попадаю. Но вот если раскомментировать код пустышку, то всё работает корректно. Почему такая "гибкость" поведения? И зачем нужно так тупо обманывать форму, чтобы всё работало как надо? Может кто знает почему так сделано? Добавлено: У нас были дебаты большие с поклонником .NET который защищал этот момент - типо это правильно. Как Вы считаете правильно ли, что одноимённое событие в одном случае отрабатывает в другом случае (редком) не отрабатывает? Я же тупо по идеологии событий да и вобще по идеологии ООП считаю, что не надо делать Dispose моих объектов когда я про это таже ни сном ни духом. В Turbo Pascal 5.0 - Delphi2999 никто неспросясь не убивает моих объектов. И если уж есть событие про которое сказано в документации Майрософт: Цитата: Remarks When a form is closed, all resources created within the object are closed and the form is disposed. You can prevent the closing of a form at run time by handling the Closing event and setting the Cancel property of the CancelEventArgs passed as a parameter to your event handler. If the form you are closing is the startup form of your application, your application ends. | Хотя получается что это враньё, так как продекларировано, но не работает. Если Handle окна не запрашивался (когда его запрашивают оно создается если не создано) Ваше окно убьют, оставят кучу делегатов которые вы навешали в другие окна и классы. Сделают это втихушку и посчитают что это правильно, так как зачем доверять документациям Майкрософт? Это Вам не Delphi ребята, разработчики Delphi туповаты, что пишут в документации то и делают. |