2011-02-12 7 views
24

TTaskDialogクラス(Delphi 2009以降)はどのように使用されますか? The official documentationは役に立ちませんでした。実際には、CodeInsightまたはVCLソースコードを使用してクラスを調べることで、さらに多くのことを学ぶことができます。そこには教育的な説明はありませんが、少なくともどちらもエラーはありません(よく、just a few)。TTaskDialogの使い方は?

ちょうど最近、ダイアログのハイパーリンクのクリックにどのように反応できるのか疑問に思っていました。実際、tfEnableHyperlinksフラグを設定すると、ダイアログのテキスト部分にHTMLハイパーリンクを含めることができます。 (もし、設定されていれば、コンテンツ、フッタ、拡張テキストはハイパーリンクを含むことができます。当然、リンクは<A HTML要素を使って実装されていることは「明らかです」)自分自身で、OnHyperLinkClickイベントを使用して、ハイパーリンクのクリックに反応するようにします。しかし、このイベントはTNotifyEventなので、どのリンクがクリックされたのか、どのように知っていますか?まあ、ドキュメントはそれについて何も言わなかったので、私は推測しなければなりませんでした。結局私は、ダイアログのURLパブリックプロパティが設定されていることがわかったので、私はこの物件について、

procedure TmainFrm.TaskDialogHyperLinkClicked(Sender: TObject); 
begin 
    if Sender is TTaskDialog then 
    with Sender as TTaskDialog do 
     ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOWNORMAL); 
end; 

公式ドキュメントは言うを行うことができます:

URLタスク ダイアログのURLが含まれています。

今、それは素晴らしい説明です。しかし、それはこれより悪いです:説明だけでなく、エラーも含まれています。 For instance

ExpandButtonCaption:このボタンの追加情報。

これはあまり正確ではありません。どのボタン?あなたは、この特定のプロパティのヘルプを表示する場合は、it says

ExpandButtonCaptionは、キャプションが展開されたときに表示される追加のテキストが含まれています。

どちらも悪いです。どのようなキャプションですか?適切な説明は

です。ExpandButtonCaptionは、ユーザーがダイアログを展開して詳細情報を表示させるためのボタンの横に表示されるテキストです。たとえば、このプロパティは「詳細」です。

いずれにせよ、現在、私は2つのコマンドリンクボタンでダイアログを作成しようとしています。私はオペレーティングシステムがこれらのボタンをキャプションと長い説明の両方で表示できることを知っていますが、私はTTaskButtonを使って動作させることができないようです。文書isn't great

しかし、その代わりのSOで、ここでは、この特定の事を達成する方法を求めて、私は別の質問をされます:

TTaskDialogクラスの任意の(非公式)のドキュメントはありますか?

+0

でも、私は、特定の問題の解決策を見つけた: 'TTaskDialogBu​​ttonItem(Buttons.Add)とのキャプションを開始します:= 'キャプション'; CommandLinkHint:= '説明';それはあまりにも明白ではありませんでしたが、それは機能します... –

+1

自分自身、私はそれを使うのはかなり簡単なWin32 API関数に対して直接書く方が簡単だと思います。 –

+0

@David:はい、おそらく私は代わりにそれを行うべきです。 –

答えて

44

あなたはドキュメントを見つけることができない場合は、write it

タスクダイアログのHello Worldの

with TTaskDialog.Create(Self) do 
    try 
    Caption := 'My Application'; 
    Title := 'Hello World!'; 
    Text := 'I am a TTaskDialog, that is, a wrapper for the Task Dialog introduced ' + 
      'in the Microsoft Windows Vista operating system. Am I not adorable?'; 
    CommonButtons := [tcbClose]; 
    Execute; 
    finally 
    Free; 
    end; 

Captionを示すテキストですウィンドウのタイトルバー、Titleがヘッダーで、Textはダイアログの本体です。言うまでもなく、Executeはタスクダイアログを表示し、その結果を以下に示します。 (私たちは、セクションまたは2にCommonButtonsプロパティに戻ります。)

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog1.png

ビーイングのWindows XPの下で実行されている場合はもちろん、タスクダイアログは、プログラムがクラッシュします行儀シチズン

、タスクダイアログAPIはありません。また、ビジュアルテーマが無効になっている場合は動作しません。そのような場合は、旧式のMessageBoxに固執する必要があります。したがって、実際のアプリケーションでは、我々はこの記事の残りの部分では

