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.