首页 > 解决方案 > FMX Delphi 10.2 显示表单或执行任务时请等待面板

问题描述

我有几个关于按钮点击的任务。

例如。

  1. 显示表格或请等待面板....
  2. 从数据库加载数据(持续时间 5-10 秒)
  3. 清除所有 TEdit 字段
  4. 隐藏表格或请等待面板....
  5. ShowMessage('完成')

是否有可能单击按钮显示后请等待面板或表单,并在所有完成后隐藏该面板。

如何同步执行一项一项任务。

或任何其他简单的解决方案。

标签: delphifiremonkeydelphi-10.2-tokyo

解决方案


这是一个创建“占位符”的简单示例,如下所示:

在此处输入图像描述

该矩形具有黑色背景并包含与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 事件处理程序中!


推荐阅读