FMX Delphi 10.2 任务执行时显示表单或请等待面板
FMX Delphi 10.2 Show form or please wait panel while task executed
我有几个按钮点击任务。
例如
- 显示表格或请等待面板.....
- 从数据库加载数据(持续时间 5-10 秒)
- 清除所有 TEdit 字段
- 隐藏表格或请等待面板.....
- ShowMessage('completed')
是否可以在点击按钮后显示请等待面板或表单并在所有完成后隐藏该面板。
如何同步执行任务。
或任何其他简单的解决方案。
这是一个创建 "placeholder" 的简单示例,如下所示:
该矩形具有黑色背景并包含与 Center
对齐的布局;在里面你可以找到一个标签(对齐到Top
)和一个弧(对齐到Client
)。代码在这里:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 418
ClientWidth = 490
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
DesignerMasterStyle = 0
object Rectangle1: TRectangle
Align = Client
Fill.Color = xFF222222
Size.Width = 490.000000000000000000
Size.Height = 418.000000000000000000
Size.PlatformDefault = False
Visible = False
object Layout1: TLayout
Align = Center
Size.Width = 170.000000000000000000
Size.Height = 102.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object Label1: TLabel
Align = Top
StyledSettings = [Family, Size, Style]
Size.Width = 170.000000000000000000
Size.Height = 41.000000000000000000
Size.PlatformDefault = False
TextSettings.FontColor = claWhite
TextSettings.HorzAlign = Center
Text = 'Please wait'
TabOrder = 0
end
object Arc1: TArc
Align = Center
Size.Width = 50.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
Stroke.Color = claCoral
EndAngle = -90.000000000000000000
object FloatAnimation1: TFloatAnimation
Enabled = True
Duration = 1.000000000000000000
Loop = True
PropertyName = 'RotationAngle'
StartValue = 0.000000000000000000
StopValue = 360.000000000000000000
end
end
end
end
end
矩形的Visible
属性设置为False,这样您就不会立即看到矩形。请注意,我在 arc 组件中创建了一个动画,以便您可以看到它在旋转:
通过这种方式,您可以模仿加载微调器。然后我在表单的 OnCreate
事件中添加了这段代码,作为您如何执行此操作的示例。
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;
当然,您应该将此代码放在 ButtonClick 而不是 FormCreate 事件处理程序中!
我有几个按钮点击任务。
例如
- 显示表格或请等待面板.....
- 从数据库加载数据(持续时间 5-10 秒)
- 清除所有 TEdit 字段
- 隐藏表格或请等待面板.....
- ShowMessage('completed')
是否可以在点击按钮后显示请等待面板或表单并在所有完成后隐藏该面板。
如何同步执行任务。
或任何其他简单的解决方案。
这是一个创建 "placeholder" 的简单示例,如下所示:
该矩形具有黑色背景并包含与 Center
对齐的布局;在里面你可以找到一个标签(对齐到Top
)和一个弧(对齐到Client
)。代码在这里:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 418
ClientWidth = 490
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
DesignerMasterStyle = 0
object Rectangle1: TRectangle
Align = Client
Fill.Color = xFF222222
Size.Width = 490.000000000000000000
Size.Height = 418.000000000000000000
Size.PlatformDefault = False
Visible = False
object Layout1: TLayout
Align = Center
Size.Width = 170.000000000000000000
Size.Height = 102.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object Label1: TLabel
Align = Top
StyledSettings = [Family, Size, Style]
Size.Width = 170.000000000000000000
Size.Height = 41.000000000000000000
Size.PlatformDefault = False
TextSettings.FontColor = claWhite
TextSettings.HorzAlign = Center
Text = 'Please wait'
TabOrder = 0
end
object Arc1: TArc
Align = Center
Size.Width = 50.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
Stroke.Color = claCoral
EndAngle = -90.000000000000000000
object FloatAnimation1: TFloatAnimation
Enabled = True
Duration = 1.000000000000000000
Loop = True
PropertyName = 'RotationAngle'
StartValue = 0.000000000000000000
StopValue = 360.000000000000000000
end
end
end
end
end
矩形的Visible
属性设置为False,这样您就不会立即看到矩形。请注意,我在 arc 组件中创建了一个动画,以便您可以看到它在旋转:
通过这种方式,您可以模仿加载微调器。然后我在表单的 OnCreate
事件中添加了这段代码,作为您如何执行此操作的示例。
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;
当然,您应该将此代码放在 ButtonClick 而不是 FormCreate 事件处理程序中!