Распространённая проблема, с которой сталкиваются разработчики на Delphi, - это неожиданное поведение модальных форм, когда при закрытии формы возвращается значение mrCancel (2) вместо ожидаемого mrOk (1). Как показано в обсуждении, это происходит из-за неправильного подхода к закрытию формы.
Почему возникает проблема?
Основная причина проблемы заключается в том, что:
1. Для модальных форм вызов Close автоматически устанавливает ModalResult := mrCancel
2. Если сначала установить ModalResult := mrOk, а затем вызвать Close, результат будет перезаписан
3. Форма не закрывается автоматически при установке ModalResult, если она является главной формой приложения
Правильное решение
Для корректной работы модальной формы входа нужно:
Не вызывать Close явно - установка ModalResult достаточна для закрытия модальной формы
Убедиться, что форма действительно модальная - главная форма приложения не может быть закрыта таким способом
Использовать правильную последовательность действий
Пример правильного кода
procedure TFLogin.btnLoginClick(Sender: TObject);
begin
if (edtUsername.Text = 'admin') and (edtPassword.Text = 'admin') then
begin
ModalResult := mrOk; // Форма закроется автоматически
end
else
begin
ShowMessage('Неверные учетные данные');
edtPassword.Clear;
edtPassword.SetFocus;
end;
end;
Альтернативное решение
Если по каким-то причинам нужно явно закрыть форму, можно использовать следующий подход:
procedure TFLogin.btnLoginClick(Sender: TObject);
begin
if (edtUsername.Text = 'admin') and (edtPassword.Text = 'admin') then
begin
ModalResult := mrOk;
PostMessage(Handle, WM_CLOSE, 0, 0); // Закрытие через сообщение
Exit;
end;
// Остальной код...
end;
Правильная инициализация приложения
Как верно заметил автор вопроса, важно правильно инициализировать приложение в файле .lpr:
program MyApp;
uses
Forms,
ULogin in 'ULogin.pas' {FLogin},
UMain in 'UMain.pas' {FMain};
{$R *.res}
begin
Application.Initialize;
with TFLogin.Create(nil) do
try
if ShowModal = mrOk then
begin
Application.CreateForm(TFMain, FMain);
Application.Run;
end;
finally
Free;
end;
end.
Распространённые ошибки
Регистрация формы входа как главной формы - если форма создается через Application.CreateForm, она становится главной и не может быть корректно закрыта через ModalResult
Вызов Close после установки ModalResult - приводит к перезаписи значения
Отсутствие проверки на модальность формы - если форма не модальная, ModalResult не сработает
Заключение
Правильная обработка модальных форм в Delphi требует понимания механизма работы ModalResult. Основное правило: для модальных форм используйте только установку ModalResult, избегая явного вызова Close. Это обеспечит корректное поведение формы и возврат правильного значения из ShowModal.
Для более сложных сценариев можно использовать альтернативные подходы, такие как отправка сообщения WM_CLOSE или создание кастомных событий закрытия формы. Однако в большинстве случаев стандартного механизма с ModalResult достаточно для реализации функциональности формы входа.
Правильная обработка закрытия модальной формы в Delphi требует избегания явного вызова Close и использования только установки ModalResult для корректного возврата значения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.