Закрытие формы и FormClosingEventArgs
От: Shadow Россия  
Дата: 17.04.16 12:36
Оценка:
Здравствуйте, подозреваю, что тема избитая, но конкретно моей ситуации в поиске не нашел.
Настала необходимость поддерживать проект на С#, до этого момента только и знал что такой язык есть...не более
Т.е. опыт разработки на шарпе нулевой.
Возникла следующая проблема — форма MDI есть опция — экспорт данных в AVI, на момент экспорта (обычны for цикл в котором "рисуются" кадры для упаковки) поверх главной формы вывешивается немодальное окно с просьбой подождать(т.е. экспорт происходил в GUI потоке и что бы графика шевелилсь вызывалось дополнительно Application.DoEvents()).
Я добавил простую кнопочку отмены данного процесса экспорта. Собственно изменений почти нет....но приложение перестало закрываться ....т.е. в обработчике FormClosing параметр e.Cancel = true.
Ладно...переписал экспорт в отдельный поток....и все равно ситуация тоже самая....добавил в форму ожидания кнопку без обработчика (т.е. просто пустой контрол) и если даже эту кнопку нажать результат тот же — приложение не зарыть.
Голову уже сломал — как клик на пустую кнопку может запретить выход приложению.
Вполне возможно, что решение простое, но в виду отсутствия опыта с шарпом найти не могу.
Просьба подсказать в чем может быть проблема?
Спасибо
Re: Закрытие формы и FormClosingEventArgs
От: Sinatr Германия  
Дата: 18.04.16 07:28
Оценка:
Здравствуйте, Shadow, Вы писали:

S> экспорт происходил в GUI потоке и что бы графика шевелилсь вызывалось дополнительно Application.DoEvents()


Это убого.

S>Ладно...переписал экспорт в отдельный поток....


Это правильно.

S>Голову уже сломал — как клик на пустую кнопку может запретить выход приложению.

S>Просьба подсказать в чем может быть проблема?

Без кода? Мантрами? Запросто: может быть это какая-то "специальная" кнопочка или "особая" форма, возможно вы "что-то" делаете в обработчике нажатия на кнопочку, возможно в каком-то "другом" обработчике.

Если хочется поконкретнее, то может поделитесь кодом, тем что был или тем что стал (какой хотите пофиксить)?
---
ПроГLамеры объединяйтесь..
Re[2]: Закрытие формы и FormClosingEventArgs
От: Shadow Россия  
Дата: 18.04.16 08:18
Оценка:
Здравствуйте, 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
Как нажатие на пустую кнопку может привести к блокировке выхода не могу понять.
Отредактировано 18.04.2016 8:26 Shadow . Предыдущая версия .
Re[3]: Закрытие формы и FormClosingEventArgs
От: Sinatr Германия  
Дата: 18.04.16 10:23
Оценка:
Здравствуйте, Shadow, Вы писали:

S>Здравствуйте, Sinatr, Вы писали:


S>wf.Close();


MDI? Подсмотрите как в других дочерних формах процесс закрытия делается. Вы точно хотите открыть/закрыть дочернюю форму, а не какую-то модальную поверх окна-контейнера (parent form)?

S>Как нажатие на пустую кнопку может привести к блокировке выхода не могу понять.


Нажатие — никак, добавление очень даже может, если кто-то "умный" (сужу по начальному дизайну) редактировал Form.Designer.cs или, к примеру, это старый проект (когда дизайнер редактировал тот же файл, что и пользователь) и что-то пошло не так. Сравните файлы "до изменения" и "после".
---
ПроГLамеры объединяйтесь..
Re: Закрытие формы и FormClosingEventArgs
От: _Raz_  
Дата: 18.04.16 10:56
Оценка:
Здравствуйте, 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.

Form.FormClosing Event

... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[4]: Закрытие формы и FormClosingEventArgs
От: Shadow Россия  
Дата: 18.04.16 11:11
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Здравствуйте, Shadow, Вы писали:


S>>Здравствуйте, Sinatr, Вы писали:


S>>wf.Close();


S>MDI? Подсмотрите как в других дочерних формах процесс закрытия делается. Вы точно хотите открыть/закрыть дочернюю форму, а не какую-то модальную поверх окна-контейнера (parent form)?


