FileMakerでクリックを拡張します。普通のシングルクリックの他、ダブルクリックや修飾キー(shiftやoption)+ クリックに反応するスクリプトを作りましょう。
FileMakerでよく使う小ネタがあるんですが、大抵の自作ファイルは固有の複雑さが混ざり込んでいて使い回せるような作りになっていません。なので自分のためにも初心に立ち返り、小ネタ単発リファレンス的なファイルを作っておこうとして、実際にいくつか作ってみました。こんなものが誰かの役に立つかどうかはともかく、少なくとも自分の役に立つのでついでに投稿してみようかなと。
ごちゃごちゃ言ってないで、今回はクリックを拡張するスクリプトです。ダブルクリックやシフト+クリックを判定して処理を振り分けます。
クリックを拡張するスクリプト
前回の [FileMaker] レコードを矢印キーで移動 [初心] ではクリックではなくキーストロークそのものの挙動でした。今回のはクリックの挙動です。
クリックの種類を使い分けるスクリプトを作りますが、どんなクリックがあるかというと、ここでは次の通りです。
- クリック
- ダブルクリック
- コマンド + クリック
- シフト + クリック
- オプション + クリック
- コントロール + クリック
クリックに反応して何かをするスクリプトなので、基本的にボタンにセットして使います。ですが、普通に考えてボタンの形をしたボタンをクリックする時に、ダブルクリックやシフト+クリックなんてことはしませんよね。想定しているのはボタンの形をしていないボタン、普通のボタンではないボタンだったりしますが、それが何かということには今回は踏み込みません。多分、次回の投稿で明らかになります。
スクリプトの概要
スクリプトの流れは、クリックを判定してそれぞれ別途用意したスクリプトを走らせます。
シフト+クリックされたらスクリプトAを、コマンド+クリックされたらスクリプトBを、ダブルクリックだったらスクリプトCを、てな感じです。
どのスクリプトを実行させるかを、スクリプト引数で指定します。ですのでスクリプト自体は汎用的に作られています。どのファイルにコピペで持っていっても使い回せます。
クリックスクリプト詳細
クリックを判定して処理をさせるスクリプトを「クリックスクリプト」とでも名付けておきます。では詳細行きます。
クリックを判定してスクリプトを名前で実行
クリックスクリプトはクリックを判定して、事前に用意しておいたスクリプトを振り分けて実行させます。
例えば安直に図のようなスクリプトを用意してあるとします。シフト+クリックされたら、「シフトクリック」を実行させます。仕組みとして、スクリプトを名前で実行します。スクリプト名のうっかり変更には注意が必要ですよ。
どのクリックならどのスクリプト名を実行させるのかという肝心の部分は、スクリプト引数で指定します。
スクリプト引数
スクリプト引数にはクリック種類とスクリプト名を羅列します。使い勝手が良いのでJSON書式を使いましょう。
JSONSetElement ( "{}" ; [ "shift" ; "シフトクリック" ; 1 ]; [ "command" ; "コマンドクリック" ; 1 ]; [ "control" ; "コントロールクリック" ; 1 ]; [ "option" ; "オプションクリック" ; 1 ]; [ "sClick" ; "シングルクリック" ; 1 ]; [ "wClick" ; "ダブルクリック" ; 1 ] )
これをスクリプト引数に書いておきます。shift、commandといったKey部分は、クリックスクリプトの中で指定している文言と同じなので変更したいなら合わせます。
引数のテンプレートをクリックスクリプトのコメントに書いておくと便利でしょう。引数を作成するにはテンプレをコピペしてスクリプト名のところだけ書き換えて利用します。
# テンプレ # JSONSetElement ( "{}" ; [ "shift" ; "スクリプト名" ; 1 ]; [ "command" ; "スクリプト名" ; 1 ]; [ "control" ; "スクリプト名" ; 1 ]; [ "option" ; "スクリプト名" ; 1 ]; [ "sClick" ; "スクリプト名" ; 1 ]; [ "wClick" ; "スクリプト名" ; 1 ] )
不要なものがあればスクリプト名を “” と空にするか、行そのものを消し去ります。
引数からスクリプトを保持する
さてクリックスクリプトでは最初に引数を読み込んでクリック種類とスクリプト名を変数に保持します。引数がJSONなので JSONGetElementを使った簡素な一行で変数を作っていきます。
#------------------------------------------ #引数がなければ終了 #------------------------------------------ If [ IsEmpty ( Get ( スクリプト引数 ) ) ] 現在のスクリプト終了 [ ] End If #------------------------------------------ #引数からスクリプト名を変数に保持 #------------------------------------------ #シフト+クリック 変数を設定 [ $shift; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "shift" ) ] #コマンド+クリック 変数を設定 [ $command; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "command" ) ] #コントロールクリック 変数を設定 [ $control; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "control" ) ] #オプション+クリック 変数を設定 [ $option; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "option" ) ] #シングルクリック 変数を設定 [ $sClick; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "sClick" ) ] #ダブルクリック 変数を設定 [ $wClick; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "wClick" ) ]
例えば変数 $shift には引数のkey「shift」に対応するスクリプト名「シフトクリック」が値として保持されます。
ここまでがスクリプトの前段、準備編でした。
修飾キー + クリックを判定: Get ( アクティブ修飾キー )
ここからが本番、クリックの判定とスクリプト実行を行います。
修飾キーが押されていることを確認する関数は Get ( アクティブ修飾キー ) です。Get ( アクティブ修飾キー ) = 1 ならシフトキーが押されていると判定されます。
修飾キーの番号はFileMakerのヘルプに載っていますがここにもメモっときます。
Shift 1 Caps Lock 2 control(Ctrl) 4 option(Alt) 8 command 16
この数字を使って条件分岐していきます。
If [ Get ( アクティブ修飾キー ) = 1 ] If [ not IsEmpty ( $shift ) ] スクリプト実行 [ 名前で; $shift ] End If else if [ Get ( アクティブ修飾キー ) = 16 ] . . .
シフトクリックなら、変数 $shift の値がある場合にそれを名前で実行させます。
Get ( アクティブ修飾キー ) の番号についてですが、二つのキー同時押しのときは、数字の合計を使うそうです。コマンド+オプション なら 24 ですか。そういうのも使うなら、クリックスクリプトの条件分岐を増やし、テンプレも合わせて増やしましょう。
ダブルクリック判定
ダブルクリックの判定スクリプトは、以前どこかでお見かけしたスクリプトの流用、丸パクリです。元ネタがどこにあったのかもう分からないので原典も示せず申し訳ありません。使わせていただいております。
#ダブルクリックとシングルクリック If [ IsEmpty ( $$wc ) ] # $$wcが存在しなければシングルクリックと判定 # $$wc を作って0.26秒後に消す 変数を設定 [ $$wc; 値:1 ] スクリプト一時停止/続行 [ 間隔(秒): .26 ] 変数を設定 [ $$wc ] #シングルクリックの処理 If [ not IsEmpty ( $sClick ) ] スクリプト実行 [ 名前で; $sClick ] End If Else # $$wcが存在していればダブルクリックと判定 # $$wcを消す 変数を設定 [ $$wc ] # ダブルクリックの処理 If [ not IsEmpty ( $wClick ) ] スクリプト実行 [ 名前で; $wClick ] End If # 一時停止が残ることがあるので全スクリプト終了を使っておく 全スクリプト終了 End If
$$wc というおトイレみたいなグローバル変数を利用して判定しています。$$wcが存在していればダブルクリックと判定。ない場合はシングルクリックと判定します。シングルクリックなら $$wc に 1 を入れてグローバル変数を作成しますが、0.26秒後に消します。つまり、消えるまでの間に再度クリックがあればダブルクリックと判定されるということです。
これ考えた人すごいですね。一時停止中にクリックが効くなんて思いもしなかった。
最後の全スクリプト終了ですが、何かの加減で一時停止が残ったり、そのせいで次のスクリプトが進まず妙なことになったことがあって、それで入れてます。もしかしたら「全」では駄目かもしれないし、不要かもしれないし、よく判りませんが経験上こうなってます。
ダブルクリックを使用しない場合
ダブルクリック判定のために僅かな一時停止があるので、シングルクリック時もその影響を受け遅延が生じます。軽快なクリック感を妨げますね。
ダブルクリックが不要の場合はダブルクリックの判定をしないようにしておきました。
If [ IsEmpty ( $wClick ) ]
#ダブルクリックが空の場合、直接シングルクリックのスクリプトを発動
If [ not IsEmpty ( $sClick ) ]
スクリプト実行 [ 名前で; $sClick ]
End If
End If
ダブルクリック判定の前にこれを置いておきましょう。
スクリプト全体
そんなわけで以上です。
細切れに書いたので、スクリプト全体を掲載しておきます。IF の羅列部分は少し整えて以下の形に収めています。
if 何らかの修飾キーが押されている キー毎の処理 キー毎の処理 ... else if ダブルクリックの処理がない シングルクリックの処理 else それ以外 ダブルクリック判定とその処理 end if
#=============================================================== #クリックからスクリプトを振り分けるスクリプト # 引数のテンプレ - コピペしてスクリプト名の部分を書き換え、このスクリプトの引数とする # JSONSetElement ( "{}" ; [ "shift" ; "スクリプト名" ; 1 ]; [ "command" ; "スクリプト名" ; 1 ]; [ "control" ; "スクリプト名" ; 1 ]; [ "option" ; "スクリプト名" ; 1 ]; [ "sClick" ; "スクリプト名" ; 1 ]; [ "wClick" ; "スクリプト名" ; 1 ] ) # 不要の項目は "" と空欄にしておく #参考:修飾キー シフト = 1 コマンド = 16 コントロール = 4 オプション = 8 #=============================================================== #------------------------------------------ #引数がなければ終了 #------------------------------------------ If [ IsEmpty ( Get ( スクリプト引数 ) ) ] 現在のスクリプト終了 [ ] End If #------------------------------------------ #引数からスクリプト名を変数に保持する #------------------------------------------ #シフト+クリック 変数を設定 [ $shift; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "shift" ) ] #コマンド+クリック 変数を設定 [ $command; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "command" ) ] #コントロールクリック 変数を設定 [ $control; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "control" ) ] #オプション+クリック 変数を設定 [ $option; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "option" ) ] #シングルクリック 変数を設定 [ $sClick; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "sClick" ) ] #ダブルクリック 変数を設定 [ $wClick; 値:JSONGetElement ( Get ( スクリプト引数 ) ; "wClick" ) ] #------------------------------------------ #クリックを判定してスクリプトを名前で発動 #------------------------------------------ If [ Get ( アクティブ修飾キー ) > 0 ] #修飾キーが押されている場合 If [ Get ( アクティブ修飾キー ) = 1 ] #シフト+クリック If [ not IsEmpty ( $shift ) ] スクリプト実行 [ 名前で; $shift ] End If Else If [ Get ( アクティブ修飾キー ) = 16 ] #コマンド+クリック If [ not IsEmpty ( $command ) ] スクリプト実行 [ 名前で; $command ] End If Else If [ Get ( アクティブ修飾キー ) = 8 ] #オプション+クリック If [ not IsEmpty ( $option ) ] スクリプト実行 [ 名前で; $option ] End If Else If [ Get ( アクティブ修飾キー ) = 4 ] #コントロール+クリック If [ not IsEmpty ( $control ) ] スクリプト実行 [ 名前で; $control ] End If End If Else If [ IsEmpty ( $wClick ) ] #ダブルクリックが空の場合 #シングルクリックのスクリプトを発動 If [ not IsEmpty ( $sClick ) ] スクリプト実行 [ 名前で; $sClick ] End If Else #その他(ダブルクリックがある場合) #ダブルクリックとシングルクリックの判定 If [ IsEmpty ( $$wc ) ] #シングルクリック 変数を設定 [ $$wc; 値:1 ] スクリプト一時停止/続行 [ 間隔(秒): .26 ] 変数を設定 [ $$wc ] #シングルクリックの処理 If [ not IsEmpty ( $sClick ) ] スクリプト実行 [ 名前で; $sClick ] End If Else #ダブルクリック 変数を設定 [ $$wc ] #ダブルクリックの処理 If [ not IsEmpty ( $wClick ) ] スクリプト実行 [ 名前で; $wClick ] End If #一時停止が残る問題があるので全スクリプト終了を使っておく 全スクリプト終了 End If End If
コピペで流用できるクリック判定のスクリプトでした。
サンプルファイルダウンロード