По каким то причинам мне не удается прикрепить файл содержащий TWaitControl. Потому просто выложу его код полностью. Благо он совсем короткий.
Модуль универсальный. Его можно использовать не только для REST но и вообще для любых длительных операций которые нужно выполнять в потоках.
Обратите внимание, что в конструктор передается TForm. Это экземпляр ГЛАВНОЙ формы приложения. Это нужно потому что TWaitControl , будет перекрывать главную форму полупрозрачным квадратом, создавая эффект затемнения и заодно делая недоступным разные кнопки на форме. Рекомендую создавать TWaitControl в событии OnCreate главной формы:
TMainForm = class(TForm)
private
Wait: TWaitControl;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnException := OnException;
Wait := TWaitControl.Create(Self);
Wait.Title.Text := 'Ждите пожалуйста...';
end;
unit Wait.Control;
interface
uses
FMX.Forms, FMX.Objects, FMX.Types, FMX.Effects, FMX.StdCtrls, System.SysUtils, System.Classes, System.UITypes;
type
TWaitControl = class(TRectangle)
private
FWindow: TRectangle;
FTitle: TLabel;
FHadErrors: Boolean;
FWaiting: Boolean;
procedure DoErrorHandling(E: Exception; AOnError: TProc<TWaitControl, Exception>);
procedure DoOnCompleted(AOnComplete: TProc<TWaitControl>);
public
constructor Create(MainForm: TForm); reintroduce;
procedure Run(ATask: TProc<TWaitControl>; AOnComplete: TProc<TWaitControl> = nil;
AOnError: TProc<TWaitControl, Exception> = nil); virtual;
property Waiting: Boolean read FWaiting;
property HadErrors: Boolean read FHadErrors;
property Window: TRectangle read FWindow;
property Title: TLabel read FTitle;
end;
implementation
{ TWaitControl }
constructor TWaitControl.Create(MainForm: TForm);
begin
inherited Create(MainForm);
Parent := MainForm;
Align := TAlignLayout.Contents;
Visible := False;
Fill.Color := $4B000000;
FWindow := TRectangle.Create(Self);
FWindow.Parent := Self;
FWindow.Fill.Color := $96000000;
FWindow.Align := TAlignLayout.Center;
FWindow.Width := 250;
FWindow.Height := 65;
FTitle := TLabel.Create(FWindow);
FTitle.Parent := FWindow;
FTitle.Align := TAlignLayout.Client;
FTitle.StyledSettings := FTitle.StyledSettings - [TStyledSetting.Size, TStyledSetting.Style];
FTitle.TextSettings.Font.Size := 16;
// FTitle.TextSettings.Font.Style := [TFontStyle.fsBold];
with TAniIndicator.Create(FWindow) do
begin
Parent := FWindow;
Style := TAniIndicatorStyle.Circular;
Align := TAlignLayout.Left;
Margins.Left := 15;
Margins.Top := 15;
Margins.Right := 15;
Margins.Bottom := 15;
Width := Height;
Enabled := True;
end;
with TShadowEffect.Create(FWindow) do
Parent := FWindow;
end;
procedure TWaitControl.DoErrorHandling(E: Exception; AOnError: TProc<TWaitControl, Exception>);
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
FWaiting := False;
FHadErrors := True;
Visible := False;
if Assigned(AOnError) then
AOnError(Self, E);
end);
end;
procedure TWaitControl.DoOnCompleted(AOnComplete: TProc<TWaitControl>);
begin
TThread.Synchronize(nil,
procedure
begin
FWaiting := False;
Visible := False;
if Assigned(AOnComplete) then
AOnComplete(Self);
end);
end;
procedure TWaitControl.Run;
begin
Visible := True;
FWaiting := True;
TThread.CreateAnonymousThread(
procedure
begin
try
FHadErrors := False;
ATask(Self);
DoOnCompleted(AOnComplete);
except
on E:Exception do
DoErrorHandling(E, AOnError);
end;
// DoOnCompleted(AOnComplete);
end).Start;
end;
end.