モバイルアプリで、ボタンを普通に押したときと、長押ししたときとで、処理を分けたいことってありますよね。
長押しを検知するのには Gesture を使います。(iOSの場合 ControlType プロパティの動作もあるので、ここでは Android 限定という書き方をしています)
ただし、ボタンのクリックイベント (OnClick) も発生するので長押しと区別させたい場合は、フラグを用意するなどの処理が必要です。
サンプルアプリ
ボタンに対する長押しと、通常のクリックと処理を分けています。
フォーム上に TToolBar を置き、TToolBar の上に TButton を置いています。
残りのエリアには ListBox を Align = Client で配置して、長押しの時には LongTap, 普通のクリックの時には Click と ListBox 内に書くだけの簡単なものです。
オブジェクトインスペクタで Button1.Touch.InteractiveGestures の LongTap を True に設定し、Button1 の OnClick, OnGesture, Form1 の OnCreate イベントハンドラを作成しておきます。
サンプルコード
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
FMX.ListBox, FMX.StdCtrls, FMX.Controls.Presentation;
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Gesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private 宣言 }
mLongTapFlag: Boolean; // add: 長押し管理フラグ
public
{ public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
if mLongTapFlag then begin
// 長押しの時はフラグをリセット
// このサンプルコードではOnClickイベントを抜ける
mLongTapFlag := False;
Exit;
end;
// 通常のクリックの時には ListBoxにClickと書く
ListBox1.Items.Add('OnClick');
end;
procedure TForm1.Button1Gesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
// 念のためにフラグを初期化
mLongTapFlag := False;
// ジェスチャーの種類が長押し(LongTap)かを判断
if EventInfo.GestureID = igiLongTap then begin
// 長押しであればフラグをセットして
// ListBoxに LongTapと書く
mLongTapFlag := True;
ListBox1.Items.Add('LongTap');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mLongTapFlag := False; // フラグ初期化
end;
end.