Firemonkeyジェスチャーイベント処理

この情報についてはC++ Builder 10.4.1(Sydney)で確認した情報なので、将来変わる可能性がある。
と言うか、昔と変わった部分についてEmbarcaderoがドキュメントの更新をしていないための備忘だ。

まず、ジェスチャーのIDの定義だが、現時点でSystem.UITypes.hppに移動している。Fmx.UITypes.hppではない。
昔igZoomなどとしているのであれば、名前がigiZoomに変わっているので注意が必要だ。

次に、上記IDと、TGestureEventIDでのGestureIDでは型が異なる。IDはSystem::Word型、GestureIDはTGestureID型で、比較用の関数は準備されていないので以下のようなコードを書くとエラーが表示される。なぜかSystem:Wordへの型変換関数はあるようで、代入やswitch文は通る。

  if( EventInfo.GestureID == igiZoom ) ;// オーバーロード演算子==エラー

  if( System::Word(EventInfo.GestureID) == igiZoom ) ; // OK

  System::Word w = EventInfo.GestureID; // OK

  switch(  EventInfo.GestureID ) 
  {
    case igiZoom: break; // OK
  }

比較関数は用意しておいて欲しいと思う。

ZoomなどのインタラクティブジェスチャーではgfInertiaで途中経過が得られるように見えるが、gfInertiaは発生しない。
途中経過を得るには以下のようなコードを書く。

void __fastcall TForm1::ImageViewer1Gesture(TObject *Sender, const TGestureEventInfo &EventInfo,
          bool &Handled)
{
  if( System::Word(EventInfo.GestureID) == igiZoom )
  {
    if( (!EventInfo.Flags.Contains( TInteractiveGestureFlag::gfBegin ) )
      &&(!EventInfo.Flags.Contains( TInteractiveGestureFlag::gfEnd   ) ) )
    { 
      // 途中経過の処理コード
    }
  }

C++ Builderであればセットが空のチェックでもいける

void __fastcall TForm1::ImageViewer1Gesture(TObject *Sender, const TGestureEventInfo &EventInfo,
          bool &Handled)
{
  if( System::Word(EventInfo.GestureID) == igiZoom )
  {
    if( EventInfo.Flags.Empty() )
    { 
      // 途中経過の処理コード
    }
  }