Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрытие формы вместо удаления 
V
    Опции темы
XavierElf
  Дата 9.4.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: 1
Всего: 1



Проблема состоит в следующем: у меня есть некая форма содержащая лист-бокс, который отображает сообщения обмена с сервером. Она(эта форма) создаётся с началом работы приложения и должна заканчивать свою работу с завершением работы приложения. Большую часть времени она скрыта, однако в лист-бокс постоянно передаётся вся информация об обмене с сервером. Периодически её можно вызывать из меню приложения, однако, после того, как необходимость в ней пропадает, её необходимо не удалить, а скрыть, чтобы не терять всю информацию из лист-бокса. Хранить эту информацию в массиве я не хочу, так как она может вырасти до довольно большого размера... Мне нужно, чтобы по нажатию "креста" в системном меню или комбинации <Alt>+<F4>, форма скрывалась. Как это можно реализовать?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Naum
Дата 9.4.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 1
Всего: 15



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


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
XavierElf
Дата 9.4.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: 1
Всего: 1



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

//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();
    }
}

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

Это сообщение отредактировал(а) XavierElf - 9.4.2007, 10:28
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
enginer
Дата 9.4.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: нет
Всего: 1



не очень красиво но 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();
            }
        }



PM MAIL   Вверх
XavierElf
Дата 9.4.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: 1
Всего: 1



Это я в самом начале пробовал - не катит... У меня кстати сообщением выше твоего написан практически аналогичный код, если учесть, что вместо "глобальной переменной" я использую свойство типа "get". Впрочем проблему я всё-таки решил, использовав вместо Show() метод ShowDialog()... Только не устраивает, что диалог модальный... Если кто-нибудь знает, как всё-таки можно решить мою проблему без модального диалога - напишите плз... А пока вопрос решён...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Hurricane
Дата 10.4.2007, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: нет
Всего: 9



А если вот так? 
Код

    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, в конструкторе (или по первому обращению, или когда надо) - создается объект немодального диалога, и дальше он прячется/показывается когда надо. В деструкторе родительского класса он уничтожается, с соответствующим закрытием окна.

PM MAIL   Вверх
enginer
Дата 10.4.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: нет
Всего: 1



не могу понять, что именно "не катит". код проверен, свое отрабатывает как надо.  безусловно общие черты с твоим кодом есть, но я просто состряпал примитив для проверки. короч все работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.