30

クラスをどのように使用しますTTaskDialogか (Delphi 2009 以降)? 公式ドキュメントは役に立ちませんでした。実際、CodeInsight または VCL ソース コードを使用してクラスを調べると、さらに多くのことがわかります。そこには教育的な説明はありませんが、少なくともエラーもありません (ほんの数例です)。

そしてつい最近、ダイアログ内のハイパーリンクのクリックにどのように応答できるのか疑問に思いました。実際、tfEnableHyperlinksフラグを設定すると、ダイアログのテキスト部分に HTML ハイパーリンクを含めることができます。(まあ、ドキュメントはフラグについて言った:「設定されている場合、コンテンツ、フッター、および展開されたテキストにハイパーリンクを含めることができます。当然、リンクが<AHTML 要素を使用して実装されていることは「明白」です。)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 が含まれます。

さて、あなたは認めなければなりません、それは素晴らしい説明です! しかし、これよりも悪いことです: ドキュメントには説明が欠けているだけでなく、エラーも含まれています。たとえば

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

それはあまり正確ではありません。何のボタン?この特定のプロパティのヘルプを表示すると、

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

どちらも良くありません。何のキャプション?適切な説明は

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

とにかく、現在、2 つのコマンド リンク ボタンを含むダイアログを作成しようとしています。オペレーティング システムがこれらのボタンをキャプションと長い説明の両方で表示できることは知っていますが、TTaskButton. ドキュメンテーションは素晴らしいものではありません

しかし、ここ SO でこの特定のことを達成する方法を尋ねる代わりに、別の質問をします。

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

4

4 に答える 4

76

ドキュメントが見つからない場合は、次のように記述します。

タスク ダイアログの 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、タスク ダイアログが表示され、結果は次のようになります。CommonButtons( 1~2セクションで宿泊施設に戻ります。)

TTaskDialog のサンプル

礼儀正しい市民であること

もちろん、タスク ダイアログ API がない Windows XP で実行している場合、タスク ダイアログはプログラムをクラッシュさせます。視覚テーマが無効になっている場合も機能しません。いずれにせよ、昔ながらの に固執する必要があり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);

この記事の残りの部分では、下位互換性の税金が支払われていると仮定し、代わりにタスク ダイアログのみに集中します。

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

CommonButtonsプロパティのタイプは であり、次のTTaskDialogCommonButtonsように定義されます。

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

このプロパティは、ダイアログに表示されるボタンを決定します (後で行うように、手動でボタンを追加しない場合)。ユーザーがこれらのボタンのいずれかをクリックすると、返されるとすぐに対応するTModalResult値がプロパティに格納されます。プロパティは、ダイアログに表示されるアイコンを決定し、もちろん、ボタンのセットと同様に、ダイアログの性質を反映する必要があります。正式には整数で、、、 、、のいずれかの値に設定できます。ModalResultExecuteMainIconMainIcontdiNonetdiWarningtdiErrortdiInformationtdiShield

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;

TTaskDialog のサンプル

以下は、残りのアイコンの種類 (それぞれシールド、警告、エラー) のサンプルです。

TTaskDialog のサンプル

TTaskDialog のサンプル

TTaskDialog のサンプル

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;

TTaskDialog のサンプル

カスタム ボタン

カスタム ボタンをタスク ダイアログに追加できます。実際、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

TTaskDialog のサンプル

コマンド リンク

従来のプッシュボタンの代わりに、タスク ダイアログ ボタンをコマンド リンクにすることができます。これは、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

TTaskDialog のサンプル

このtfAllowDialogCancellationフラグは、閉じるシステム メニュー項目 (およびタイトルバー ボタン -- 実際、システム メニュー全体を復元します) を復元します。

TTaskDialog のサンプル

エンドユーザーに技術的な詳細を投げかけないでください

ExpandedTextプロパティを使用してExpandedButtonCaption、ユーザーがボタン (後者のプロパティのテキストの左側) をクリックして要求した後にのみ表示されるテキスト (前者) を追加できます。

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

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

TTaskDialog のサンプル

フラグを追加するtfExpandFooterAreaと、代わりに追加のテキストがフッターに表示されます。

TTaskDialog のサンプル

tfExpandedByDefaultいずれの場合でも、フラグを追加することで、詳細がすでに展開された状態でダイアログを開くことができます。

カスタム アイコン

tfUseHiconMainフラグTIconを使用し、プロパティで使用する を指定することにより、タスク ダイアログで任意のカスタム アイコンを使用できCustomMainIconます。

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

TTaskDialog のサンプル

ハイパーリンク

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

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

TTaskDialog のサンプル

ただし、リンクをクリックしても何も起こらないことに注意してください。リンクのアクションは手動で実装する必要がありますが、これはもちろん良いことです。これを行うには、OnHyperlinkClickedであるイベントに応答しTNotifyEventます。リンクの URL (つまり、a 要素の href) は、次のURLpublic プロパティに格納されTTaskDialogます。

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;

フッター

Footerおよびプロパティを使用FooterIconして、フッターを作成できます。プロパティは、iconプロパティと同じ値を受け入れMainIconます。

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

TTaskDialog のサンプル

tfUseHiconFooterフラグとプロパティを使用するCustomFooterIconと、独自のメイン アイコンを選択できるのと同じように、フッターで任意のカスタム アイコンを使用できます。

チェックボックス

文字列プロパティを使用してVerificationText、タスク ダイアログのフッターにチェックボックスを追加できます。チェックボックスのキャプションはプロパティです。

with TTaskDialog.Create(self) do
  try
    Caption := 'My Application';
    Title := 'A Question';
    Text := 'This is a really tough one...';
    CommonButtons := [tcbYes, tcbNo];
    MainIcon := tdiNone;
    VerificationText := 'Remember my choice';
    Execute;
  finally
    Free;
  end

TTaskDialog のサンプル

tfVerificationFlagCheckedフラグを指定することで、チェックボックスを最初からオンにすることができます。残念ながら、 の VCL 実装のバグ (?) により、 has が返されTTaskDialogたときにこのフラグを含め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

TTaskDialog のサンプル

于 2011-02-13T01:29:25.183 に答える
7

これは古いものですが、完全を期すためにここに追加します。

XP、Vista、Seven 用のオープン ソース SynTaskDialog ユニット

TTaskDialogXP で (VCL を使用して) 動作しますが、Vista+ ではシステム TaskDialog を使用します。

于 2012-01-08T20:51:51.147 に答える
5

TMS には優れたラッパーがあり、XP で実行した場合の新しい動作もエミュレートします。ドロップインするのは簡単です。ただし、無料ではなく、「方法」の質問には実際には答えません.

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

また、ダイアログについて説明している記事がいくつかあり、独自のラッパーを作成する場合に役立つソース コードがいくつかあります。

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

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

于 2011-02-12T18:07:40.127 に答える
0

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

  1. アプリケーションをXPで動作させたくない場合を除いて、これを使用しないでください。

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

于 2011-02-13T04:04:11.930 に答える