При разработке приложений на Delphi иногда возникают ситуации, когда модальное окно не закрывается после нажатия на кнопку, несмотря на то, что обработчик события кнопки установливает свойство ModalResult в значение mrOk. Давайте разберемся в этой проблеме и найдем решение.
Описание проблемы
Проблема заключается в том, что установка свойства ModalResult кнопки происходит слишком поздно, чтобы это действие привело к закрытию модального окна. В коде обработчика события клика по кнопке TCustomButton сначала проверяется свойство ModalResult формы, а уже потом вызывается обработчик клика, установленный пользователем. Таким образом, если установка свойства ModalResult кнопки происходит в ее обработчике, то форма уже не сможет "услышать" это изменение.
Пример кода
Вот пример кода, который демонстрирует проблему:
Unit1:
procedure TForm1.Button1Click(Sender: TObject);
var
F: TForm;
begin
F := TForm2.Create(nil);
try
F.ShowModal;
finally
F.Free;
end;
end;
Unit2:
procedure TForm2.Button1Click(Sender: TObject);
begin
Button1.ModalResult := mrOk;
end;
При запуске приложения и нажатии на кнопку на первой форме, модальное окно отображается, но после нажатия на кнопку на второй форме, окно не закрывается, так как установка свойства ModalResult происходит слишком поздно.
Подтвержденный ответ
Чтобы решить данную проблему, необходимо установить свойство ModalResult непосредственно для формы, а не для кнопки. В коде обработчика события клика по кнопке на второй форме можно использовать следующий код:
procedure TForm2.Button1Click(Sender: TObject);
begin
Self.ModalResult := mrOk;
end;
Используя Self (или Form в зависимости от версии Delphi), мы получаем ссылку на текущую форму и устанавливаем ее свойство ModalResult, что приводит к закрытию модального окна.
Альтернативный ответ
Также можно использовать метод GetParentForm(TControl(Sender)), который возвращает ссылку на родительскую форму, то есть модальное окно, и установить свойство ModalResult для нее:
procedure TForm2.Button1Click(Sender: TObject);
var
Form: TCustomForm;
begin
Form := GetParentForm(TControl(Sender));
if Form <> nil then
Form.ModalResult := mrOk;
end;
Этот подход также позволяет корректно закрыть модальное окно.
Заключение
Используя один из предложенных способов, вы сможете устранить ошибку закрытия модального окна в приложении на Delphi. Важно помнить, что установка свойства ModalResult должна производиться непосредственно для формы, а не для кнопки, чтобы гарантировать корректное закрытие модального окна.
Проблема заключается в неправильной установке свойства `ModalResult` для корректного закрытия модального окна в приложении на Delphi, когда это действие выполняется для кнопки вместо самой формы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS