TaskDialog 在我的 Delphi 程序中不起作用

Posted

技术标签:

【中文标题】TaskDialog 在我的 Delphi 程序中不起作用【英文标题】:TaskDialog not working in my Delphi Program 【发布时间】:2020-06-14 20:21:26 【问题描述】:

我使用的是 Delphi 10.4。这是一个 Windows VCL 应用程序。

我想在我的程序中将我所有的 ShowMessage、MessageDlg 和 MessageBox 调用转换为 TaskDialogs。当我尝试这样做时,我无法让 TaskDialog 显示任何内容。

所以我所做的就是创建一个新的最小 VCL 应用程序,只需向它添加一个按钮和一个 TaskDialog:

这是我的代码:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    TaskDialog1: TTaskDialog;
    procedure MyMessageBox;
    procedure Button1Click(Sender: TObject);
  private
     Private declarations 
  public
     Public declarations 
  end;                                                 

var
  Form1: TForm1;

implementation

procedure TForm1.MyMessageBox;
begin
  Form1.TaskDialog1.Caption := 'My Application';
  Form1.TaskDialog1.Title := 'Hello World!';
  Form1.TaskDialog1.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?';
  Form1.TaskDialog1.CommonButtons := [tcbClose];
  Form1.TaskDialog1.Execute;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyMessageBox;
end;

$R *.dfm

begin

Application.Run;

end.

效果很好。运行它并按下 Button1 时,我得到:

所以现在我去我的应用程序。我在主窗体中添加了一个按钮,并将 MyMessageBox 过程设置为:

procedure TLogoAppForm.MyMessageBox;
begin
  ShowMessage('ShowMessage ......................................');
  Application.MessageBox('Application.MessageBox ...........................', 'Error', 0);
  MessageDlg('MessageDlg ................................', mtWarning, [mbOk], 0);

  LogoAppForm.TaskDialog1.Caption := 'My Application';
  LogoAppForm.TaskDialog1.Title := 'Hello World!';
  LogoAppForm.TaskDialog1.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?';
  LogoAppForm.TaskDialog1.CommonButtons := [tcbClose];
  LogoAppForm.TaskDialog1.Execute;
end;

在我的应用程序中正确按下按钮会依次打开每个 ShowMessage、MessageBox 和 MessageDlg 窗口,但在关闭 MessageDlg 窗口后,TaskDialog 什么也没有出现。

有谁知道是什么原因导致 TaskDialog 在我的应用程序中无法工作以及我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您必须启用运行时主题才能使 VCL TTaskDialog 工作。转到 Project/Options/Application/Manifest 执行此操作。

【讨论】:

直接调用Win32 APITaskDialog()TaskDialogIndirect()函数是否也有同样的问题?如果是这样,那会给你一个HRESULT 错误代码,说明它失败的原因。如果函数没有失败,但 TTaskDialog 组件失败了,那么它必须是 10.4 中 TTaskDialog 中的错误

以上是关于TaskDialog 在我的 Delphi 程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自 v1.1 起 TaskDialog 中的命令链接中的垂直空间

如何在我的 delphi 应用程序中集成类似的 diagam 功能?

TaskDialog 引发异常:需要版本 6 中的 comctl32.dll

如何获取 Delphi 程序使用的内存

Delphi:如何创建像 Skype 一样的 Windows 自动启动应用程序?

在 C# 中使用 TaskDialog 时出现 EntryPointNotFoundException