FMX Delphi 10.2 Показать форму или подождите, пока будет выполнена задача - PullRequest
0 голосов
/ 06 октября 2018

У меня есть несколько задач по нажатию кнопки.

например.

  1. Показать форму или подождите, пожалуйста, панель ....
  2. Загрузка данных из базы данных (продолжительность 5-10 секунд)
  3. Очистить все поля TEdit
  4. Скрыть форму или подождите, пожалуйста, панель ....
  5. ShowMessage(«завершено»)

Возможно ли это? После нажатия кнопки «Показать», пожалуйста, подождите, пока панель или форма не завершат эту панель.

Как синхронизировать выполнение задач одну за другой.

Или любое другое простое решение.

1 Ответ

0 голосов
/ 06 октября 2018

Это простой пример, который создает «заполнитель», который выглядит следующим образом:

enter image description here

Прямоугольник имеет черный фон и содержит макеткоторый выровнен по 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, так что вы не увидите сразу прямоугольник.Обратите внимание, что я создал анимацию в компоненте дуги, чтобы вы могли видеть ее вращение:

enter image description here

Таким образом, вы можете имитировать загрузочный счетчик,Затем я добавил этот код в событие 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!

...