【Delphi】MessageDlg() でアイコンが表示されない

# はじめに
12 Athens で `MessageDlg()` を使うと `mtInformation` や `mtConfirmation` を指定したダイアログでアイコンが表示されません。

```pascal
  MessageDlg('Hello,world.', TMsgDlgType.mtWarning     , [mbOK], -1);
  MessageDlg('Hello,world.', TMsgDlgType.mtError       , [mbOK], -1);
  MessageDlg('Hello,world.', TMsgDlgType.mtInformation , [mbOK], -1);
  MessageDlg('Hello,world.', TMsgDlgType.mtConfirmation, [mbOK], -1);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6f0c3796-f16f-482f-9070-4c4463fc014b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/400eeecc-839f-47e2-931e-387e33a84714.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/72f9aa77-a314-408d-afd1-e965a990458f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8300278a-39aa-401f-b24d-febd24c66c73.png)

**See also:**

 - [Vcl.Dialogs.MessageDlg (DocWiki)](https://docwiki.embarcadero.com/Libraries/ja/Vcl.Dialogs.MessageDlg)

# 背景
要は Microsoft のガイドラインに基づく変更で「**確認ダイアログにアイコンを使うな！**」という事らしいです。

 - [Confirmations (learn.microsoft.com)](https://learn.microsoft.com/en-us/windows/win32/uxguide/mess-confirm)

## 従来の挙動に戻すには

アイコンを従来の挙動に戻すにはグローバル配列変数 **MsgDlgIcons[]** を操作します。

 - [Vcl.Dialogs.MsgDlgIcons (DocWiki)](https://docwiki.embarcadero.com/Libraries/ja/Vcl.Dialogs.MsgDlgIcons)

12 Athens では初期状態で次のように設定されているので、

| TMsgDlgType | TMsgDlgIcon |
|:---|:---|
| mtWarning | mdiWarning |
| mtError  | mdiError  |
| mtInformation  | mdiNone |
| mtConfirmation  | mdiNone |
| mtCustom | mdiNone |

11.3 Alexandria 相当にするには次のコードを追加します。

```pascal
  MsgDlgIcons[TMsgDlgType.mtInformation]  := TMsgDlgIcon.mdiInformation;
  MsgDlgIcons[TMsgDlgType.mtConfirmation] := TMsgDlgIcon.mdiWarning;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6f0c3796-f16f-482f-9070-4c4463fc014b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/400eeecc-839f-47e2-931e-387e33a84714.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b68b13cc-2a11-4ff1-ad24-158411207ac2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6c7a5781-d78e-42cd-9e0c-8d2b811bb690.png)

11.2 Alexandria 相当にするには次のコードを追加します。

```pascal
  MsgDlgIcons[TMsgDlgType.mtInformation]  := TMsgDlgIcon.mdiInformation;
  MsgDlgIcons[TMsgDlgType.mtConfirmation] := TMsgDlgIcon.mdiInformation;
```

:::note
この問題は UseLatestCommonDialogs を False に設定しても解決しません。
:::

**See also:**

 - [Vcl.Dialogs.UseLatestCommonDialogs (DocWiki)](https://docwiki.embarcadero.com/Libraries/ja/Vcl.Dialogs.UseLatestCommonDialogs)

## 昔話

Windows 3.1 のダイアログとアイコンです。アイコンの色はすべて異なっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/41fc2462-6863-40af-b422-5652e0278d2b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/99cc15b0-8bf6-43fc-9a85-81b3ca4193be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c46b9764-f97a-4f33-a1f3-ed610b0fcde9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d2af03d2-9c65-4d86-9054-dccfbb7523fa.png)


# おわりに
いや、アイコンあった方がよくない？前も似たような理由で疑問符アイコン無くした [^1] よね？

**See also:**

 - [標準アイコン (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/windows/win32/uxguide/vis-std-icons)
 - [Windows XPとWindows Vistaのメッセージ系ダイアログを画面キャプチャで比較 (山本隆の開発日誌)](https://www.gesource.jp/weblog/?p=4482)
 - [【Delphi】メッセージボックス表示時にデフォルトボタンを指定 (Migaro. 技術Tips)](https://www.migaro.co.jp/tips/3121/)

[^1]: Windows Vista 以降のガイドライン