Windows Vistaは、ユーザーとの対話のための新しいダイアログTaskDialogを導入しました。最もシンプルなフォームでは、TaskDialogは、タイトルのカスタマイズや説明や内容を追加できるオプションを持った、より見た目がいいMessageBox相当のダイアログだといえます。
基本的なTaskDialogのほかにも、Windows Vistaは、さまざまなダイアログ拡張機能を提供します。複数の選択肢に対するセレクタ、確認用チェックボックス、オプションで追加情報を隠したり、プログレスバーを表示したり。これらの拡張機能は、次の記事で説明します。
DelphiからTaskDialogを使用する方法は単純です。Windows Vistaは、新しいCOMCTL32.DLL v6 の Win32 APIコールとして TaskDialog を利用可能にしています。しかし、気をつけなければならないのは、Windows Vistaは、依然としてCOMCTL32.DLL v5をも提供しており、これがDelphiのアプリケーションが使用するデフォルトライブラリになっていることです。COMCTL32.DLL v6を使用し、TaskDialog APIを呼び出すには、あなたのアプリケーションであなたのアプリケーションの中に、マニフェストのTXPManifestか、TMS TWinXPコンポーネントがあることを確認してください。
TaskDialog API関数は、Windows Vista SDKで以下のように宣言されています。
HRESULT TaskDialog(HWND hWndParent,
HINSTANCE hInstance,
PCWSTR pszWindowTitle,
PCWSTR pszMainInstruction,
PCWSTR pszContent,
TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons,
PCWSTR pszIcon,
int *pnButton
);
Delphiでは、次の関数に変換します。
TaskDialog: function(HWND: THandle;
hInstance: THandle;
cTitle, cDescription, cContent: pwidechar;
Buttons: Integer;
Icon: integer;
ResButton: pinteger): integer;
新しいTaskDialogの欠点は、Windows Vista上でしか動かないことです。以前のバージョンのWindows OSは、まったくサポートしていません。そこで、Windows Vista上で基本的なTaskDialogを使う関数を作成することにします。これは、旧バージョンのOS上では、標準のMessageDlgを代替として使います。この方法により、あなたのアプリケーションは、最新のWindows Vistaのユーザーインターフェイスを用いつつ、旧バージョンのWindowsでも動作させることができます。新しいTaskDialogメソッドを含む完全なコードを以下に示します。また、もうひとつのTaskMessage関数は、DelphiのShowMessageのリプレースとして用意しました。
const
TD_ICON_BLANK = 100;
TD_ICON_WARNING = 101;
TD_ICON_QUESTION = 102;
TD_ICON_ERROR = 103;
TD_ICON_INFORMATION = 104;
TD_ICON_BLANK_AGAIN = 105;
TD_ICON_SHIELD = 106;
TD_OK = 1;
TD_YES = 2;
TD_NO = 4;
TD_CANCEL = 8;
TD_RETRY = 16;
TD_CLOSE = 32;
DLGRES_OK = 1;
DLGRES_CANCEL = 2;
DLGRES_RETRY = 4;
DLGRES_YES = 6;
DLGRES_NO = 7;
DLGRES_CLOSE = 8;
function TaskDialog(AForm: TCustomForm; ATitle, ADescription, AContent: string; Buttons,Icon: integer): integer;
var
VerInfo: TOSVersioninfo;
DLLHandle: THandle;
res: integer;
wTitle,wDescription,wContent: array[0..1024] of widechar;
Btns: TMsgDlgButtons;
DlgType: TMsgDlgType;
TaskDialogProc: function(HWND: THandle; hInstance: THandle; cTitle, cDescription, cContent: pwidechar;
Buttons: Integer; Icon: integer; ResButton: pinteger): integer; cdecl stdcall;
begin
Result := 0;
VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(verinfo);
if (verinfo.dwMajorVersion >= 6) then
begin
DLLHandle := LoadLibrary('comctl32.dll');
if DLLHandle >= 32 then
begin
@TaskDialogProc := GetProcAddress(DLLHandle,'TaskDialog');
if Assigned(TaskDialogProc) then
begin
StringToWideChar(ATitle, wTitle, sizeof(wTitle));
StringToWideChar(ADescription, wDescription, sizeof(wDescription));
StringToWideChar(AContent, wContent, sizeof(wContent));
TaskDialogProc(AForm.Handle, 0, wTitle, wDescription, wContent, Buttons,Icon,@res);
Result := mrOK;
case res of
DLGRES_CANCEL : Result := mrCancel;
DLGRES_RETRY : Result := mrRetry;
DLGRES_YES : Result := mrYes;
DLGRES_NO : Result := mrNo;
DLGRES_CLOSE : Result := mrAbort;
end;
end;
FreeLibrary(DLLHandle);
end;
end
else
begin
Btns := [];
if Buttons and TD_OK = TD_OK then
Btns := Btns + [MBOK];
if Buttons and TD_YES = TD_YES then
Btns := Btns + [MBYES];
if Buttons and TD_NO = TD_NO then
Btns := Btns + [MBNO];
if Buttons and TD_CANCEL = TD_CANCEL then
Btns := Btns + [MBCANCEL];
if Buttons and TD_RETRY = TD_RETRY then
Btns := Btns + [MBRETRY];
if Buttons and TD_CLOSE = TD_CLOSE then
Btns := Btns + [MBABORT];
DlgType := mtCustom;
case Icon of
TD_ICON_WARNING : DlgType := mtWarning;
TD_ICON_QUESTION : DlgType := mtConfirmation;
TD_ICON_ERROR : DlgType := mtError;
TD_ICON_INFORMATION: DlgType := mtInformation;
end;
Result := MessageDlg(AContent, DlgType, Btns, 0);
end;
end;
procedure TaskMessage(AForm: TCustomForm; AMessage: string);
begin
TaskDialog(AForm, '', '', AMessage, TD_OK, 0);
end;
以下のサンプルコードは、新しいTaskDialogとTaskMessage関数を使用する例です。
if TaskDialog(self, 'Hello world','Ready to enjoy the new Vista task dialog ?',
'The new Vista task dialog presents an easy to use and user-friendly replacement for messageboxes.',
TD_YES + TD_NO, TD_ICON_QUESTION) = mrYes then
TaskMessage(self,'yes');
これらの基本関数によって、簡単にあなたのDelphiアプリケーションをVista Readyに近づけることができます。以降の記事で、Delphi開発者が利用可能なその他のWindows Vistaの機能及びTaskDialogの拡張機能について説明します。