Задача вывесить поверх главной MDI формы модальное окно до завершения процесса экспорта с возможностью отмены.

S>>Как нажатие на пустую кнопку может привести к блокировке выхода не могу понять.


S>Нажатие — никак, добавление очень даже может, если кто-то "умный" (сужу по начальному дизайну) редактировал Form.Designer.cs или, к примеру, это старый проект (когда дизайнер редактировал тот же файл, что и пользователь) и что-то пошло не так. Сравните файлы "до изменения" и "после".


Спасибо, буду смотреть.
Re[2]: Закрытие формы и FormClosingEventArgs
От: Shadow Россия  
Дата: 18.04.16 11:19
Оценка:
Здравствуйте, _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.

_R_>Form.FormClosing Event


Видел этот абзац...
Повторюсь, если не нажимать кнопку с неподвешенным обработчиком, то закрытие происходит без вопросов. При нажатии кнопки e.Cancel = true.
Re[5]: Закрытие формы и FormClosingEventArgs
От: Sinatr Германия  
Дата: 18.04.16 12:45
Оценка:
Здравствуйте, Shadow, Вы писали:

S>Задача вывесить поверх главной MDI формы модальное окно до завершения процесса экспорта с возможностью отмены.


А зачем вы его в контейнер добавляете?

S>wf = new WaitForm

S>this.Controls.Add(wf); // уберите это
S>wf.BringToFront();
S>wf.Show();
---
ПроГLамеры объединяйтесь..
Re[3]: Закрытие формы и FormClosingEventArgs
От: _Raz_  
Дата: 18.04.16 12:55
Оценка:
Здравствуйте, Shadow, Вы писали:

S>Повторюсь, если не нажимать кнопку с неподвешенным обработчиком, то закрытие происходит без вопросов. При нажатии кнопки e.Cancel = true.


Может тогда дело в Button.DialogResult или Form.CancelButton
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[4]: Закрытие формы и FormClosingEventArgs
От: Shadow Россия  
Дата: 18.04.16 14:46
Оценка:
Здравствуйте, _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;

private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;

if ( ButtonTouched != null)
ButtonTouched();
}
}

ну и код дезигнера

partial class WaitForm {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing ) {
if( disposing && ( components != null ) ) {
components.Dispose();
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.label1 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label1.Location = new System.Drawing.Point(33, 27);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(168, 17);
this.label1.TabIndex = 1;
this.label1.Text = "AVI writing is performed...";
//
// button1
//
this.button1.Location = new System.Drawing.Point(68, 54);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 2;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(86, 1);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 3;
this.button2.Text = "button2";
this.button2.UseVisualStyleBackColor = true;
//
// WaitForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(228, 81);
this.ControlBox = false;
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label1);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "WaitForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion

private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;

}

то есть самая простая форма получается
Re[6]: Закрытие формы и FormClosingEventArgs
От: Shadow Россия  
Дата: 18.04.16 14:50
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Здравствуйте, Shadow, Вы писали:


S>>Задача вывесить поверх главной MDI формы модальное окно до завершения процесса экспорта с возможностью отмены.


S>А зачем вы его в контейнер добавляете?


S>>wf = new WaitForm

S>>this.Controls.Add(wf); // уберите это
S>>wf.BringToFront();
S>>wf.Show();

Добавляю не я Этот код уже был. Собственно когда я его закомментировал, то и косяк пропал.

//create export thread
//if (exportAviThread == null)
{
exportAviThread = new Thread(exportAviStreamThread);
exportAviThread.IsBackground = true;
}

//clear wait flag
bNeedCancelExport = false;

if( this.completeEvt == null )
this.completeEvt += new ExportingAviStreamComplete(AviCompleteHandler);

if (myTestForm == null)
{
myTestForm = new TestForm();
myTestForm.TopLevel = true;
//this.Controls.Add(myTestForm);
myTestForm.Location = new Point((Width — myTestForm.Width) / 2, (Height — myTestForm.Height) / 2);
//myTestForm.BringToFront();
}
myTestForm.Show();

//start export thread
exportAviThread.Start();

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