Search code examples
windowsdelphiwinapimdi

How to hide a MDI Child form in Delphi?


How can I hide a MDIChild window in Delphi?

I'm using this code in FormClose() event of my MDI children, but it doesn't seem to work:

procedure TfrmInstrument.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone;
  ShowWindow(Handle, SW_HIDE);
  frmMainForm.MDIChildClosed(Handle);
end;

My child window is minimized instead of being hidden.


Solution

  • There is a protected procedure in TCustomForm defined as:

    procedure TCustomForm.VisibleChanging;
    begin
      if (FormStyle = fsMDIChild) and Visible and (Parent = nil) then
        raise EInvalidOperation.Create(SMDIChildNotVisible);
    end;
    

    Override it in your MDI child windows as:

    procedure TMDIChildForm.VisibleChanging;
    begin
      // :-P
    end;
    

    Here's a simple example

    After reading Jeroen's comment, I tried another solution which works as well, but with a little flickering:

    procedure TMDIChildForm.VisibleChanging;
    begin
      if Visible then
        FormStyle := fsNormal
      else
        FormStyle := fsMDIChild;
    end;
    

    Maybe this works on all Windows versions.

    PS: I didn't find any problem with the first solution on Windows 2k3SP2 x86 and Windows 7 Ultimate x86