Delphi/C++ Builder の MessageDlg をフォームの中央に表示

MessageDlg っぽくて、指定(メイン)フォームの中央に表示
(Formを MainForm 以外の中央に表示はこちら)

位置を指定できる MessageDlgPos が存在するものの、表示しようとしているダイアログのサイズが分からなければ、位置を決められないわけで...
  1. function MsgDlg(AMessage: string; DlgType: TMsgDlgType = mtInformation; Buttons: TMsgDlgButtons = [mbOK]; AForm: TForm = nil): TModalResult;  
  2. var ARect: TRect;  
  3.     MsgForm: TForm;  
  4. begin  
  5.     if (AForm = nilthen begin  
  6.         if (Application.MainForm <> nilthen begin  
  7.             GetWindowRect(Application.MainForm.Handle, ARect);  
  8.         end  
  9.         else begin  
  10.             Result := MessageDlg(AMessage, DlgType, Buttons, 0);  
  11.             Exit;  
  12.         end;  
  13.     end  
  14.     else begin  
  15.         GetWindowRect(AForm.Handle, ARect);  
  16.     end;  
  17.   
  18.     MsgForm := CreateMessageDialog(AMessage, DlgType, Buttons);  
  19.     try  
  20.         MsgForm.Top := ARect.Top + (ARect.Bottom - ARect.Top - MsgForm.Height) div 2;  
  21.         MsgForm.Left := ARect.Left + (ARect.Right - ARect.Left - MsgForm.Width) div 2;  
  22.         // MoveMouseCursorToDefaultButton(MsgForm);  
  23.         Result := MsgForm.ShowModal;  
  24.     finally  
  25.         MsgForm.Free;  
  26.     end;  
  27. end;  
既定のボタンへカーソルを移動するには、MoveMouseCursorToDefaultButton 関数を併用します



デフォルトが設定されているので、メインフォーム中央の場合、フォームを指定する必要はありません
  1. MsgDlg('処理が完了しました'); // Information アイコンで OK ボタンのみ  
みたいに利用します

コメント