При закрытии приложения в форме запускается событие

Мое приложение порождает несколько независимых форм. Однажды при создании приложение о них забывает. Все действия обрабатываются в этой форме. Когда приложение закрывается, форма также закрывается, я полагаю, RTS. Это нормально, за исключением того, что ни событие OnClose, ни событие OnDestroy не запускаются, поэтому происходят утечки памяти. Я могу управлять, какие формы присутствуют (как я делаю сейчас), но на самом деле приложение должно полностью забыть об этих формах.

Есть ли способ определить внутри формы, которая не является основной формой приложения, что приложение находится в процессе закрытия?


person Arnold    schedule 25.01.2012    source источник
comment
Даже если dtor для формы не вызывается (например, код вызывает 'halt' или ExitProcess ()), не должно быть утечек памяти, если приложение завершает работу - ОС будет поглощать формы, если ничего не произойдет. Кроме того, вы должны очень постараться, чтобы не вызвать вызов Destroy - приложение хранит список форм и уничтожает их все при закрытии приложения.   -  person Martin James    schedule 25.01.2012
comment
@ Мартин, не надо сильно стараться, просто забывчивый. Я создал форму с nil в качестве аргумента Create. Ответ Дэвида напомнил мне, что это была не такая уж хорошая идея :-)   -  person Arnold    schedule 25.01.2012


Ответы (1)


Событие OnDestroy обязательно сработает, если форма будет уничтожена. Он вызывается из кода уничтожения формы. Итак, единственный вывод - ваша форма не уничтожается, а значит, утечка.

Есть несколько очевидных способов убедиться, что ваши независимые формы не просочились:

  1. При создании затем передайте Application или MainForm в качестве параметра владельца формы. Когда владелец будет уничтожен, он также уничтожит все, что ему принадлежит, включая ваши формы.
  2. Явно уничтожьте эти формы, например, из деструктора основной формы или файла .dpr после возврата из вызова Application.Run.

Вариант 1 - наиболее часто используемый подход.

person David Heffernan    schedule 25.01.2012
comment
@DavidHeffeman, ваше первое решение решило мою проблему. Большое спасибо! - person Arnold; 25.01.2012