ホーム >プログラム >Delphi 6 ローテクTips >Unicode対応MessageBox

メッセージを出力させるMessageBoxもこの際なのでUnicode対応に。


ソースコード


function gfniMessageBox(const sWMsg, sWTitle: WideString; const iStyle: UINT): Integer;
//Unicode対応のMessageBox。
begin
  Result := MessageBoxW(Application.Handle, PWideChar(sWMsg), PWideChar(sWTitle), iStyle or MB_SETFOREGROUND);
end;

この関数をベースにしてiStyleにオプションを追加して実現します。
iStyleには以下の値をorで結合して指定します。
※MessageDlg関数で指定するmbYesやmbYesNoなどではないことに注意。
※MB_SETFOREGROUNDはこの関数でデフォルトで指定されます。

意味
MB_OK [OK]ボタン。
MB_OKCANCEL [OK]ボタンと[キャンセル]ボタン。
MB_YESNO [はい]と[いいえ]の2つのボタン。
MB_YESNOCANCEL [はい]、[いいえ]、[キャンセル]の3つのボタン。
MB_RETRYCANCEL [再試行]ボタンと[キャンセル]ボタン。
MB_ABORTRETRYIGNORE [中止]、[再試行]、[無視]の3つのボタン。

MB_DEFBUTTON1 最初のボタンがデフォルト。
MB_DEFBUTTON2、MB_DEFBUTTON3を指定しなければ最初のボタンが常にデフォルト。
MB_DEFBUTTON2 2番目のボタンがデフォルト。
MB_DEFBUTTON3 3番目のボタンがデフォルト。

MB_ICONEXCLAMATION 感嘆符アイコンを表示。
MB_ICONQUESTION 疑問符アイコンを表示。
MB_ICONINFORMATION 円の中に小文字の「i」があるアイコンを表示。
MB_ICONSTOP 「STOP」アイコンを表示。

MB_SYSTEMMODAL すべてのアプリケーションはユーザーがメッセージボックスに応答するまで中断されます。
アプリケーションがMB_ICONHANDを指定しなければメッセージボックスは生成の処理が完了するまでにはモーダルになりません。このためオーナー ウィンドウやそのほかのウィンドウはメッセージボックスのアクティブ化によるメッセージを受け取り続けます。システムモーダルメッセージボックスはすぐに対応を求められるような重大で潜在的な危険性のあるエラー (メモリ不足など) をユーザーに通知するために使用してください。
MB_TASKMODAL 第一引数がnilの時、現在のタスクに属するすべてのトップ レベル ウィンドウが使用不能になることを除いてMB_APPLMODALと同じです。
呼び出し側のアプリケーションやライブラリが使用可能なウィンドウのハンドルを持たず、ほかのアプリケーションを中断せずに現在のアプリケーションのほかのウィンドウへの入力を阻止しなければならないときには、このフラグを使用してください。
MB_APPLMODAL 第一引数のウィンドウ内で作業を継続する前に、メッセージボックスに応答しなければなりません。
しかし他のアプリケーションのウィンドウに移動しそのウィンドウ内で作業することはできます。MB_SYSTEMMODAL、MB_TASKMODALを指定しなければMB_APPLMODALがデフォルトです。
MB_SETFOREGROUND メッセージボックスは前景ウィンドウになります。
MB_DEFAULT_DESKTOP_ONLY 現在入力を受け取るデスクトップは、 デフォルトのデスクトップでなければなりません。それ以外の場合には関数が失敗します。
デフォルトのデスクトップはユーザーがログオンした後でアプリケーションが動作するデスクトップです。

戻り値には以下の値が返ります。 
※mbOKやmbYesではないことに注意。

意味
IDYES [はい]ボタンを選択。
IDNO [いいえ]ボタンを選択。
IDOK [OK]ボタンを選択。
IDCANCEL [キャンセル]ボタンを選択。
IDABORT [中止]ボタンを選択。
IDIGNORE [無視]ボタンを選択。
IDRETRY [再試行]ボタンを選択。
procedure gpcMessageBox(const sWMsg, sWTitle: WideString); overload;
//Unicode版Application.MessageBox。
begin
  gfniMessageBox(sWMsg, sWTitle, MB_OK);
end;

procedure gpcShowMessage(const sWMsg: WideString);
//Unicode対応ShowMessage。
begin
  gfniMessageBox(sWMsg, gfnsExeNameGet, MB_OK);
end;

function gfniMessageBoxYesNo(const sWMsg, sWTitle: WideString): Integer;
//Unicode対応MessageBox。YesとNoボタン。
begin
  Result := gfniMessageBox(sWMsg, sWTitle, MB_YESNO or MB_APPLMODAL{ or MB_ICONQUESTION});
