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

Отслеживание закрытия всех дочерних форм в MDI приложении на Delphi

Delphi , Программа и Интерфейс , MDI приложения

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

Решение проблемы

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

type
  TForm1 = class(TForm)
    ...
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation);
    override;
  end;

procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if (Operation = opRemove) and (AComponent is TForm) and
    (TForm(AComponent).FormStyle = fsMDIChild) and
    (MDIChildCount = 0) then begin
    // здесь можно выполнить необходимые действия
  end;
end;

Второй способ заключается в перехвате сообщения WM_MDIDESTROY, которое отправляется окну клиента MDI при его уничтожении. В обработчике этого сообщения можно проверить, остались ли еще открытые дочерние формы, и выполнить нужные действия.

type
  TForm1 = class(TForm)
    ...
  private
    FOldClientWndProc: TFarProc;
    procedure NewClientWndProc(var Message: TMessage);
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if FormStyle = fsMDIForm then
  begin
    HandleNeeded;
    FOldClientWndProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
    SetWindowLong(ClientHandle, GWL_WNDPROC,
      Integer(MakeObjectInstance(NewClientWndProc)));
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetWindowLong(ClientHandle, GWL_WNDPROC, Integer(FOldClientWndProc));
end;

procedure TForm1.NewClientWndProc(var Message: TMessage);
begin
  if Message.Msg = WM_MDIDESTROY then
    if MDIChildCount = 1 then
      // здесь можно выполнить необходимые действия
  with Message do
    Result := CallWindowProc(FOldClientWndProc, ClientHandle, Msg, WParam, LParam);
end;

Третий способ заключается в назначении обработчика события OnClose или OnDestroy для каждого дочернего окна MDI, которое создается основной формой. В обработчике можно проверить, остались ли еще открытые дочерние формы, и при отсутствии таковых выполнить нужные действия.

procedure TMainForm.ChildClosed(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  // здесь дочернее окно еще в списке MDIChild, но уже не доступно...
  if MDIChildCount = 0 then
    // здесь можно выполнить необходимые действия
end;

Или же, используя пользовательское сообщение, можно проверить наличие дочерних окон MDI:

const
  APPWM_CHECK_MDI_CHILDREN = WM_APP + 1;

procedure TMainForm.ChildDestroyed(Sender: TObject);
begin
  PostMessage(Handle, APPWM_CHECK_MDI_CHILDREN, 0, 0);
end;

procedure TMainForm.WndProc(var Message: TMessage);
begin
  if Message.Msg = APPWM_CHECK_MDI_CHILDREN then
  begin
    if MDIChildCount = 0 then
      // здесь можно выполнить необходимые действия
    Exit;
  end;
  inherited;
end;

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

Пользователи отметили, что предложенные решения являются эффективными. В частности, способ с использованием уведомлений был признан более мощным, но для простоты решения в данной ситуации лучше подходит метод, предложенный Sertac Akyuz.

Заключение

Выбор метода зависит от конкретных требований приложения и предпочтений разработчика. Все предложенные способы позволяют отслеживать закрытие всех дочерних форм в MDI приложении на Delphi и выполнить необходимые действия.

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

Отслеживание закрытия всех дочерних форм в MDI приложении на Delphi может быть выполнено с помощью различных подходов, включая использование механизма уведомлений, перехват сообщений системного уровня или назначение обработчиков событий для дочерних форм


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

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




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


:: Главная :: MDI приложения ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-15 07:57:18/0.0061640739440918/0