if (Win32MajorVersion >= 6) and ThemeServices.ThemesEnabled then 
    with TTaskDialog.Create(Self) do 
    try 
     Caption := 'My Application'; 
     Title := 'Hello World!'; 
     Text := 'I am a TTaskDialog, that is, a wrapper for the Task Dialog introduced ' + 
       'in the Microsoft Windows Vista operating system. Am I not adorable?'; 
     CommonButtons := [tcbClose]; 
     Execute; 
    finally 
     Free; 
    end 
else 
    MessageBox(Handle, 
      'I am an ordinary MessageBox conveying the same message in order to support' + 
      'older versions of the Microsoft Windows operating system (XP and below).', 
      'My Application', 
      MB_ICONINFORMATION or MB_OK); 

を行う必要があるだろう、我々は後方互換性のtaxが支払われていることを前提とし、代わりに単独のダイアログタスクに集中します。

ダイアログの種類。モーダルは

CommonButtonsプロパティは、タイプTTaskDialogCommonButtonsのこの特性は、(我々は後で行いますとどのボタンも、手動で追加されていない場合)ダイアログに表示ボタンを決定

TTaskDialogCommonButton = (tcbOk, tcbYes, tcbNo, tcbCancel, tcbRetry, tcbClose); 
TTaskDialogCommonButtons = set of TTaskDialogCommonButton; 

として定義されている結果。ユーザーがこれらのボタンのいずれかをクリックすると、対応するTModalResultの値は、Executeが返されるとすぐにModalResultプロパティに格納されます。 MainIconプロパティは、ダイアログに表示されるアイコンを決定します。もちろん、ボタンのセットのようにダイアログの性質を反映する必要があります。正式には整数MainIconは、tdiNone,tdiWarning,tdiError,tdiInformationおよびtdiShieldのいずれかの値に設定できます。以下

with TTaskDialog.Create(Self) do 
    try 
    Caption := 'My Application'; 
    Title := 'The Process'; 
    Text := 'Do you want to continue even though [...]?'; 
    CommonButtons := [tcbYes, tcbNo]; 
    MainIcon := tdiNone; // There is no tdiQuestion 
    if Execute then 
     if ModalResult = mrYes then 
     beep; 
    finally 
    Free; 
    end; 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog2.png

残りのアイコンの種類(シールド、警告、エラー、それぞれ)のサンプルである:

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog3.png

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog4.png

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog5.png

最後に、DefaultButtonプロパティを使用して、ダイアログボックスのデフォルトボタンを設定できることがわかります。

with TTaskDialog.Create(Self) do 
    try 
    Caption := 'My Application'; 
    Title := 'The Process'; 
    Text := 'Do you want to continue even though [...]?'; 
    CommonButtons := [tcbYes, tcbNo]; 
    DefaultButton := tcbNo; 
    MainIcon := tdiNone; 
    if Execute then 
     if ModalResult = mrYes then 
     beep; 
    finally 
    Free; 
    end; 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog6.png

カスタムボタン

あなたは、タスクダイアログにカスタムボタンを追加することができます。実際には、CommonButtonsプロパティを空のセットに設定し、カスタムボタン(およびボタンの数に制限はありません)に完全に依存することができます。下記の実際の例では、このようなダイアログ・ボックスを示しています

with TTaskDialog.Create(self) do 
    try 
    Title := 'Confirm Removal'; 
    Caption := 'Rejbrand BookBase'; 
    Text := Format('Are you sure that you want to remove the book file named "%s"?', [FNameOfBook]); 
    CommonButtons := []; 
    with TTaskDialogButtonItem(Buttons.Add) do 
    begin 
     Caption := 'Remove'; 
     ModalResult := mrYes; 
    end; 
    with TTaskDialogButtonItem(Buttons.Add) do 
    begin 
     Caption := 'Keep'; 
     ModalResult := mrNo; 
    end; 
    MainIcon := tdiNone; 
    if Execute then 
     if ModalResult = mrYes then 
     DoDelete; 
    finally 
    Free; 
    end 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog7.png

コマンドは、タスクダイアログのボタンは、コマンドリンクすることができ、古典的なプッシュボタンの代わりに

をリンクします。これは、tfUseCommandLinksフラグ(Flags)を設定することによって実現されます。今、あなたはまた、CommandLinkHint(ごとのボタン)プロパティを設定することができます。

