Такая запутанная система нужна из-за того, что если я в дочерней форме вызываю CLOSE; не из того места, то ломается стек, происходит ошибка 210 и т.д. Закрытие дочерней формы требует чтобы человек явно кликнул мышкой или по энтеру, нажал на крестик в заголовке формы, а если запрограммировать то же самое по нажатию эскейпа, то получите баг.
Добавлено спустя 43 минуты 18 секунд:
Обнаружил как обойти проблему. Вот такой обработчик стек не ломает:
- Код: Выделить всё
- procedure TForm9.Button1KeyPress(Sender: TObject; var Key: char);
 begin
 IF ORD(KEY)=27 THEN CLOSE;
 end;
А в procedure TForm9.Button1KeyDown практически тоже самое - ломает.






 А правильно, это так понимаю, послать сообщение на главную форму через глобальную переменную, где её отловит Timer и сделает переменной через которую запускали окно Close, а потом Free, чтобы память не текла. Конечно, в консоли будет много ругани, но потребление памяти при включениях/выключениях окна стабилизируется на какой-то цифре, а не ползёт постоянно вверх. Вроде рабочий вариант. Тогда, что там рядом с Timer за "хрен с горы" IdleTimer? Вроде похожий компонент, но свойства у него непонятные - применишь его и сработает неизвестно когда как не так как ожидалось.
 А правильно, это так понимаю, послать сообщение на главную форму через глобальную переменную, где её отловит Timer и сделает переменной через которую запускали окно Close, а потом Free, чтобы память не текла. Конечно, в консоли будет много ругани, но потребление памяти при включениях/выключениях окна стабилизируется на какой-то цифре, а не ползёт постоянно вверх. Вроде рабочий вариант. Тогда, что там рядом с Timer за "хрен с горы" IdleTimer? Вроде похожий компонент, но свойства у него непонятные - применишь его и сработает неизвестно когда как не так как ожидалось.