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() ) { // 途中経過の処理コード } }