Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FMX Delphi 10.2执行任务时显示表单或请等待面板_Delphi_Firemonkey_Delphi 10.2 Tokyo - Fatal编程技术网

FMX Delphi 10.2执行任务时显示表单或请等待面板

FMX Delphi 10.2执行任务时显示表单或请等待面板,delphi,firemonkey,delphi-10.2-tokyo,Delphi,Firemonkey,Delphi 10.2 Tokyo,我有几个任务在按钮点击 例如 显示表单或请稍候面板 从数据库加载数据(持续5-10秒) 清除所有TEdit字段 隐藏表单或请等待面板 ShowMessage('已完成') 是否可能在点击按钮后显示“请等待”面板或窗体,并在所有操作完成后隐藏该面板 如何同步逐个执行任务 或任何其他简单的解决方案。这是一个创建“占位符”的简单示例,如下所示: procedure TForm1.FormCreate(Sender: TObject); begin TTask.Run(procedure

我有几个任务在按钮点击

例如

  • 显示表单或请稍候面板
  • 从数据库加载数据(持续5-10秒)
  • 清除所有TEdit字段
  • 隐藏表单或请等待面板
  • ShowMessage('已完成')
  • 是否可能在点击按钮后显示“请等待”面板或窗体,并在所有操作完成后隐藏该面板

    如何同步逐个执行任务


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

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

    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;
    

    矩形有黑色背景,包含与
    中心对齐的布局
    ;在里面你可以找到一个标签(与
    顶部对齐)和一个弧形(与
    客户端对齐)。代码如下:

    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事件处理程序中