end;

function gfniMessageBoxYesNoCancel(const sWMsg, sWTitle: WideString): Integer;
//Unicode対応MessageBox。YesとNoとCancelボタン。
begin
  Result := gfniMessageBox(sWMsg, sWTitle, MB_YESNOCANCEL or MB_APPLMODAL{ or MB_ICONQUESTION});
end;

unit myMessageBox;

interface
uses
  Windows;

//MessageBox
function gfniMessageBox(const sWMsg, sWTitle: WideString; const iStyle: UINT): Integer;

//ShowMessage
procedure gpcShowMessage(const sWMsg: WideString); overload;
procedure gpcShowMessage(const sWMsg, sWTitle: WideString); overload;

//Application.MessageBox
procedure gpcMessageBox(const sWMsg: WideString); overload;
procedure gpcMessageBox(const sWMsg, sWTitle: WideString); overload;
procedure gpcMessageBox(const sWMsg, sWTitle: WideString; const iStyle: UINT); overload;

//YesボタンとNoボタン
function gfniMessageBoxYesNo(const sWMsg: WideString): Integer; overload;
function gfniMessageBoxYesNo(const sWMsg, sWTitle: WideString): Integer; overload;
function gfniMessageBoxYesNo(const sWMsg, sWTitle: WideString; const iStyle: UINT): Integer; overload;
//YesボタンとNoボタンとCancelボタン
function gfniMessageBoxYesNoCancel(const sWMsg: WideString): Integer; overload;
function gfniMessageBoxYesNoCancel(const sWMsg, sWTitle: WideString): Integer; overload;
function gfniMessageBoxYesNoCancel(const sWMsg, sWTitle: WideString; const iStyle: UINT): Integer; overload;

//------------------------------------------------------------------------------
implementation
uses
  Forms,
  SysUtils;


//------------------------------------------------------------------------------
function gfnsExeNameGet: WideString;
var
  li_Count: Integer;
  lpp_Arg, lpp_Param: PPWideChar;
begin
  Result := '';
  lpp_Param := CommandLineToArgvW(GetCommandLineW, li_Count);
  try
    lpp_Arg := lpp_Param;
    Result  := WideString(lpp_Arg^); //実行ファイル名
  finally
    LocalFree(Cardinal(lpp_Param));
  end;
end;


//------------------------------------------------------------------------------
function gfniMessageBox(const sWMsg, sWTitle: WideString; const iStyle: UINT): Integer;
{2007-10-06:
Unicode対応のMessageBox。

MB_OK               [OK]ボタン。
MB_OKCANCEL         [OK]ボタンと[キャンセル]ボタン。
MB_YESNO            [はい]と[いいえ]の2つのボタン。
MB_YESNOCANCEL      [はい]、[いいえ]、[キャンセル]の3つのボタン。
MB_RETRYCANCEL      [再試行]ボタンと[キャンセル]ボタン。
MB_ABORTRETRYIGNORE [中止]、[再試行]、[無視]の3つのボタン。

MB_DEFBUTTON1 最初のボタンがデフォルト。
              MB_DEFBUTTON2、MB_DEFBUTTON3を指定しなければ最初のボタンが常にデフォルト。
MB_DEFBUTTON2 2番目のボタンがデフォルト。
MB_DEFBUTTON3 3番目のボタンがデフォルト。

MB_ICONEXCLAMATION 感嘆符アイコンを表示。
MB_ICONQUESTION    疑問符アイコンを表示。
MB_ICONINFORMATION 円の中に小文字の「i」があるアイコンを表示。
MB_ICONSTOP        「STOP」アイコンを表示。

MB_SYSTEMMODAL
  すべてのアプリケーションはユーザーがメッセージボックスに応答するまで中断されます。
  アプリケーションがMB_ICONHANDを指定しなければメッセージボックスは生成の処理が完
  了するまでにはモーダルになりません。
  このためオーナーウィンドウやそのほかのウィンドウはメッセージボックスのアクティ
  ブ化によるメッセージを受け取り続けます。
  システムモーダルメッセージボックスはすぐに対応を求められるような重大で潜在的な
  危険性のあるエラー(メモリ不足など)をユーザーに通知するために使用してください。
MB_TASKMODAL
  第一引数がnilの時、現在のタスクに属するすべてのトップレベルウィンドウが使用不能
  になることを除いてMB_APPLMODALと同じです。
  呼び出し側のアプリケーションやライブラリが使用可能なウィンドウのハンドルを持た
  ず、ほかのアプリケーションを中断せずに現在のアプリケーションのほかのウィンドウへ
  の入力を阻止しなければならないときには、このフラグを使用してください。
MB_APPLMODAL
  第一引数のウィンドウ内で作業を継続する前に、メッセージボックスに応答しなければな
  りません。
  しかし他のアプリケーションのウィンドウに移動してそのウィンドウ内で作業すること
  はできます。MB_SYSTEMMODAL、MB_TASKMODALを指定しなければMB_APPLMODALがデフォルト
  です。
MB_SETFOREGROUND
  メッセージボックスは前景ウィンドウになります。
MB_DEFAULT_DESKTOP_ONLY
  現在入力を受け取るデスクトップは、 デフォルトのデスクトップでなければなりません。
  それ以外の場合には関数が失敗します。
  デフォルトのデスクトップはユーザーがログオンした後でアプリケーションが動作する
  デスクトップです。

戻り値
IDABORT  [中止]ボタンが選択されました。
IDCANCEL [キャンセル]ボタンが選択されました。
IDIGNORE [無視]ボタンが選択されました。
IDNO     [いいえ]ボタンが選択されました。
IDOK     [OK]ボタンが選択されました。
IDRETRY  [再試行]ボタンが選択されました。
IDYES    [はい]ボタンが選択されました。
}

