Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
Я хочу показать заставку, подготовить данные и убрать заставку.
 private void PleaseWaitFormControl(bool show)
 {
    if (show)
     {
           if (logPWF == null)
           {
               logPWF = new PleaseWaitForm();
               logPWF.ShowDialog();
           }
     }
     else
      {
            if (ogPWF != null)
            {
                  logPWF.Close();  
                  logPWF.Dispose
            }
     }
 }

void Test()
{
     PleaseWaitFormControl(true);
     //do something
     PleaseWaitFormControl(false);
}


но после logPWF = new PleaseWaitForm(); код не продолжается и заставка крутиться вечно.

пробовал запускать в отдельном потоке
private void PleaseWaitFormControl(bool show)
{
            if (show)
            {
                tLogPleaseWaitForm = new System.Threading.Thread(new System.Threading.ThreadStart(showPleaseWaitForm));
                tLogPleaseWaitForm.Start();
            }
            else
            {
                 tLogPleaseWaitForm.Abort();
            }
}

        private void showPleaseWaitForm()
        {
            logPWF = new PleaseWaitForm();
            logPWF.ShowDialog();
        }

но на tLogPleaseWaitForm.Abort(); вылетаю в исключение.
7 фев 19, 14:12    [21803508]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
Syrex
Member

Откуда: Москва
Сообщений: 636
Поставь просто Show()
7 фев 19, 14:36    [21803539]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
Syrex
Поставь просто Show()

даю так работает. но один раз. на второй - cannot access disposed object - хотя я закрыл logPWF.Dispose().
7 фев 19, 14:43    [21803552]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
void Test()  //on button click
{
     logPWF.Show();
     //do something
    logPWF.Close();
}

так работает но один раз. на второй раз исключение.
7 фев 19, 15:07    [21803581]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
jenya7
void Test()  //on button click
{
     logPWF.Show();
     //do something
    logPWF.Close();
}

так работает но один раз. на второй раз исключение.

когда окно закрывается оно высвобождает занимаемые неуправляемые ресурсы
создайте новое окно
var form = new PleaseWaitForm();
form.Show();
...
form.Close();
и когда нужно открыть окно снова, создайте его еще раз.
Если окно нужно постоянно одно и тоже , используйте .Hide()
7 фев 19, 15:15    [21803589]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
Roman Mejtes
jenya7
void Test()  //on button click
{
     logPWF.Show();
     //do something
    logPWF.Close();
}

так работает но один раз. на второй раз исключение.

когда окно закрывается оно высвобождает занимаемые неуправляемые ресурсы
создайте новое окно
var form = new PleaseWaitForm();
form.Show();
...
form.Close();
и когда нужно открыть окно снова, создайте его еще раз.
Если окно нужно постоянно одно и тоже , используйте .Hide()

проблема в том что создается PleaseWaitForm в одном методе а закрывается в другом. Поэтому форма должна быть глобальной (?)
7 фев 19, 15:22    [21803599]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38457
jenya7
Syrex
Поставь просто Show()

даю так работает. но один раз. на второй - cannot access disposed object - хотя я закрыл logPWF.Dispose().
не закрыват, а скрыть hide.
7 фев 19, 15:29    [21803607]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
Petro123
jenya7
пропущено...

даю так работает. но один раз. на второй - cannot access disposed object - хотя я закрыл logPWF.Dispose().
не закрыват, а скрыть hide.

если скрыть ресурс останется не освобожденный.
7 фев 19, 15:45    [21803621]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
сделал так
private void SplashForm(Form frm, bool show)
        {
            if (show)
            {
                if (frm != null)
                {
                    frm.StartPosition = FormStartPosition.Manual;
                   frm.Left = this.Width / 2;
                   frm.Top = this.Height / 2;

                    frm.Show();
                   frm.BringToFront();
                }
            }
            else
            {
                if (frm != null)
                {
                    frm.Close();
                }
            }
        }


 private void button1_Click(object sender, EventArgs e)
        {
            if (form1  != null) 
                 form1 .Close();

            form1 = new Form1();
            SplashForm(form1, true);

        }

 private void button2_Click(object sender, EventArgs e)
        {
            SplashForm(form1, false);
        }

вроде работает.
7 фев 19, 16:06    [21803645]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38457
jenya7
не освобожденный
если один на все то не страшно.
7 фев 19, 16:11    [21803652]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
Может защититься если открытие и закрытие будет происходить из разных потоков?
private void button1_Click(object sender, EventArgs e)
        {
           if (form1 != null)
                form1.Close();

            form1 = new Form1();

            this.Invoke(
             (MethodInvoker)delegate
              {
                     SplashForm(form1, true); ;
               });   
        }

 private void button2_Click(object sender, EventArgs e)
        {
            this.Invoke(
             (MethodInvoker)delegate
             {
                  SplashForm(form1, false); ;
             });
        }
7 фев 19, 16:13    [21803656]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
Супер_Пав
Member

Откуда: Москва
Сообщений: 347
Рабочий пример:
_formImportProgress = new FormLoader
{
    ShowProgress = true,
    ProgressMessage = "Идет импорт данных",
    AllowBreakProccess = true
};
var backgroundWorker = new BackgroundWorker {WorkerSupportsCancellation = true};
backgroundWorker.DoWork += (o, args) =>
{
    // загрузка данных
};
backgroundWorker.RunWorkerCompleted += (o, args) =>
{    
    _formImportProgress.Close();
};
backgroundWorker.ProgressChanged += (o, args) =>
{
    _formImportProgress.CurrentProgress = args.ProgressPercentage;
};
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.RunWorkerAsync();
_formImportProgress.OnBreakProccess += () =>
{
    backgroundWorker.CancelAsync();
};
_formImportProgress.ShowDialog(this);
7 фев 19, 16:33    [21803683]     Ответить | Цитировать Сообщить модератору
 Re: Работа с формой заставкой (splash form)  [new]
jenya7
Member

Откуда:
Сообщений: 1111
Супер_Пав,
спасибо. как раз думал о BackgroundWorker. я его везде сую хотя не рекомендуют. :)
7 фев 19, 16:39    [21803690]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить