Здравствуйте, подозреваю, что тема избитая, но конкретно моей ситуации в поиске не нашел.
Настала необходимость поддерживать проект на С#, до этого момента только и знал что такой язык есть...не более
Т.е. опыт разработки на шарпе нулевой.
Возникла следующая проблема — форма MDI есть опция — экспорт данных в AVI, на момент экспорта (обычны for цикл в котором "рисуются" кадры для упаковки) поверх главной формы вывешивается немодальное окно с просьбой подождать(т.е. экспорт происходил в GUI потоке и что бы графика шевелилсь вызывалось дополнительно Application.DoEvents()).
Я добавил простую кнопочку отмены данного процесса экспорта. Собственно изменений почти нет....но приложение перестало закрываться ....т.е. в обработчике FormClosing параметр e.Cancel = true.
Ладно...переписал экспорт в отдельный поток....и все равно ситуация тоже самая....добавил в форму ожидания кнопку без обработчика (т.е. просто пустой контрол) и если даже эту кнопку нажать результат тот же — приложение не зарыть.
Голову уже сломал — как клик на пустую кнопку может запретить выход приложению.
Вполне возможно, что решение простое, но в виду отсутствия опыта с шарпом найти не могу.
Просьба подсказать в чем может быть проблема?
Спасибо
Здравствуйте, Shadow, Вы писали:
S> экспорт происходил в GUI потоке и что бы графика шевелилсь вызывалось дополнительно Application.DoEvents()
Это убого.
S>Ладно...переписал экспорт в отдельный поток....
Это правильно.
S>Голову уже сломал — как клик на пустую кнопку может запретить выход приложению. S>Просьба подсказать в чем может быть проблема?
Без кода? Мантрами? Запросто: может быть это какая-то "специальная" кнопочка или "особая" форма, возможно вы "что-то" делаете в обработчике нажатия на кнопочку, возможно в каком-то "другом" обработчике.
Если хочется поконкретнее, то может поделитесь кодом, тем что был или тем что стал (какой хотите пофиксить)?
Здравствуйте, Sinatr, Вы писали:
S>Здравствуйте, Shadow, Вы писали:
S>> экспорт происходил в GUI потоке и что бы графика шевелилсь вызывалось дополнительно Application.DoEvents()
S>Это убого.
S>>Ладно...переписал экспорт в отдельный поток....
S>Это правильно.
S>>Голову уже сломал — как клик на пустую кнопку может запретить выход приложению. S>>Просьба подсказать в чем может быть проблема?
S>Без кода? Мантрами? Запросто: может быть это какая-то "специальная" кнопочка или "особая" форма, возможно вы "что-то" делаете в обработчике нажатия на кнопочку, возможно в каком-то "другом" обработчике.
Прикол в том, что именно в обработчике ничего не делается, т.к. обработчика нет вообще. Именно это и ставило в ступор — нажимаю на кнопку без обработчика и такая разница в поведении.
S>Если хочется поконкретнее, то может поделитесь кодом, тем что был или тем что стал (какой хотите пофиксить)?
Примерно разобрался какой именно код приводит к такому поведению (исходника щас просто нет под рукой — вечером), но смысл такой: если при создании формы ей поставить свойство TopLevel = true, то такой траблы нет, а если пользовать изначальный код типа
wf = new WaitForm
this.Controls.Add(wf);
wf.BringToFront();
wf.Show();
....
процесс экспорта
.....
wf.Close();
То баг есть.
То есть последовательность действий была такая — сначала на форму положил кнопку и дописал обработчик по которому прерывается процесс экспорта....при нажатии кнопки получил невыход из приложения. Ладно думаю, руки кривые, кинул еще одну кнопку у которой уже нет обработчика, т.е. считай пустой контрол ни к чему не привязанный....нажимаю эту кнопку и поведение точно такое же — нет возможности выхода e.Cancel = true
Как нажатие на пустую кнопку может привести к блокировке выхода не могу понять.
Здравствуйте, Shadow, Вы писали:
S>Здравствуйте, Sinatr, Вы писали:
S>wf.Close();
MDI? Подсмотрите как в других дочерних формах процесс закрытия делается. Вы точно хотите открыть/закрыть дочернюю форму, а не какую-то модальную поверх окна-контейнера (parent form)?
S>Как нажатие на пустую кнопку может привести к блокировке выхода не могу понять.
Нажатие — никак, добавление очень даже может, если кто-то "умный" (сужу по начальному дизайну) редактировал Form.Designer.cs или, к примеру, это старый проект (когда дизайнер редактировал тот же файл, что и пользователь) и что-то пошло не так. Сравните файлы "до изменения" и "после".
Здравствуйте, Shadow, Вы писали:
S>Просьба подсказать в чем может быть проблема?
Может в этом дело?
Canceling the FormClosing event of an MDI child form does not prevent the FormClosing event of the MDI parent form from being raised. However, canceling the event will set to true the Cancel property of the FormClosingEventArgs class that is passed as a parameter to the parent form.
Здравствуйте, Sinatr, Вы писали:
S>Здравствуйте, Shadow, Вы писали:
S>>Здравствуйте, Sinatr, Вы писали:
S>>wf.Close();
S>MDI? Подсмотрите как в других дочерних формах процесс закрытия делается. Вы точно хотите открыть/закрыть дочернюю форму, а не какую-то модальную поверх окна-контейнера (parent form)?
Задача вывесить поверх главной MDI формы модальное окно до завершения процесса экспорта с возможностью отмены.
S>>Как нажатие на пустую кнопку может привести к блокировке выхода не могу понять.
S>Нажатие — никак, добавление очень даже может, если кто-то "умный" (сужу по начальному дизайну) редактировал Form.Designer.cs или, к примеру, это старый проект (когда дизайнер редактировал тот же файл, что и пользователь) и что-то пошло не так. Сравните файлы "до изменения" и "после".
Здравствуйте, _Raz_, Вы писали:
_R_>Здравствуйте, Shadow, Вы писали:
S>>Просьба подсказать в чем может быть проблема?
_R_>Может в этом дело? _R_>
_R_>Canceling the FormClosing event of an MDI child form does not prevent the FormClosing event of the MDI parent form from being raised. However, canceling the event will set to true the Cancel property of the FormClosingEventArgs class that is passed as a parameter to the parent form.
Видел этот абзац...
Повторюсь, если не нажимать кнопку с неподвешенным обработчиком, то закрытие происходит без вопросов. При нажатии кнопки e.Cancel = true.
Здравствуйте, Shadow, Вы писали:
S>Повторюсь, если не нажимать кнопку с неподвешенным обработчиком, то закрытие происходит без вопросов. При нажатии кнопки e.Cancel = true.
Может тогда дело в Button.DialogResult или Form.CancelButton
Здравствуйте, _Raz_, Вы писали:
_R_>Здравствуйте, Shadow, Вы писали:
S>>Повторюсь, если не нажимать кнопку с неподвешенным обработчиком, то закрытие происходит без вопросов. При нажатии кнопки e.Cancel = true.
_R_>Может тогда дело в Button.DialogResult или Form.CancelButton
Там кода почти нет:
public delegate void BntCancelPressedHandler();
public partial class WaitForm : Form {
public WaitForm() {
InitializeComponent();
ButtonTouched = null;
}
public event BntCancelPressedHandler ButtonTouched;
Здравствуйте, Sinatr, Вы писали:
S>Здравствуйте, Shadow, Вы писали:
S>>Задача вывесить поверх главной MDI формы модальное окно до завершения процесса экспорта с возможностью отмены.
S>А зачем вы его в контейнер добавляете?
S>>wf = new WaitForm S>>this.Controls.Add(wf); // уберите это S>>wf.BringToFront(); S>>wf.Show();
Добавляю не я Этот код уже был. Собственно когда я его закомментировал, то и косяк пропал.