[修正点]
- TTaskDialogEx に Init メソッドを追加
説明:
SynTaskDialog には、TTaskDialogEx という TTaskDialog のラッパーがあります。TTaskDialogEx はExecute() の引数が少ないので使いやすいです。SynTaskDialog.pas には uses するだけで使える DefaultTaskDialog という TTaskDialogEx 型のグローバル変数があります。
しかし DefaultTaskDialog はグローバル変数であるため、使いまわすとグチャります。例えば、
// カスタムボタンのタスクダイアログ with DefaultTaskDialog do begin Base.Title := 'タイトル'; Base.Inst := 'キャプション'; Base.Content := 'テキスト'; with TStringList.Create do try Add('イェース!'); // カスタムボタンを追加 (ID=100) Add('ノォォォ!'); // カスタムボタンを追加 (ID=101) Base.Buttons := Text; finally Free; end; ButtonDef := 101; // ID=101 (2番目のボタン) がデフォルト DialogIcon := tiInformation; // 感嘆符アイコン Flags := [tdfAllowDialogCancellation]; // [×] によるキャンセルを有効にする case Execute of 100: ShowMessage('Yes'); 101: ShowMessage('No'); mrCancel: ShowMessage('Cancel (System)'); end; end;
// ShowMessage() っぽいタスクダイアログ with DefaultTaskDialog do begin Base.Title := 'タイトル'; Base.Inst := 'キャプション'; Base.Content := 'テキスト'; DialogIcon := tiNotUsed; Execute; end;
一見正しそうなこのコードは正しく動作しません…何故ならば、DefaultTaskDialog がグローバル変数であるため、最初の実行時に設定されたカスタムボタンが初期化されないからです。
では、TTaskDialogEx をローカル変数で定義して使えばいいかと言えばそうではありません。今度はローカル変数であるためにフィールドが初期化されないからです。例えば、以下のコードは正しく動作しません。
var Task: SynTaskDialog.TTaskDialogEx; begin with Task do begin Base.Title := 'タイトル'; Base.Inst := 'キャプション'; Base.Content := 'テキスト'; DialogIcon := tiNotUsed; Execute; end; end;
レコードのローカル変数は初期化できませんから、自前ですべてのフィールドを初期化しなくてはなりません…とても面倒ですね。そういう事で、レコードを適切に初期化するメソッド Init() を追加しました。
var Task: SynTaskDialog.TTaskDialogEx; begin with Task do begin Init; // これを追加 Base.Title := 'タイトル'; Base.Inst := 'キャプション'; Base.Content := 'テキスト'; DialogIcon := tiNotUsed; Execute; end; end;
これで、初期化が楽にできるようになりました (なんとなくですが record のコンストラクタは好きではないのです)。今度は Init() メソッドがあるので DefaultTaskDialog を使いまわしても大丈夫です。
DefaultTaskDialog を直接実行しない (Execute を呼び出さない) のであれば、
var Task: SynTaskDialog.TTaskDialogEx; begin Task := DefaultTaskDialog; with Task do begin Base.Title := 'タイトル'; Base.Inst := 'キャプション'; Base.Content := 'テキスト'; DialogIcon := tiNotUsed; Execute; end; end;
このように初期化元として使う事ができます。DefaultTaskDialog は 名前からして初期化用途なのかもしれませんね。
なお、TTaskDialog の方を使えば (まず) 初期化処理は不要です。何故ならば Execute() メソッドの引数に初期値が設定してあるからです。しかしながら、個人的には引数が 10 個もあるメソッドは使いたくないですね。
|