При разработке программ на 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;
позволит корректно скрыть основную форму и показать форму благодарности перед закрытием программы.
Альтернативные ответы
Можно использовать обработчик события OnClose основной формы, но убедиться, что вторая форма показывается с использованием ShowModal, чтобы она не закрылась немедленно при завершении работы основной формы.
В качестве альтернативы, можно вызвать процедуру, которая создает, показывает и уничтожает форму благодарности, после завершения основного цикла Application.Run в файле DPR:
class procedure TThankYouForm.Execute;
begin
with Create(nil) do try
ShowModal;
finally
Free;
end;
end;
Еще один вариант — поместить код в обработчик события OnCloseQuery основной формы и установить canClose := False, пока не будет готово закрыть основную форму.
Важные замечания
Убедитесь, что изменение видимости формы не происходит в обработчиках событий OnShow или OnHide, что может вызвать исключение.
Показ финальной формы может быть опциональным, и его поведение следует делать настраиваемым.
При возникновении ошибок, полезно использовать отладочные версии модулей (DCUs) и устанавливать точку останова на строке, вызывающей исключение, чтобы исследовать стек вызовов.
Заключение
Правильное использование обработчиков событий и понимание жизненного цикла форм в Delphi позволяет корректно отобразить финальную форму при закрытии программы. Важно внимательно проанализировать свой код и убедиться, что все вызовы и изменения состояния форм выполняются в правильном порядке.
Разработчик программы на Delphi сталкивается с проблемой корректного показа финальной формы с благодарностью при закрытии основной формы, возникает исключение из-за неправильного порядка вызовов и изменения видимости форм.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS