矢印キーでレコード送り。スクリプトトリガOnLayoutKeystrokeにセットするスクリプトを作って実現します。
FileMakerでよく使う小ネタがあるんですが、よく使う割には再現しようとして「どうやるんだっけ?」と既存ファイルを漁ったりします。ところが大抵の自作ファイルは固有の複雑な処理を混ぜ込んでいたりして単独で使い物になりません。基本部分だけの簡素なのはないんかいっと己にツッコむこともしばしば。なので自分のためにも初心に立ち返り、小ネタ単発リファレンス的なファイルを作っておこうとして、実際にいくつか作ってみました。
こんなものが誰かの役に立つかどうかはともかく、少なくとも自分の役に立つのでついでなので投稿にも利用してみようかなと。
ごちゃごちゃ言ってないで、今回はレコード移動です。
矢印キーでレコード移動
レコードがリストのように並んでいるとき、人は矢印キーでレコード移動したくなります。リストなら上下で、カード型なら上下に加えて左右キーでもレコード移動したいかもしれません。
トリガ OnLayoutKeystroke
レイアウトのスクリプトトリガ OnLayoutKeystroke にスクリプトを仕込みます。指定したキーが押されたときにスクリプトが発動します。
Code ( Get ( トリガキー入力 ) ) を使ったスクリプト
基本は、条件分岐で特定のキーが押されたときに何をするかを書くだけです。
「特定キーが押されたとき」は、Code ( Get ( トリガキー入力 ) )
を使います。具体的なトリガキーの番号はFileMakerのヘルプに載っていますが見つけにくいので、主なものをここにメモっておきます。
トリガキー backspace 8 tab 9 enter 10 return 13 escape 27 ← 28 ↑ 29 → 30 ↓ 31 space 32 delete 127
今回は矢印キーなので、28, 29, 30, 31を使いますね。
スクリプトの中で if 文にキーを当てはめて作っていきます。その上で、28と29なら「前へ」の処理、30と31なら「次へ」の処理をさせるという案配です。
if [ Code ( Get ( トリガキー入力 ) ) = 28 or Code ( Get ( トリガキー入力 ) ) = 29] <前への処理> else if [Code ( Get ( トリガキー入力 ) ) = 30 or Code ( Get ( トリガキー入力 ) ) = 31 ] <次への処理> end if
「前へ」「次へ」の処理にはレコード移動のスクリプトステップを当てはめればいいだけですね。
if [ Code ( Get ( トリガキー入力 ) ) = 28 or Code ( Get ( トリガキー入力 ) ) = 29 ] レコード/検索条件/ページへ移動 [ 前の ] else if [Code ( Get ( トリガキー入力 ) ) = 30 or Code ( Get ( トリガキー入力 ) ) = 31 ] レコード/検索条件/ページへ移動 [ 次の ] end if
簡単ですね。基本は以上です。
でも少し拡張を考えましょう。ポータルにも対応したい。
ポータル内でも矢印キーで移動
レコードではなく、ポータルの行を矢印キーで移動したいこともあります。
ポータルとレコードが同一(セルフポータル)ならいいですが、別物である場合もあります。「レコードへ移動」と「ポータル内の行へ移動」を使い分ける必要があります。条件分岐に「もしポータルがアクティブならポータル行移動、そうでなければレコード移動」を加えましょう。
ポータルがアクティブか
ポータルがアクティブかどうかを見分けるのは、例えばポータルに名前を付けて、それがアクティブなのかを見るということが考えられます。
If [ Get ( アクティブレイアウトオブジェクト名 ) = "ポータル名" ]
が、「オブジェクト名」という個別の事情が入り込むので若干汎用性に欠けます。個別の事情はファイルによって必須で現実味がありますが、もっと単純かつ汎用的に判定します。ポータルの行番号を取得する関数を使います。
if [ Get ( アクティブポータル行番号 ) > 0 ]
アクティブポータル行番号が 0 より大きければ確実にポータルにいます。
これで、移動すべきなのがポータル行かレコードかを条件で振り分けられます。
if [ Get ( アクティブポータル行番号 ) > 0 ] <トリガキーと移動の条件分岐: ポータル編> else <トリガキーと移動の条件分岐: レコード編> end if
ポータルかそうでないかだけの条件分岐ですが、リストや表のレイアウトなのかフォームなのかで分けたい場合、さらに分岐させます。
一例としてこんな感じで。
If [ Get ( アクティブポータル行番号 ) > 0 ] #ポータルにいる場合 ... 上下キーでポータル移動 If [ Code ( Get ( トリガキー入力 ) ) = 29 ] ポータル内の行へ移動 [ 選択; 前の ] Else If [ Code ( Get ( トリガキー入力 ) ) = 31 ] ポータル内の行へ移動 [ 選択; 次の ] End If Else #その他(レコード)の場合 ... 上下キーでレコード移動 If [ Code ( Get ( トリガキー入力 ) ) = 29 ] レコード/検索条件/ページへ移動 [ 前の ] Else If [ Code ( Get ( トリガキー入力 ) ) = 31 ] レコード/検索条件/ページへ移動 [ 次の ] End If If [ Get ( レイアウト表示状態 ) = 0 ] #フォーム形式の場合 ... 上下に加えて左右キーでもレコード移動 If [ Code ( Get ( トリガキー入力 ) ) = 28 ] レコード/検索条件/ページへ移動 [ 前の ] Else If [ Code ( Get ( トリガキー入力 ) ) = 30 ] レコード/検索条件/ページへ移動 [ 次の ] End If End If End If
フィールド内にいるときは除外
もっと根本的に重要なことがあります。何かのフィールド内にカーソルがある場合を除外します。フィールド内で何かしら編集をしている最中に矢印キーでレコード移動してしまったら悲惨です。フィールドがアクティブなときは何もしないで終了しましょう。
#フィールドにいる場合は何もしない
if [ not IsEmpty ( Get ( アクティブフィールド名 ) ) ]
現在のスクリプト終了
end if
フィールドにいるかどうかは、アクティブフィールド名を取得してみればわかります。取得できればフィールドにいますから終了します。最初にこれを書いておきましょう。
まとめるとスクリプトは次のような流れになりました。一例として。
#フィールドにいる場合は何もしない if [ not IsEmpty ( Get ( アクティブフィールド名 ) ) ] 現在のスクリプト終了 end if If [ Get ( アクティブポータル行番号 ) > 0 ] #ポータルの場合 ... 上下キーでポータル移動 If [ Code ( Get ( トリガキー入力 ) ) = 29 ] ポータル内の行へ移動 [ 選択; 前の ] Else If [ Code ( Get ( トリガキー入力 ) ) = 31 ] ポータル内の行へ移動 [ 選択; 次の ] End If Else #それ以外(レコード)の場合 ... 上下キーでレコード移動 If [ Code ( Get ( トリガキー入力 ) ) = 29 ] レコード/検索条件/ページへ移動 [ 前の ] Else If [ Code ( Get ( トリガキー入力 ) ) = 31 ] レコード/検索条件/ページへ移動 [ 次の ] End If If [ Get ( レイアウト表示状態 ) = 0 ] #フォーム形式の場合 ... 左右キーでもレコード移動 If [ Code ( Get ( トリガキー入力 ) ) = 28 ] レコード/検索条件/ページへ移動 [ 前の ] Else If [ Code ( Get ( トリガキー入力 ) ) = 30 ] レコード/検索条件/ページへ移動 [ 次の ] End If End If End If
ここではリストとフォームで分けていますが、分ける必要なければもっと短くなります。
さらに条件を拡張する
使用ファイルの特徴に応じて、さらに条件分岐を増やし拡張するケースがあります。
例えば、リレーションの別テーブルをポータルで表示していたり、特定一意のテーブルでの挙動を取り決めたい場合など。
上記の例にならって if の羅列をどんどん書いていってもいいのですが、条件が長くなってくると羅列がうざく思えてきます。
- ポータルの行を上下キーで移動
- レコードを上下キーで移動
- レコードを上下左右キーで移動
結局はこの三つのどれかを発動させるだけですからね。
そこで、条件分岐が多い場合、条件とレコード移動の部分を分けたりします。
前段で条件だけを羅列して某かの変数に値を与えておき、その変数の値に応じた処理を後段で走らせるという二段構えです。
例えば上記三つの動作を仮に 1 2 3 とし、前段条件分岐で変数$move の値を 1 2 3 のいずれかにセット、後段でもし$move が 1 なら、2なら、3なら、と処理します。
さらにもっと・・・
さらにもっと拡張していくと、キーによる発動がレコード移動だけで済まなくなったり、走らせるスクリプトが「レコード/検索条件/ページへ移動」スクリプトステップでは済まなくなったり、複雑化してきます。前段後段ではなく、そもそもスクリプトを分けたりします。
複雑なキーと挙動のスクリプトは稿を改めるとして、ここでは基本の仕草を初心に立ち返ってポストしてみました。複雑になってきても基本をよく把握していれば怯むこともありません。
一応、ここで使ったサンプルファイルを付けておきます。過度の信頼は不要です。参考程度に。
サンプルファイル ダウンロード
矢印キーで移動.fmp12.zip