Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6457
Последний выпуск: 19.06.2015

Вызвать событие ToolStripMenuItem_Click в Form1_FormClosing

69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
Здравствуйте!Есть код события закрытия приложения:
Код:
private Form2 waitForm2; // Окно с прогресс-баром заврешения.
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();
         }
И есть событие когда нажимаешь на красный крестик

 
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
           
        }
Так вот...как сделать ссылку на событие выходToolStripMenuItem_Click в Form1_FormClosing
Т.е. когда нажимаешь на крестик формы,срабатывает событие выходToolStripMenuItem_Click
316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
А если просто вызвать из одного обработчика события другой ?

Попробуйте так:


 
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
     {
         EventArgs placeholder;//формал. параметр.
         выходToolStripMenuItem_Click(sender, placeholder );
     }

Реальный сендер тут пофигу, а параметр события вы ведь все-равно не используете..
Может вместо placeholder вообще ноль можно заслать.. Не силен я в шарпе, мог и наерундить.
69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
Почему при нажатии на выход у меня выскакивает сообщение:

Цитата:
Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll
Дополнительные сведения: Коллекция была изменена; невозможно выполнить операцию перечисления.


И указывает на код,а именно на Application.Exit();

 
Код:
private void Form1_OnWorkIsDone2(object sender, EventArgs e)
{
waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
Application.Exit();
}
316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
Если тупо код одного обработчика закопипастить в другой:

 
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs 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();
}
ошибка прежняя выскакивает? Тогда дело еще в чем-то другом.
69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
Если закопипастить то при нажатии на крест выдает следущее:

Цитата:
Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll
Дополнительные сведения: Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна.


И указывает на:

 
Код:
waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
CloseProgress2 начинается с закрытия формы, может поэтому дискриптор теряется. Каков механизм invoke не знаю..
69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
Я тут поэкспериментировал и понял,что если в Form1_FormClosing ничего не писать,то никаких ошибок с выходToolStripMenuItem_Click не выходит.
Т.е. Form1_FormClosing тупо выполняет закрытие формы без всяких прогрессбаров и потоков, выходToolStripMenuItem_Click спокойно срабатывает и вызывает прогресбар с закрытием.
Ничего не пойму...,что нужно этому Form1_FormClosing
316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
Я еще один момент не понял:

 
Код:
public event OnWorkIsDoneHandler OnWorkIsDone2; // Событие окна: завершение потока обновления.
...
private void Form1_OnWorkIsDone2(object sender, EventArgs e)
{
 waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
 Application.Exit();
}
С одной стороны это сбработчик завершения обновления, но содержит
Application.Exit();
т.е. завершает всю программу.

Цитата:
Form1_FormClosing тупо выполняет закрытие формы без всяких прогрессбаров и потоков..


Форма просто выполняет стандартный form1.close() без дополнительных действий, я так понимаю. Но вы можете переопределить стандартный обработчик для закрытия файлов и т.п. Это мои предположения.

69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
Цитата: sadovoya
Я еще один момент не понял:

 
Код:
public event OnWorkIsDoneHandler OnWorkIsDone2; // Событие окна: завершение потока обновления.
...
private void Form1_OnWorkIsDone2(object sender, EventArgs e)
{
 waitForm2.Invoke(new CloseProgressCallback2(CloseProgress2));
 Application.Exit();
}
С одной стороны это сбработчик завершения обновления, но содержит
Application.Exit();
т.е. завершает всю программу.



Ну да...т.е. по задумке по нажатию на выход,идет сначала удаление файла с которым я работал,а после закрытие всего приложения и все это с участием Form2(он же прогрессбар)

Только вот на самом деле я не знаю куда правильней было бы поставить Application.Exit(); ,чтобы это работало без конфликтов.

316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
Application.Exit() по идее последней строкой в обработчик закрытия главной формы просится. Либо вообще не нужен (это вроде аварийный выход). Достаточно Form1.Close(). Это опять предположение..

P.S. Ходь бы кто из шарпов подключился, а то я тут уже своими предположениями все захламил :)
69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
От предположения до решения не далеко))А по теме...почему Form1_FormClosing такой капризный,если на него вешать события не стандартные ему?
316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
Вроде капризничать не должен. У нас косяк какой-то. Думаю где-то в invoke. А нет ли возможности этот invoke от первой формы вместо второй сделать? Мы вторую все-таки через invoke и закрываем?
69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
Цитата: sadovoya
Вроде капризничать не должен. У нас косяк какой-то. Думаю где-то в invoke. А нет ли возможности этот invoke от первой формы вместо второй сделать? Мы вторую все-таки через invoke и закрываем?


