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.