Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Скрытие формы вместо удаления


Автор: XavierElf 9.4.2007, 09:33
Проблема состоит в следующем: у меня есть некая форма содержащая лист-бокс, который отображает сообщения обмена с сервером. Она(эта форма) создаётся с началом работы приложения и должна заканчивать свою работу с завершением работы приложения. Большую часть времени она скрыта, однако в лист-бокс постоянно передаётся вся информация об обмене с сервером. Периодически её можно вызывать из меню приложения, однако, после того, как необходимость в ней пропадает, её необходимо не удалить, а скрыть, чтобы не терять всю информацию из лист-бокса. Хранить эту информацию в массиве я не хочу, так как она может вырасти до довольно большого размера... Мне нужно, чтобы по нажатию "креста" в системном меню или комбинации <Alt>+<F4>, форма скрывалась. Как это можно реализовать?

Автор: Naum 9.4.2007, 09:55
Пишешь в событии Closing этой формы пишешь e.Cancel = true; this.Hide();

Автор: XavierElf 9.4.2007, 10:27
Так, теперь не получается закрыть приложение...
Сделал так:
Код

//MainForm
...
private bool _isDisposing = false;
public bool IsDisposing
{
    get { return _isDisposing; }
}

void MainFormFormClosing(object sender, FormClosingEventArgs e)
{
    _isDisposing = true;
}
...
//ChildForm
MainForm _ownerForm;
public StatusMessages(MainForm ownerForm)
{
    _ownerForm = ownerForm;
    InitializeComponent();
}

void StatusMessagesFormClosing(object sender, FormClosingEventArgs e)
{
    if (_ownerForm.IsDisposing)
        this.Dispose();
    else
    {
        e.Cancel = true;
        this.Hide();
    }
}

Однако после этого программа начала закрываться только после второго клика по "кресту".

Автор: enginer 9.4.2007, 14:59
не очень красиво но 100% работает

Главная форма

Код

        public static bool bClosing = false;

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            bClosing = true;
        }


Дочерняя форма

Код

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!Form1.bClosing)
            {
                e.Cancel = true;
                this.Hide();
            }
        }



Автор: XavierElf 9.4.2007, 16:50
Это я в самом начале пробовал - не катит... У меня кстати сообщением выше твоего написан практически аналогичный код, если учесть, что вместо "глобальной переменной" я использую свойство типа "get". Впрочем проблему я всё-таки решил, использовав вместо Show() метод ShowDialog()... Только не устраивает, что диалог модальный... Если кто-нибудь знает, как всё-таки можно решить мою проблему без модального диалога - напишите плз... А пока вопрос решён...

Автор: Hurricane 10.4.2007, 07:59
А если вот так? 
Код

    public partial class Form1 : Form
    {
        private Form2 form2;

        public Form1()
        {
            InitializeComponent();
            form2 = new Form2();
            form2.Hide();
        }

        //
        // Here we need to show the second form, it might be a button click or menu item selection or whatever.
        //
        private void button1_Click(object sender, EventArgs e)
        {
            form2.Show();
        }

        //
        // Dispose the second form on closing of the first (main) form
        //
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            form2.Dispose();
        }
    }



Во второй форме - просто прячем ее вместо закрытия:
Код

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
        }



Чтобы было совсем красиво - было бы хорошо передавать FormClosing событие из второй формы в первую (основную), а та уже бы решала, что нужно сделать, например - form2.Hide();

Еще красивее - делается отдельный класс-менеджер, который управляет Hide/Show второй формы. Но это уже к вопросам дизайна.

В C++ часто так и делается - где-то есть auto_ptr<CMyDialog> m_pDialog, в конструкторе (или по первому обращению, или когда надо) - создается объект немодального диалога, и дальше он прячется/показывается когда надо. В деструкторе родительского класса он уничтожается, с соответствующим закрытием окна.

Автор: enginer 10.4.2007, 12:58
не могу понять, что именно "не катит". код проверен, свое отрабатывает как надо.  безусловно общие черты с твоим кодом есть, но я просто состряпал примитив для проверки. короч все работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)