🐱

FileMakerの繰り返しフィールド活用法

3 min read

はじめに

繰り返しフィールドというと、実運用では何かと推奨されない風潮も多いですが(個人的には嫌いではないです)、それはそれとして、一風変わった使い方をご紹介したいと思います。

ズバリ、繰り返しフィールドでドット絵を描くです。

ドット絵とはこういうのですね。

出典)ピカチュウのドット絵

升目をポチポチとクリックしてドット絵を描いていく、といったもの自体はFileMakerでも作れそうだなと想像できるかと思いますが、升目をフリーハンド(ペン的な)で描く(塗る) といった処理の実現がFileMakerネイティブではなかなか厄介です。


どうやって連続して升目の色を変えるのか

それは、条件付き書式の評価のされ方を利用します。

条件付き書式は、様々なタイミングで評価されますが例えば、

  • レイアウトがロードされた
  • マウスでポイントした(いわゆるマウスオーバー)
  • フォーカスされた後に、フォーカスが外れた

等々、色々あります。

※オブジェクトの種類にもよりますし、またこれ以外の条件もあります

そして、連続して色を変える(塗る or 消す)仕組みは、マウスでポイント(マウスオーバー)した時に評価されるというのを利用します。


手順その1

まず、dataのレコードをポータルとしてdisplayに表示する、といった構成にします。

適当なデカルト積リレーションでOKです

dataテーブルの中でポイントとなるフィールドは2つ

  • idフィールドは自動入力でシリアル番号(「1」から1ずつ増加)
  • cellフィールドは繰り返しフィールド(繰り返し数は今回10)

そして、dataテーブルのレコード数は繰り返し数と同数に(なので、10レコード)。

ここまで準備が出来たら、
displayのレイアウトにポータルでdataテーブルのcellフィールドを表示します。

縦10升×横10升の正方形の出来上がりです。


手順その2

繰り返しフィールドcellに対して、条件付き書式を2つ設定します。

まず条件式の1つ目として、

Let ( 
[
		~row = data::id ;
		~col = Get ( 計算式繰り返し位置番号 ) ;

		~array = "[" & ~row & "][" & ~col & "]" ;

	$$cellValues = Case ( IsEmpty ( $$cellValues ) ; "[]" ; $$cellValues ) ;
	
		~value = Case ( 
				Get ( アクティブ修飾キー ) = 1 ; 1 ;
				Get ( アクティブ修飾キー ) = 4 ; 0 ;
				JSONGetElement ( $$cellValues ; ~array )
				 );

	$$cellValues = JSONSetElement ( $$cellValues ; ~array ; ~value ; 2 )
];
""
 )

グローバル変数$$cellValuesにJSONオブジェクトを2次元配列として「0」「1」を設定しようというカラクリです。


2次元配列は例えば、適当なフィールド設定で次の計算式を設定すると

計算式

JSONFormatElements ( 

	JSONSetElement ( "" ;
			[ "[0][0]" ; "1" ; 2 ];
			[ "[0][1]" ; "2" ; 2 ];
			[ "[1][0]" ; "3" ; 2 ];
			[ "[1][1]" ; "4" ; 2 ]
			 )

 )

計算結果

[
	[ 1, 2 ],
	[ 3, 4 ]
]

と、このように縦横2次元の配列が設定できます。

このことを利用し、
~row(シリアル番号)に見立て、加えて~col(繰り返し位置)に見立て2次元配列を作成、そこに値を格納して塗り判定をしていこうというわけです。


手順その3

続いて、塗り判定用の条件式2つ目として、

Let ( 
[
	~row = data::id ;
	~col = Get ( 計算式繰り返し位置番号 ) ;

	~array = "[" & ~row & "][" & ~col & "]"
];
JSONGetElement ( $$cellValues ; ~array )
 )

こちらは書式で塗りつぶし色を設定。
つまり、配列に格納されている値が「1」だったら塗りつぶすというわけです。


実際の動き

ブラウズモードで動きを確認してみましょう。

  • shiftキーを押しながらマウスでポイント(マウスオーバー) ⇒ 塗り
  • ctrlキーを押しながらマウスでポイント (マウスオーバー) ⇒ 塗り解除


クリックやドラッグをしてはいけません

shiftctrlでの判定を逆にしてctrlで塗りを設定してしまうと、ブラウズモードに戻る際にctrl +「B」のショートカット等でctrlが認識され、暴発する(全塗りされてしまう)ので注意して下さい。

後は、全消し用のスクリプトを作成するぐらいでしょうか。
$$cellValuesを空にして、ポータルの更新ウインドウ内容の再表示をすれば、塗がクリアされますね。


おまけ

繰り返しフィールドではなくボタンバーを使用し、また配列を上手く管理できれば色変え等もできます。

似てないピカチュウ・・・


おわりに

ここからさらに突き詰めていけば、描いたドット絵はただの配列ですので、簡単に保存・書き出しができますし、また逆に取り込んだりなど色々できますね。

以上、何かのアイデアに繋がれば幸いです。

それでは
Let's enjoy FileMaker!

Discussion

ログインするとコメントできます