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

Статус: Offline
Реєстрація: 17.08.2005
Повідом.: 48736
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #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хх по крестику в её хедэре - элемент добросовестно исчезает и в коллекции.

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

Чем отличается одно закрытие от другого и как сделать, чтобы было корректно?
 
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #2
Так делай в списке remove самостоятельно, в чем проблема
 
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #3
Просто спрашиваю, чтобы разобраться в чем разница между удалением так и удалением сяк.
Проблема на самом деле есть - удалять придется в событии FormClose, откуда форма знает как её закрыли? Если закрыли из формы - в момент попытки удаления из коллекции - её уже там не будет. От этого ни чего не случится, но - а надо ли тогда вообще туда лезть? Может есть способ отловить?
 
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #4

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

Вообще по поводу форм следует понимать некоторые детали, при закрытии формы методом Close или по клику на крестик, окно свзанное с объектом формы уничтожается, хэндлы освобождаются и форму уже более невозможно показать. Т.к. форма реализует интерфейс IDisposable, ее после использования нужно отдиспозить.
Если закрывается форма переданная аргументом в Application.Run(), то цикл прокачки сообщений завершается и метод Run возвращает управление...
 
Останнє редагування:
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #5
Сам не знаю. Но так было - я в стартпосте написал в чем дело.
Хез - я заметил в отладчике, что в коллекции после закрытия формы на 1 элемент меньше становится.

Пасибо, учту.

Про "отдиспозить" и передачу аргументом в Application.Run() непонятно, так как я в эту степь не залазил ещё.
 
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #6

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



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

Application.Run получает аргументом форму, которая будет являться главным окном приложения, метод запускает цикл прокачки оконных сообщений и отображает форму. Когда эта форма закроется, цикл прокачки сообщений будет остановлен и функция Run вернет управление обратно.
 
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #7
  • 🟡 14:12 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #8
пардон, "locals/watch" - это у вас такая модель трактора?