Delphi FireMonkey Android / Windows の違い 2020/11/17

FireMonkey で Android アプリを作っていますが、
Application.ProcessMessages; が期待通りに動かないようなので、Timer を使ってみました。
もっとスマートな方法があると思うのですが、メモとして残しておきます。

ボタンをクリックすると、Memo に 'BEGIN' と表示、5000ミリ秒後に'END' と表示されるはずなのですが、
Android では、5000ミリ秒後に 'BEGIN', 'END' がまとめて表示されます。
Windpows の場合、Application.ProcessMessages; で期待通りに動きますが、Android では意味がないようです。
スレッドを使う方法も試してみたのですが、使い方が間違っているのか効果なし。
コードが分かりにくいですが、Timer で処理を分けると期待どおりに動きました。


unit Unit8;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox,
  FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm8 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
    CMDMODE : integer;
  end;

var
  Form8: TForm8;

implementation

{$R *.fmx}

// Android では 5000ミリ秒後に 'BEGIN' と 'END' が表示される
// Windows では Application.ProcessMessages; により、
//   即座に'BEGIN'、5000ミリ秒後に'END'が表示される
procedure TForm8.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add('BEGIN');
  // Windows では有効、Android では意味ない
  Application.ProcessMessages;

  Sleep(5000);

  Memo1.Lines.Add('END');
end;

// Android でも即座に'BEGIN'、5000ミリ秒後に'END'が表示される
procedure TForm8.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Add('BEGIN');
  CMDMODE := 101;
  Timer1.Interval := 1;
  Timer1.Enabled := True;
end;

procedure TForm8.Timer1Timer(Sender: TObject);
begin
  case CMDMODE of
    101:begin
          Timer1.Enabled := false;

          Sleep(5000);

          CMDMODE := 102;
          Timer1.Enabled := True;
    end;
    102:begin
          Timer1.Enabled := false;
          Memo1.Lines.Add('END');
    end;
  end;
end;

end.