Я тут думаю...может когда я нажимаю Form1_FormClosing то приложение уже по своей сути должно быть закрыто т.е. приложение закрывается,даже не дав начать выполнять показ прогрессбара и т.д. ,а там еще и Application.Exit(); лезет. Типа после срабатывания Form1_FormClosing уже нечего закрывать.
Как заставить крест закрытия формы работать как обычный button на который можно повесить что угодно?

316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
Этот крест равносилен вызову Form1_FormClosing. Пустой обработчик (или его отсутствие) вызывают Form1.Close() из "недр" класса с примитивным закрытием приложения. Когда мы пишим свой обработчик закрытия формы, то сперва выполняется наш код обработчика, а потом неявно для нас - стандартный. Наша цель в этом обработчике запустить прогресс, удалить файл. Дождаться завершения потоков или их остановить. И все, далее вызовется закрытие формы и терминирование приложения автоматически. Насколько я это понимаю (может и не так). А Application.Exit(); я бы убрал вообще.
316
14 июня 2014 года
sadovoya
757 / / 19.11.2005
А нет событий типа beforeClosing или onStartClosing. Может мы действительно не совсем пожходящее событие обрабатываем?

P.S. Нужен ли вообще прогрессбар на закрытие, долго ли программа закрывается? Не достаточно ли нам чего-то простого типа:

 
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    //останов потоков, если есть
    ...

    System.IO.File.Delete("file.xml");
}
69K
14 июня 2014 года
Palma91
21 / / 10.06.2014
Файл то изначально просто удалялся,как в коде выше.Но потом после недавнего внедрения прогрессбара в потоки открытия файла,я загорелся идеей сделать и для выхода тоже самое.Но получилось только для выходToolStripMenuItem_Click.
Пока роюсь на просторах...может где еще затрагивались подобные проблемы с Form1_FormClosing
322
15 июня 2014 года
UserNet2008
744 / / 03.04.2010
Тут самое главное понять события Form1_FormClosing and Form1_FormClose типа такого
Form1_FormClose на этом этапе программирования мы можем вернуть форму(Класс) в исходное состояния , типа такого вопроса ВЫ хотите закрыть программу. И соответсвующий код. Но вот тут и есть деталь если нет события Form1_FormClose форма(Класс) закроется авто.
Но теперь самое главное если есть события Form1_FormClosing , это следствия события Form1_FormClose (вот тут без разницы объявили Вы его or нет, другими словами Вы кнопали красный крест) и будет сделано какое-то действия соответственно коду. Это удобно для удаления потоков связанных с формой(Классом). Другими словами после кнопали красный крест формы(Класса) уже нет в природе компа.
316
15 июня 2014 года
sadovoya
757 / / 19.11.2005
UserNet2008, если я вас правильно понял, надо обработать событие Form1_FormClose вместо Form1_FormClosing?
69K
15 июня 2014 года
Palma91
21 / / 10.06.2014
Я тут погулял по форумам и наткнулся на похожую тему. Там задали вопрос как "Закрыть поток перед событием FormClosing"
Т.е. как-то нужно отложить закрытие приложения пока не удалится файл,но тут еще прогресбар бегать должен.
Вот ссылка на форум Ссылка
322
15 июня 2014 года
UserNet2008
744 / / 03.04.2010
Цитата: sadovoya
UserNet2008, если я вас правильно понял, надо обработать событие Form1_FormClose вместо Form1_FormClosing?


Ребята , вот тут у Вас есть непонимания с событиями Form1_FormClosing and Form1_FormClose
Ну не знаю как правильно на Русском объяснитъ палётъ на пальцах:
Вы кнопаете красный крест
(если Вы включили события Form1_FormClose, то будет действия вашего кода для Form1(Класса))
(если Вы включили события Form1_FormClosing, то будет действия вашего кода после закрытия Form1(Класса))
Ыначе Form1(Класса) просто закроется и все потоки прощдённые Form1(Класса) типа если создавали ,будут жить or типа такой

322
15 июня 2014 года
UserNet2008
744 / / 03.04.2010
Цитата: Palma91
Я тут погулял по форумам и наткнулся на похожую тему. Там задали вопрос как "Закрыть поток перед событием FormClosing"
Т.е. как-то нужно отложить закрытие приложения пока не удалится файл,но тут еще прогресбар бегать должен.
Вот ссылка на форум Ссылка


Тупа на ссылку примерно так

 
Код:
if (прогресбар.value == 100)
    Tnen();
ВашаForm.Close();
P.S
На скорую руку

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог