procedure TForm1.FormCreate(Sender: TObject);
begin
TTask.Run(procedure
begin
TThread.Synchronize(nil, procedure
begin
Rectangle1.Visible := true;
//Rectangle1.BringToFront;
// ^ call the above if needed, just to be sure
// that you'll always see the rectangle on screen
end);
Sleep(4000);
TThread.Synchronize(nil, procedure
begin
Rectangle1.Visible := false;
ShowMessage('Finish!');
end);
end);
end;
Sleep(4000)模拟了一个长任务,这段代码应该替换为你的任务。实际上我会这样做:
procedure TForm1.FormCreate(Sender: TObject);
begin
TTask.Run(procedure
var
arr: array [0..1] of ITask;
begin
TThread.Synchronize(nil, procedure
begin
Rectangle1.Visible := true;
Rectangle1.BringToFront;
end);
arr[0] := TTask.Run(procedure
begin
//load data from the database
end);
arr[1] := TTask.Run(procedure
begin
//something else
end);
//this call is blocking but you are calling this in a worker thread!
//your UI won't freeze and at the end you'll see the message appearing
TTask.WaitForAll(arr);
TThread.Synchronize(nil, procedure
begin
Rectangle1.Visible := false;
ShowMessage('Finish!');
end);
end);
end;
1条答案
按热度按时间ndasle7k1#
这是一个简单的例子,它创建了一个“占位符”,看起来像这样:
该矩形具有黑色背景并包含与
Center
对齐的布局;在里面你可以找到一个标签(与Top
对齐)和一个弧(与Client
对齐)。代码如下:矩形的
Visible
属性被设置为False,这样你就不会立即看到矩形。请注意,我在arc组件中创建了一个动画,这样你就可以看到它在旋转:这样你就可以模拟一个加载微调器。然后我在表单的
OnCreate
事件中添加了这段代码,作为你如何做到这一点的例子。Sleep(4000)
模拟了一个长任务,这段代码应该替换为你的任务。实际上我会这样做:当然,您应该将此代码放在ButtonClick中,而不是FormCreate事件处理程序中!