begin
  Result := MessageBoxW(Application.Handle, PWideChar(sWMsg), PWideChar(sWTitle), iStyle or MB_SETFOREGROUND);
end;


//------------------------------------------------------------------------------
procedure gpcMessageBox(const sWMsg: WideString); overload;
{2008-03-05:
Application.MessageBoxのUnicode版。
}

begin
  gpcMessageBox(sWMsg, '');
end;
procedure gpcMessageBox(const sWMsg, sWTitle: WideString); overload;
{2008-03-05:
Application.MessageBoxのUnicode版。
}

begin
  gfniMessageBox(sWMsg, sWTitle, 0);
end;
procedure gpcMessageBox(const sWMsg, sWTitle: WideString; const iStyle: UINT); overload;
{2008-03-05:
Application.MessageBoxのUnicode版。
}

begin
  gfniMessageBox(sWMsg, sWTitle, iStyle or MB_APPLMODAL or MB_OK);
end;


//ShowMessage
procedure gpcShowMessage(const sWMsg: WideString);
{2007-10-06:
ShowMessageのUnicode版。
}

begin
  gfniMessageBox(sWMsg, gfnsExeNameGet, MB_OK);
end;
procedure gpcShowMessage(const sWMsg, sWTitle: WideString);
{2008-04-04:
ShowMessageのUnicode版。タイトルのキャプション指定付。
}

begin
  gfniMessageBox(sWMsg, sWTitle, MB_OK);
end;


function gfniMessageBoxYesNo(const sWMsg: WideString): Integer;
{2008-03-08:
Unicode対応版のMessageBox。YesとNoボタン。
}

begin
  Result := gfniMessageBoxYesNo(sWMsg, '');
end;

function gfniMessageBoxYesNo(const sWMsg, sWTitle: WideString): Integer;
{2008-03-08:
Unicode対応版のMessageBox。YesとNoボタン。
}

begin
  Result := gfniMessageBoxYesNo(sWMsg, sWTitle, 0);
end;

function gfniMessageBoxYesNo(const sWMsg, sWTitle: WideString; const iStyle: UINT): Integer;
{2007-10-06:
Unicode対応版のMessageBox。YesとNoボタン。
}

begin
  Result := gfniMessageBox(sWMsg, sWTitle, iStyle or MB_YESNO or MB_APPLMODAL{ or MB_ICONQUESTION});
end;

function gfniMessageBoxYesNoCancel(const sWMsg: WideString): Integer;
{2008-03-08:
Unicode対応版のMessageBox。YesとNoとCancelボタン。
}

begin
  Result := gfniMessageBoxYesNoCancel(sWMsg, '');
end;

function gfniMessageBoxYesNoCancel(const sWMsg, sWTitle: WideString): Integer;
{2008-03-08:
Unicode対応版のMessageBox。YesとNoとCancelボタン。
}

begin
  Result := gfniMessageBoxYesNoCancel(sWMsg, sWTitle, 0);
end;

function gfniMessageBoxYesNoCancel(const sWMsg, sWTitle: WideString; const iStyle: UINT): Integer;
{2008-03-08,06-04:
Unicode対応版のMessageBox。YesとNoとCancelボタン。
2008-06-04:MB_YESNOCANCELでなくMB_YESNOにしていたミスを修正。
}

begin
  Result := gfniMessageBox(sWMsg, sWTitle, iStyle or MB_YESNOCANCEL or MB_APPLMODAL or MB_ICONQUESTION);
end;


end.