Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отображение финальной формы в Delphi: корректное закрытие программы

Delphi , Программа и Интерфейс , Формы

При разработке программ на Delphi часто возникает задача показа финальной формы с благодарностью при закрытии основной формы. Вопрос может показаться простым, но иногда возникают непредвиденные ошибки, которые мешают корректному выполнению такой задачи.

Описание проблемы

В процедуре ExitExecute основной формы TMainForm пользователь пытается скрыть основную форму и показать форму благодарности:

procedure TMainForm.ExitExecute(Sender: TObject);
begin
  MainForm.Visible := False;
  ThankYouForm.Show;
  MainForm.Close;
end;

Однако при выполнении этого кода возникает исключение:

EInvalidOperation: Cannot change Visible in OnShow or OnHide

Пользователь не может понять, как корректно отобразить финальную форму, скрывая при этом основную форму при закрытии программы.

Подходы к решению

Подтвержденный ответ

Мгхие подтвердил, что подход пользователя был верным, но проблема заключалась в ошибке в процедурах выхода и закрытия форм, что и вызывало исключение. После исправления этих процедур, использование следующего кода:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
  Action := caFree;
end;

или

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(Application) do
    ShowModal;
  Action := caFree;
end;

позволит корректно скрыть основную форму и показать форму благодарности перед закрытием программы.

Альтернативные ответы

  1. Можно использовать обработчик события OnClose основной формы, но убедиться, что вторая форма показывается с использованием ShowModal, чтобы она не закрылась немедленно при завершении работы основной формы.

  2. В качестве альтернативы, можно вызвать процедуру, которая создает, показывает и уничтожает форму благодарности, после завершения основного цикла Application.Run в файле DPR:

class procedure TThankYouForm.Execute;
begin
  with Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
end;
  1. Еще один вариант — поместить код в обработчик события OnCloseQuery основной формы и установить canClose := False, пока не будет готово закрыть основную форму.

Важные замечания

  • Убедитесь, что изменение видимости формы не происходит в обработчиках событий OnShow или OnHide, что может вызвать исключение.
  • Показ финальной формы может быть опциональным, и его поведение следует делать настраиваемым.
  • При возникновении ошибок, полезно использовать отладочные версии модулей (DCUs) и устанавливать точку останова на строке, вызывающей исключение, чтобы исследовать стек вызовов.

Заключение

Правильное использование обработчиков событий и понимание жизненного цикла форм в Delphi позволяет корректно отобразить финальную форму при закрытии программы. Важно внимательно проанализировать свой код и убедиться, что все вызовы и изменения состояния форм выполняются в правильном порядке.

Создано по материалам из источника по ссылке.

Разработчик программы на Delphi сталкивается с проблемой корректного показа финальной формы с благодарностью при закрытии основной формы, возникает исключение из-за неправильного порядка вызовов и изменения видимости форм.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Формы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-11 00:46:31/0.0034050941467285/0