У меня есть основная форма и другая, «вторичная» форма. Если я сначала закрываю вторичный, вызывается его обработчик OnClose
. К сожалению, если я сначала закрываю основную форму, приложение завершается, а OnClose
вторичного вызова не вызывается. Это проблема, потому что я хочу сохранить позицию и размер каждой формы до того, как они будут закрыты. Как я могу это решить?Delphi - обработчик OnClose вторичной формы не называется
ответ
Удобное место для обработки это будет OnCloseQuery
событие основной формы.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i : integer;
begin
CanClose := true;
if Application.MainForm = self then begin
CanClose := MessageDlg('Close the application?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes;
if CanClose then
for i := 0 to Screen.FormCount - 1 do
if Screen.Forms[i] <> self then Screen.Forms[i].Close;
end;
end;
Первая проверка, предложенная выше, полезна только в том случае, если у вас есть несколько экземпляров используемой основной формы. Вторая проверка для self
необходима для предотвращения повторного входа.
Вы можете использовать OnDestroy вместо OnClose, чтобы сохранить это. И вы, вероятно, следует уничтожить вторичную форму после того, как он будет закрыт (создание перед открытием):
Form2 := TForm2.Create(Application);
Form2.Open;
И в Form2.OnClose:
Action := caFree;
Вы также хотите, чтобы удалить строки в .dpr который автоматически создает вторичные формы:
Application.CreateForm(TForm2, Form2);
И, возможно, отключите это автообнаружение. В D7: Инструменты >> Параметры среды >> Дизайнер >> Отключить «Автосоздание ...»
Выполнение всего этого позволит вам сохранить некоторую память. Также рассмотрите возможность использования ShowModal вместо Show, когда вы ожидаете, что пользователь закроет вашу вторичную форму, прежде чем вернуться к основному.
Спасибо, 'OnDestroy' всегда вызывается. Единственная проблема заключается в том, что я хочу также сохранить видимость, но 'Visible' всегда' False' в 'OnDestroy' :( – kol
Невозможно вызывать OnDestroy. Подробности: https://groups.google.com/forum /#!msg/borland.public.delphi.objectpascal/82AG0_kHonU/ft53lAjxWRMJ – Ampere
- 1. Обработчик события не называется
- 2. Обработчик завершения не называется
- 3. Событие DockPanel, TForm и OnClose в Delphi
- 4. Ускорители Delphi TActionMainMenu на вторичной форме
- 5. Сохранение значений вторичной формы
- 6. keyValueObservingExpectationForObject обработчик блок не называется
- 7. Обработчик событий не всегда называется
- 8. dismissViewController обработчик завершения не называется
- 9. Delphi - Назначить форму OnClose на существующей
- 10. обработчик async_read_until дважды называется
- 11. Кнопки формы родителя Delphi
- 12. Обновление основной формы после закрытия вторичной формы
- 13. Обновление вторичной формы без потери фокуса основной формы
- 14. Override OnClose()
- 15. Knockout X-Редактируемый обработчик успеха не называется
- 16. Обработчик обратного вызова Android не называется
- 17. Почему обработчик плагина eclipse не называется?
- 18. JavaFX: обработчик TableView onEditCommit никогда не называется
- 19. Q обещание цепочки, обработчик ошибок не называется
- 20. Обработчик ошибки JQuery ajax не называется
- 21. Swift 3 - обработчик завершения не называется
- 22. Обработчик URLLoader в дочернем фильме не называется
- 23. Почему обработчик события «focusin» не называется?
- 24. Primefaces 4 обработчик fileUpload не называется
- 25. Почему мой обработчик сигнала не называется?
- 26. Обработчик завершения обработки Alamofire не называется
- 27. Ловушка onClose событие для объекта инстанцируемой формы
- 28. Может ли компонент заменить событие своего владельца (OnClose) на свой собственный обработчик?
- 29. Datepicker - onClose не работает
- 30. Fancybox onClose не работает
Спасибо, я выбрал этот подход, потому что мне нужно также сохранить свойство 'Visible'. Это всегда' False' в 'OnDestroy', но оно имеет правильное значение, когда вызывается обработчик 'OnCloseQuery' основной формы. – kol
Нет гарантии, что OnCloseQuery будет вызываться. Подробности: https://groups.google.com/forum/#!msg/borland.public.delphi. objectpascal/82AG0_kHonU/ft53lAjxWRMJ – Ampere
@NAZCA Нет, он не будет вызываться, если программа вызывает 'Application.Terminate' - предположительно, если вы это делаете, это потому, что вы действительно хотите, чтобы приложение немедленно прекратилось. Работа с принудительным завершением во время окон остановка - это другой вопрос в целом, и их следует обрабатывать отдельно. См. Http://stackoverflow.com/q/10745151/327083 –