with TTaskDialog.Create(self) do 
    try 
    Title := 'Confirm Removal'; 
    Caption := 'Rejbrand BookBase'; 
    Text := Format('Are you sure that you want to remove the book file named "%s"?', [FNameOfBook]); 
    CommonButtons := []; 
    with TTaskDialogButtonItem(Buttons.Add) do 
    begin 
     Caption := 'Remove'; 
     CommandLinkHint := 'Remove the book from the catalogue.'; 
     ModalResult := mrYes; 
    end; 
    with TTaskDialogButtonItem(Buttons.Add) do 
    begin 
     Caption := 'Keep'; 
     CommandLinkHint := 'Keep the book in the catalogue.'; 
     ModalResult := mrNo; 
    end; 
    Flags := [tfUseCommandLinks]; 
    MainIcon := tdiNone; 
    if Execute then 
     if ModalResult = mrYes then 
     DoDelete; 
    finally 
    Free; 
    end 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog8.png

tfAllowDialogCancellationフラグが近いシステムメニュー項目(タイトルバーのボタンを復元します - 実際には、それが全体を復元しますシステムメニュー)。

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog9.png

あなたは、ユーザーがAクリックした後にのみ表示されるテキストの一部(旧)を追加するプロパティExpandedTextExpandedButtonCaptionを使用することができ、エンドユーザー

で技術的な詳細を投げないでください。ボタン(後者のプロパティのテキストの左側)をクリックしてリクエストします。

with TTaskDialog.Create(self) do 
    try 
    Title := 'Confirm Removal'; 
    Caption := 'Rejbrand BookBase'; 
    Text := Format('Are you sure that you want to remove the book file named "%s"?', [FNameOfBook]); 
    CommonButtons := []; 
    with TTaskDialogButtonItem(Buttons.Add) do 
    begin 
     Caption := 'Remove'; 
     CommandLinkHint := 'Remove the book from the catalogue.'; 
     ModalResult := mrYes; 
    end; 
    with TTaskDialogButtonItem(Buttons.Add) do 
    begin 
     Caption := 'Keep'; 
     CommandLinkHint := 'Keep the book in the catalogue.'; 
     ModalResult := mrNo; 
    end; 
    Flags := [tfUseCommandLinks, tfAllowDialogCancellation]; 
    ExpandButtonCaption := 'Technical information'; 
    ExpandedText := 'If you remove the book item from the catalogue, the corresponding *.book file will be removed from the file system.'; 
    MainIcon := tdiNone; 
    if Execute then 
     if ModalResult = mrYes then 
     DoDelete; 
    finally 
    Free; 
    end 

下の画像は、ユーザーがボタンをクリックして追加の詳細を表示した後のダイアログを示しています。

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog10.png

あなたがtfExpandFooterAreaフラグを追加する場合、追加のテキストではなくフッタに表示されます。いずれの場合で

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog11.png

、すでに詳細を示すダイアログが開いせることができますtfExpandedByDefaultフラグを追加して拡張しました。

カスタムアイコン

あなたはCustomMainIconプロパティで使用するTIcontfUseHiconMainフラグを使用して指定することで、タスクダイアログで任意のカスタムアイコンを使用することができます。

with TTaskDialog.Create(self) do 
    try 
    Caption := 'About Rejbrand BookBase'; 
    Title := 'Rejbrand BookBase'; 
    CommonButtons := [tcbClose]; 
    Text := 'File Version: ' + GetFileVer(Application.ExeName) + #13#10#13#10'Copyright © 2011 Andreas Rejbrand'#13#10#13#10'http://english.rejbrand.se'; 
    Flags := [tfUseHiconMain, tfAllowDialogCancellation]; 
    CustomMainIcon := Application.Icon; 
    Execute; 
    finally 
    Free; 
    end 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog12.png

ハイパーリンク

だけtfEnableHyperlinksフラグを追加する場合でも、(TextFooter,ExpandedTextに)ダイアログで、HTMLのようなハイパーリンクを使用することができます。

