Вопрос, который вы задали, касается закрытия дочернего окна в приложении с многооконным интерфейсом (MDI) в Delphi, используя стандартную кнопку, расположенную внутри самого дочернего окна. Вы столкнулись с проблемой возникновения исключения доступа при попытке закрыть окно, вызывая метод Close. Давайте разберемся, как можно решить эту проблему.
Описание проблемы
Вы успешно закрываете дочернее окно в MDI-приложении, используя системную кнопку "Закрыть". Однако, когда вы пытаетесь закрыть окно, вызвав метод Close из обработчика события стандартной кнопки, расположенной внутри дочернего окна, возникает исключение доступа.
Подтвержденный ответ
Вызов метода Close на дочернем MDI-окне из обработчика события кнопки OnClick является безопасной операцией. Внутренне, метод Close запускает обработчик события OnClose, и если параметр Action устанавливается в значение caFree, то окно вызовет метод Release над собой. Это действие освобождения ресурсов окна будет выполнено в безопасное время, когда это станет возможным.
Пример кода, который корректно закрывает дочернее окно:
unit ChildUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TChildForm = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
var
ChildForm: TChildForm;
implementation
{$R *.dfm}
procedure TChildForm.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
Если при вызове Close возникает исключение доступа, скорее всего, проблема заключается в том, что вы пытаетесь закрыть окно, используя недействительный указатель. Убедитесь, что переменная, через которую вы вызываете Close, действительно указывает на существующее окно.
Альтернативный ответ
В качестве альтернативы можно использовать Self.Close или просто Close, если уверены, что указатель на окно корректен. Если вы сталкивались с исключениями ранее, возможно, проблема была в некорректном обращении к объекту формы. Проверьте, что переменная, через которую вы пытаетесь закрыть форму, действительно ссылается на объект формы, который был создан и инициализирован.
Заключение
Использование метода Close для закрытия дочернего окна MDI в Delphi из обработчика события кнопки - это стандартная и безопасная операция, если указатель на окно корректен. Убедитесь, что вы работаете с правильным объектом, и тогда проблем с закрытием окна возникнуть не должно.
Проблема заключается в закрытии дочернего окна MDI-приложения в Delphi через стандартную кнопку внутри окна, когда возникает исключение доступа при вызове метода `Close`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.