Постійний збір на дрони FPV для ЗСУ
Закидуй дві гривні!
FPV-дрони змінюють хід війни
Змінюй хід війни!

C#. Из коллекции форм не удаляется форма при закрытии по правой кнопке->закрыть. По крестику хедера - удаляет.

🔴 10:24 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 17.08.2005
Повідом.: 48972
  • 🔴 10:24 Повітряна тривога в Харків.обл.
  • #1
C#. Из коллекции форм не удаляется форма при закрытии по правой кнопке->закрыть. По крестику хедера - удаляет.

В некоем классе объявлена коллекция
Код:
private static List<Console> mConsol = new List<Console>();
...
...
       public Majordom()
		{
           [B]mConsol[/B]=new List<Console>();
		}

Потом при создании формы - форма туда добавляется.
Код:
...
            cname = "Consol" + lastConsole.ToString();
            Consol.Name = cname;
            Consol.Show();

            [B]mConsol[/B].Add(Consol);
...

Всё работает нормально. При закрытии Consolхх по крестику в её хедэре - элемент добросовестно исчезает и в коллекции.

Если я щелкаю по иконке в панели задач и закрываю из меню под правой кнопкой мыши - форма закрывается, но коллекция не чистится!!

Чем отличается одно закрытие от другого и как сделать, чтобы было корректно?
 
  • 🔴 10:24 Повітряна тривога в Харків.обл.
  • #2
Так делай в списке remove самостоятельно, в чем проблема
 
  • 🔴 10:24 Повітряна тривога в Харків.обл.
  • #3
Просто спрашиваю, чтобы разобраться в чем разница между удалением так и удалением сяк.
Проблема на самом деле есть - удалять придется в событии FormClose, откуда форма знает как её закрыли? Если закрыли из формы - в момент попытки удаления из коллекции - её уже там не будет. От этого ни чего не случится, но - а надо ли тогда вообще туда лезть? Может есть способ отловить?
 
  • 🔴 10:24 Повітряна тривога в Харків.обл.
  • #4
Если закрыли из формы - в момент попытки удаления из коллекции - её уже там не будет.

что-то вы странное говорите, с каких делов форма из коллекции удалится, если вы ее явно оттудова не удаляли? :confused:

Вообще по поводу форм следует понимать некоторые детали, при закрытии формы методом Close или по клику на крестик, окно свзанное с объектом формы уничтожается, хэндлы освобождаются и форму уже более невозможно показать. Т.к. форма реализует интерфейс IDisposable, ее после использования нужно отдиспозить.
Если закрывается форма переданная аргументом в Application.Run(), то цикл прокачки сообщений завершается и метод Run возвращает управление...
 
Останнє редагування:
  • 🔴 10:24 Повітряна тривога в Харків.обл.
  • #5
что-то вы странное говорите, с каких делов форма из коллекции удалится, если вы ее явно оттудова не удаляли? :confused:
Сам не знаю. Но так было - я в стартпосте написал в чем дело.
Хез - я заметил в отладчике, что в коллекции после закрытия формы на 1 элемент меньше становится.

Вообще по поводу форм следует понимать некоторые детали, при закрытии формы методом Close или по клику на крестик, окно свзанное с объектом формы уничтожается, хэндлы освобождаются и форму уже более невозможно показать. Т.к. форма реализует интерфейс IDisposable, ее после использования нужно отдиспозить.
Если закрывается форма переданная аргументом в Application.Run(), то цикл прокачки сообщений завершается и метод Run возвращает управление...
Пасибо, учту.

Про "отдиспозить" и передачу аргументом в Application.Run() непонятно, так как я в эту степь не залазил ещё.
 
  • 🔴 10:24 Повітряна тривога в Харків.обл.
  • #6
Сам не знаю. Но так было - я в стартпосте написал в чем дело.
Хез - я заметил в отладчике, что в коллекции после закрытия формы на 1 элемент меньше становится.

что-то ты напутал, сами по себе элементы коллекции никуда не исчезают ;)


Про "отдиспозить" и передачу аргументом в Application.Run() непонятно, так как я в эту степь не залазил ещё.

отдиспозить значит вызвать метод Dispose(), или заключить объект в конструкцию using (что по сути одно и то-же). Последний способ более удобен,т.к. Dispose будет вызван в любом случае, даже если произойдет исключение - не нужно оборачивать код в try/finally.
Любой объект который реализует интерфейс IDisposable, после использования должен быть освобожден с помощью вызова метода Dispose().

Application.Run получает аргументом форму, которая будет являться главным окном приложения, метод запускает цикл прокачки оконных сообщений и отображает форму. Когда эта форма закроется, цикл прокачки сообщений будет остановлен и функция Run вернет управление обратно.
 
  • 🔴 10:24 Повітряна тривога в Харків.обл.
  • #8
пардон, "locals/watch" - это у вас такая модель трактора?
 
Назад
Зверху Знизу