Вызвать событие ToolStripMenuItem_Click в Form1_FormClosing
private delegate void CloseProgressCallback2(); // Делегат для закрытия диалога прогресс-бара.
public delegate void OnWorkIsDoneHandler(object sender, EventArgs e); // Делегат для события окна.
public event OnWorkIsDoneHandler OnWorkIsDone2; // Событие окна: завершение потока обновления.
OnWorkIsDone2 += Form1_OnWorkIsDone2;
private void Form1_OnWorkIsDone2(object sender, EventArgs e)
{
waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
Application.Exit();
}
private void CloseProgress2()
{
if (waitForm2 != null)
{
waitForm2.Close();
this.toolStrip1.Enabled = true;
}
}
private void OutThread()
{
System.IO.File.Delete("file.xml");
Thread.Sleep(3000);
// Оповещаем основное окно о завершении работы.
if (OnWorkIsDone2 != null)
{
OnWorkIsDone2(this, EventArgs.Empty);
}
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{
this.toolStrip1.Enabled = false;
// Инициализация и показ формы с прогресс-баром.
waitForm2 = new Form2();
waitForm2.Show();
// Создание и запуск рабочего потока.
System.Threading.Thread outThread = new System.Threading.Thread(new System.Threading.ThreadStart(OutThread));
outThread.Start();
}
{
}
Т.е. когда нажимаешь на крестик формы,срабатывает событие выходToolStripMenuItem_Click
Попробуйте так:
{
EventArgs placeholder;//формал. параметр.
выходToolStripMenuItem_Click(sender, placeholder );
}
Реальный сендер тут пофигу, а параметр события вы ведь все-равно не используете..
Может вместо placeholder вообще ноль можно заслать.. Не силен я в шарпе, мог и наерундить.
Дополнительные сведения: Коллекция была изменена; невозможно выполнить операцию перечисления.
И указывает на код,а именно на Application.Exit();
{
waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
Application.Exit();
}
{
this.toolStrip1.Enabled = false;
// Инициализация и показ формы с прогресс-баром.
waitForm2 = new Form2();
waitForm2.Show();
// Создание и запуск рабочего потока.
System.Threading.Thread outThread = new System.Threading.Thread(new System.Threading.ThreadStart(OutThread));
outThread.Start();
}
Дополнительные сведения: Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна.
И указывает на:
Т.е. Form1_FormClosing тупо выполняет закрытие формы без всяких прогрессбаров и потоков, выходToolStripMenuItem_Click спокойно срабатывает и вызывает прогресбар с закрытием.
Ничего не пойму...,что нужно этому Form1_FormClosing
...
private void Form1_OnWorkIsDone2(object sender, EventArgs e)
{
waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
Application.Exit();
}
Application.Exit();
т.е. завершает всю программу.
Форма просто выполняет стандартный form1.close() без дополнительных действий, я так понимаю. Но вы можете переопределить стандартный обработчик для закрытия файлов и т.п. Это мои предположения.
...
private void Form1_OnWorkIsDone2(object sender, EventArgs e)
{
waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
Application.Exit();
}
Application.Exit();
т.е. завершает всю программу.
Ну да...т.е. по задумке по нажатию на выход,идет сначала удаление файла с которым я работал,а после закрытие всего приложения и все это с участием Form2(он же прогрессбар)
Только вот на самом деле я не знаю куда правильней было бы поставить Application.Exit(); ,чтобы это работало без конфликтов.
P.S. Ходь бы кто из шарпов подключился, а то я тут уже своими предположениями все захламил :)
Я тут думаю...может когда я нажимаю Form1_FormClosing то приложение уже по своей сути должно быть закрыто т.е. приложение закрывается,даже не дав начать выполнять показ прогрессбара и т.д. ,а там еще и Application.Exit(); лезет. Типа после срабатывания Form1_FormClosing уже нечего закрывать.
Как заставить крест закрытия формы работать как обычный button на который можно повесить что угодно?
P.S. Нужен ли вообще прогрессбар на закрытие, долго ли программа закрывается? Не достаточно ли нам чего-то простого типа:
{
//останов потоков, если есть
...
System.IO.File.Delete("file.xml");
}
Пока роюсь на просторах...может где еще затрагивались подобные проблемы с Form1_FormClosing
Form1_FormClose на этом этапе программирования мы можем вернуть форму(Класс) в исходное состояния , типа такого вопроса ВЫ хотите закрыть программу. И соответсвующий код. Но вот тут и есть деталь если нет события Form1_FormClose форма(Класс) закроется авто.
Но теперь самое главное если есть события Form1_FormClosing , это следствия события Form1_FormClose (вот тут без разницы объявили Вы его or нет, другими словами Вы кнопали красный крест) и будет сделано какое-то действия соответственно коду. Это удобно для удаления потоков связанных с формой(Классом). Другими словами после кнопали красный крест формы(Класса) уже нет в природе компа.
Т.е. как-то нужно отложить закрытие приложения пока не удалится файл,но тут еще прогресбар бегать должен.
Вот ссылка на форум Ссылка
Ребята , вот тут у Вас есть непонимания с событиями Form1_FormClosing and Form1_FormClose
Ну не знаю как правильно на Русском объяснитъ палётъ на пальцах:
Вы кнопаете красный крест
(если Вы включили события Form1_FormClose, то будет действия вашего кода для Form1(Класса))
(если Вы включили события Form1_FormClosing, то будет действия вашего кода после закрытия Form1(Класса))
Ыначе Form1(Класса) просто закроется и все потоки прощдённые Form1(Класса) типа если создавали ,будут жить or типа такой
Т.е. как-то нужно отложить закрытие приложения пока не удалится файл,но тут еще прогресбар бегать должен.
Вот ссылка на форум Ссылка
Тупа на ссылку примерно так
Tnen();
ВашаForm.Close();
На скорую руку