Search code examples
delphidelphi-2010

How to make MessageDlg centered on owner form


I'd like that MessageDlg appear centered on its parent form. Any suggestions on how to accomplish this in Delphi 2010?

I found the code below here: http://delphi.about.com/od/formsdialogs/l/aa010304a.htm but it's not working for me. The pop-up still is not centered on the owner form. (It's not clear to me how the method would actually know the owner form...)

 function TForm1.MessageDlg(const Msg: string; DlgType: TMsgDlgType;
   Buttons: TMsgDlgButtons; HelpCtx: Integer): Integer;
 begin
   with CreateMessageDialog(Msg, DlgType, Buttons) do
     try
       Position := poOwnerFormCenter;
       Result := ShowModal
     finally
       Free
     end
 end;

Solution

  • You can do

    function MessageDlg(const AOwner: TForm; const Msg: string; DlgType: TMsgDlgType;
      Buttons: TMsgDlgButtons; HelpCtx: Integer = 0): Integer;
    begin
      with CreateMessageDialog(Msg, DlgType, Buttons) do
        try
          Left := AOwner.Left + (AOwner.Width - Width) div 2;
          Top := AOwner.Top + (AOwner.Height - Height) div 2;
          Result := ShowModal;
        finally
          Free;
        end
    end;
    

    and call it like

    procedure TForm1.FormClick(Sender: TObject);
    begin
      MessageDlg(Self, 'This is a test', mtInformation, [mbOK]);
    end;
    

    However, I would personally not do this, because the dialog shown by CreateMessageDialog is not a native Windows dialog. Compare the visual result with the native stuff:

    procedure TForm1.FormClick(Sender: TObject);
    begin
      case MessageBox(Handle, PChar('This is a test. Do you wish to do something?'), PChar('A Silly Example'), MB_ICONQUESTION or MB_YESNO) of
        ID_YES:
          MessageBox(Handle, PChar('Great!'), PChar('A Silly Example'), MB_ICONINFORMATION or MB_OK);
        ID_NO:
          MessageBox(Handle, PChar('OK, well, I cannot force you...'), PChar('A Silly Example'), MB_ICONINFORMATION or MB_OK);
      end;
    end;
    

    At least in Windows 7 with the Aero theme enabled, the native dialog looks much better. However, it seems, this cannot be centered over any particular form. Instead, the dialog is centered on the current monitor. But this is also the default behaviour in Windows (try Notepad, WordPad, or Paint), so why do you need this new behaviour?