細川さんと高橋さんの会話に食いついてみました。
https://twitter.com/pik/status/345370408607952897
つまりは…
unit Unit1;
interface
uses System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, Generics.Collections, System.Actions, FMX.ActnList;
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { private 宣言 } FQueue: TQueue<TAction>; protected { protected 宣言 } procedure UpdateActions; override; public { public 宣言 } property Queue: TQueue<TAction> read FQueue write FQueue; end;
var Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject); // フォーム作成時 begin // キューを作成 FQueue := TQueue<TAction>.Create; end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); // フォーム終了確認時 begin // キューが存在する場合には終了しない(念のため) CanClose := (FQueue.Count = 0); end;
procedure TForm1.FormDestroy(Sender: TObject); // フォーム破棄時 begin // キューを破棄 FQueue.Free; end;
procedure TForm1.UpdateActions; begin inherited; // キュー内のアクションを実行 if FQueue.Count > 0 then FQueue.Dequeue.Execute; end;
end.
このような記述をして TActionList をフォームに貼り、実行したいアクションを
procedure TForm1.Button1Click(Sender: TObject); begin Queue.Enqueue(Action1); end;
こんな感じで突っ込めばいいという事なのでしょう…多分。いや、TAction でなくてはならない訳ではありませんが。
※ TActionList (FMX) は XE3 以降で使えます。
|