【问题标题】:FMX Delphi 10.2 Show form or please wait panel while task executedFMX Delphi 10.2 显示表单或执行任务时请等待面板
【发布时间】:2018-10-06 16:29:42
【问题描述】:

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

例如。

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

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

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

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

【问题讨论】:

    标签: delphi firemonkey delphi-10.2-tokyo


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多