在 Delphi VCL 应用程序中,我想创建一个“等待”消息窗口,因为这是一个耗时的过程(本例中的一个大循环)。
在开始耗时的过程之前,我尝试了以下要执行的操作。
- 创建一个包含消息的简单窗口的新形式。
- 使用 messagedlg 创建一条消息。
- 甚至更改主表单上的 TLabel.Caption(执行耗时过程的表单)。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
popUpMessage;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
dialog : TForm;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i, j, k :LongInt;
begin
{1}
popUpMessage.Form2 := TForm2.Create(nil); //also tried with Create(self)
Form2.show;
{2}
dialog := CreateMessageDialog ('Wait',TMsgDlgType.mtWarning, mbYesNoCancel);
dialog.Show;
{3}
messagedlg('Wait',mtError, mbOKCancel, 0);
{4}
Label1.Caption := 'Wait';
//Time consuming process
for i := 0 to 200000 do
for j := 0 to 20000do
k := i-j;
end;
end.
在 {1} 和 {2} 的情况下,弹出表单出现在耗时的过程开始之前,但它们的组件仅在完成后才绘制。
情况 {3} 保持执行,直到模式对话框关闭。
如果{4}在耗时的过程完成后标题会发生变化。
如何异步创建消息,使其完全绘制而不等待其父进程?