with TTaskDialog.Create(self) do 
    try 
    Caption := 'About Rejbrand BookBase'; 
    Title := 'Rejbrand BookBase'; 
    CommonButtons := [tcbClose]; 
    Text := 'File Version: ' + GetFileVer(Application.ExeName) + #13#10#13#10'Copyright © 2011 Andreas Rejbrand'#13#10#13#10'<a href="http://english.rejbrand.se">http://english.rejbrand.se</a>'; 
    Flags := [tfUseHiconMain, tfAllowDialogCancellation, tfEnableHyperlinks]; 
    CustomMainIcon := Application.Icon; 
    Execute; 
    finally 
    Free; 
    end 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog13.png

ただし、リンクをクリックしても何も起こりません。リンクの動作は手動で実装する必要があります。これはもちろん、良いことです。これを行うには、TNotifyEventOnHyperlinkClickedイベントに返信してください。リンク(要素のhref、つまり)のURLをTTaskDialogURLパブリックプロパティに格納されています

procedure TForm1.TaskDialogHyperLinkClicked(Sender: TObject); 
begin 
    if Sender is TTaskDialog then 
    with Sender as TTaskDialog do 
     ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOWNORMAL); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    with TTaskDialog.Create(self) do 
    try 
     Caption := 'About Rejbrand BookBase'; 
     Title := 'Rejbrand BookBase'; 
     CommonButtons := [tcbClose]; 
     Text := 'File Version: ' + GetFileVer(Application.ExeName) + #13#10#13#10'Copyright © 2011 Andreas Rejbrand'#13#10#13#10'<a href="http://english.rejbrand.se">http://english.rejbrand.se</a>'; 
     Flags := [tfUseHiconMain, tfAllowDialogCancellation, tfEnableHyperlinks]; 
     OnHyperlinkClicked := TaskDialogHyperlinkClicked; 
     CustomMainIcon := Application.Icon; 
     Execute; 
    finally 
     Free; 
    end 
end; 

あなたが作成するFooterFooterIconプロパティを使用することができフッター

フッター。 iconプロパティは、MainIconプロパティと同じ値を受け入れます。 tfUseHiconFooterフラグとCustomFooterIconプロパティを使用して

with TTaskDialog.Create(self) do 
    try 
    Caption := 'My Application'; 
    Title := 'A Question'; 
    Text := 'This is a really tough one...'; 
    CommonButtons := [tcbYes, tcbNo]; 
    MainIcon := tdiNone; 
    FooterText := 'If you do this, then ...'; 
    FooterIcon := tdiWarning; 
    Execute; 
    finally 
    Free; 
    end 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog14.png

、あなたがあなた自身のメインのアイコンを選択することができますと同じように、フッターに任意のカスタムアイコンを使用することができます。 Aチェックボックス

VerificationText文字列プロパティを使用して

、あなたはタスクダイアログのフッターにあるチェックボックスを追加することができます。チェックボックスのキャプションがプロパティです。

とTTaskDialog.Create(self)do try キャプション:= 'My Application'; タイトル:= '質問'; テキスト:= 'これは本当に厳しいものです...'; CommonButtons:= [tcbYes、tcbNo]; MainIcon:= tdiNone; VerificationText:= '自分の選択を記憶する'; 実行します。 最終的に 無料;

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog15.png

終了あなたは、チェックボックスが最初にtfVerificationFlagCheckedフラグを指定することで確認することができます。残念ながら、TTaskDialogのVCL実装のバグ(?)により、Executeが返されたときにこのフラグがインクルードされても、チェックボックスの最終状態は反映されません。チェックボックスを追跡するために、アプリケーションは、このように初期状態を覚えているし、チェックボックスの状態は、ダイアログのモダリティ中に変更されるたびにトリガされた各OnVerificationClickedイベントへの応答として内部フラグをトグルする必要があります。

ラジオボタンはカスタムプッシュボタン(またはコマンドリンクボタン)を追加する方法に似た方法で実装することができ

ラジオボタン:

with TTaskDialog.Create(self) do 
    try 
    Caption := 'My Application'; 
    Title := 'A Question'; 
    Text := 'This is a really tough one...'; 
    CommonButtons := [tcbOk, tcbCancel]; 
    MainIcon := tdiNone; 
    with RadioButtons.Add do 
     Caption := 'This is one option'; 
    with RadioButtons.Add do 
     Caption := 'This is another option'; 
    with RadioButtons.Add do 
     Caption := 'This is a third option'; 
    if Execute then 
     if ModalResult = mrOk then 
     ShowMessage(Format('You chose %d.', [RadioButton.Index])); 
    finally 
    Free; 
    end 

Sample of a TTaskDialog http://specials.rejbrand.se/TTaskDialog/taskdialog16.png

+1

素敵な書き込み。余分な努力のために+1。 –

+0

+1 to @Chris。誰かが多くの批判(C.F. http://stackoverflow.com/questions/3017743/delphi-components-you-cant-live-without/3017810#3017810)を取得するときは、必ず素敵なコメントを投稿してください。バッジがあるはずです(例: "同志"、または "支持的"。 –

+0

+1も私から。よくやった! –

4

TMS素晴らしいラッパーを備えていて、XPで実行したときに新しい動作をエミュレートします。ドロップインするのは簡単です。それは無料ではありませんし、本当にあなたの "方法"の質問に答えるものではありません。

http://www.tmssoftware.com/site/vtd.asp

彼らはまた、彼らは、ダイアログを議論するいくつかの記事を持っている、そしてあなたがあなた自身のラッパーを作りたい場合に有用である可能性があるいくつかのソースコードがあります。その後、

http://www.tmssoftware.com/site/atbdev5.asp

http://www.tmssoftware.com/site/atbdev7.asp

+0

はい、私はこのラッパーについて知っていますが、私はサードパーティのコンポーネントなしでやることを好む。 –

+0

正直言って、私はタスクのダイアログがXP上でよく見えるとは思わない。彼らは間違って見えます。それを行う方法は、私見、私はhttp://specials.rejbrand.se/TTaskDialogでそうであるように、XPにVistaの/ 7上のタスクダイアログを使用し、昔ながらの 'MessageBox'esすることです。 –

+0

しかし、それはXP上であなたのアプリを壊すことはありません。たとえアンドレアスがそれが悪い考えだとは思わないとしても。プロのソフトウェアコミュニティの残りの部分は、このような制限にあまりにも親切に見えません。お使いのソフトウェアがおもちゃの場合は、罰金。完全な機能的な破損よりも、あなたにとってより重要なのを見ていますか? –

1

ここに私の短いドキュメントです:

  1. あなたがない限り、それを使用しないでください。あなたのアプリケーションをXP上で動作させたくない。

  2. delphi doc wikiコンテンツの改善点を提案しますが、「注:タスクダイアログにはVistaまたはWindows 7が必要です」という注記に注意してください。これは「使用しないでください!」のコードです。基本的には、誰かが新しいWindows Vistaダイアログを完全にサポートするというアイデアを得ました。その方法は、ダイアログAPIを呼び出すだけのラッパーコードを作成することでした。フォールバック機能は提供されていないため、XPには不運です。

+2

私はいつもOSのバージョンとビジュアルテーマの可用性をテストしています(Aeroが有効になっていないVista/7では 'TTaskDialog'は動作しません)。可能であれば' TTaskDialog'を使い、 http://specials.rejbrand.se/TTaskDialogのように。素晴らしい視覚スタイルの 'TTaskDialog'は、この余分な作業に値するものです。 (でも、正直言って、私は本当に「今日誰がXPを使っているのですか?」と感じている) –

+0

「TTaskDialog」はXP上で「TTaskDialog」作業をしないことをEmbarcaderoに非難するのは賢明ではないオペレーティングシステムAPI用のラッパーのみです。これはVistaの新機能です。はい、おそらく、もし 'TTaskDialog'がXP上でカスタム処理(ビジュアルテーマなし)を行った場合、開発者の生活をわずかに(わずかに)単純化するためにしかし、ネイティブOS API)、私はあなたがそうするためにラッパーを必要とすべきだとは思わない。 –

+0

開示:私はEmbarcaderoで働いています。しかし、私は個人的には、すべての一般的なWindowsのバージョンで動作しないコンポーネントを好きではありません。あなたのアプリケーションを書く場合は、XP上で動作しないようにしてください。しかし、stackoverflowがあなたとあなたの問題だけではないことを覚えておいてください。それは、後に来てこの情報を読む人々についてです。だから遠ざけてください。しかし、他の人が来て、これを知る必要があるかもしれません。 –

6

これは古いものですが、私は完全を期すためにここにこれを追加している:(VCL付き)XPの下で動作しますが、Vistaの+下システムTaskDialogを使用しています

Open Source SynTaskDialog unit for XP,Vista,Seven

TTaskDialogユニットを。