【FileMaker】ボタン設定のオプション動作を確認する

ボタン設定で見かけるあのオプション。
みなさん、どう動くかご存知でしたか？

ボタン設定の、このオプション。
![ボタン設定のオプション](https://qiita-image-store.s3.amazonaws.com/0/60538/ac18cc32-230e-a31e-db27-b9981713f13c.png)

何気なく、何も設定せずにそのまま使っている方、いらっしゃいませんか？

４種類あります。
![オプション種類](https://qiita-image-store.s3.amazonaws.com/0/60538/95a68940-2bb4-ae93-fcc8-2660370d4e9e.png)

不覚にもこのオプションの不理解が災いして、えらい解析に時間がかかったことがありました。

「おかしい。。。」処理は終了しているはずなのに、何かが動いている。。。
その時はお客様の現場で、Advancedバージョンではなかったため、デバッガが使えず、実装の内容と動きからしか現象を確認することができませんでした。
そして、ふと気が付いたのです。

ボタンのオプション、全部スクリプトが止まる設定になってない！！！

ボタンのオプションを修正する1秒の作業で、長かった調査を終えることができましたとさ。


ので、今回はこのオプションの動きをまとめていこうと思います。

# テストスクリプト
2つのスクリプトを用意しました。
↓ボタンをクリックするとメッセージが出るスクリプト：dispMsg
![dispMsg](https://qiita-image-store.s3.amazonaws.com/0/60538/12fd5c23-dd3b-b13d-3fb3-a503dff93b87.png)

↓ボタンをクリックする前から動いているスクリプト：script一時停止
![script一時停止](https://qiita-image-store.s3.amazonaws.com/0/60538/5dc90272-561c-205a-4b4b-e34041569ddb.png)

# ボタンのオプション設定
4つのボタンオプションを設定したボタンをそれぞれ用意します。

(1)デフォルトで指定されている「現在のスクリプトを一時停止」
![現在のスクリプトを一時停止](https://qiita-image-store.s3.amazonaws.com/0/60538/3251691a-2c07-6218-ba48-c778de0d18d4.png)

(2)「現在のスクリプトを再開」
![スクリーンショット 2018-12-22 20.50.06.png](https://qiita-image-store.s3.amazonaws.com/0/60538/5e8a6203-a026-c6de-3149-12889c36b504.png)

(3)「現在のスクリプト終了」
![現在のスクリプト終了](https://qiita-image-store.s3.amazonaws.com/0/60538/decea7f8-12c4-b816-c4ef-ff8a17d80d3f.png)

(4)「現在の全スクリプト終了」
![スクリーンショット 2018-12-22 20.50.22.png](https://qiita-image-store.s3.amazonaws.com/0/60538/90e7c51e-9edc-6be5-5fa7-c2df289b4d00.png)

## (1)デフォルトで指定されている「現在のスクリプトを一時停止」
では、早速テストしてみます。
「script一時停止」スクリプトを実行しておきます。
![disp1](https://qiita-image-store.s3.amazonaws.com/0/60538/af5fed9a-4332-6b06-af9c-4ea3217d85ae.png)

「dispMsg一時停止」ボタンをクリックします。
![disp2](https://qiita-image-store.s3.amazonaws.com/0/60538/674cdc64-7ceb-0651-931e-a0ff198730b5.png)

「script一時停止」スクリプトは、「dispMsg」スクリプトが終わっても、続いています。
![現在のスクリプトを一時停止](https://qiita-image-store.s3.amazonaws.com/0/60538/c4123865-0aaa-b490-7dab-49277ae3e85f.png)
「script一時停止」スクリプトをその段階で一時停止して、「dispMsg」を実行します。その後、また「script一時停止」スクリプトを実行し続けます。

図式すると、下のような感じです。
![現在のスクリプトを一時停止](https://qiita-image-store.s3.amazonaws.com/0/60538/b97ada0c-36d4-3089-e009-81468f3f813b.png)


## (2)「現在のスクリプトを再開」
では、次に再開するパターンです。
同じく「script一時停止」スクリプトを動かしておき、「dispMsg再開」ボタンをクリックします。
![スクリーンショット 2018-12-22 20.54.22.png](https://qiita-image-store.s3.amazonaws.com/0/60538/e66c1ab8-0466-df39-6a79-10a4f09ff79a.png)

「script一時停止」スクリプトは、「dispMsg」スクリプトが終わったら次のステップを実行します。
![現在のスクリプトを再開](https://qiita-image-store.s3.amazonaws.com/0/60538/2b0187a8-3eac-5a8c-606b-c7958c5b313f.png)
つまり、「script一時停止」スクリプトを再開して、進む、ということですね。

図式すると、下のような感じです。
![現在のスクリプトを再開](https://qiita-image-store.s3.amazonaws.com/0/60538/cac51777-7d81-a6e6-126d-29cd9b030d0c.png)


## (3)「現在のスクリプト終了」
次は、スクリプト終了です。
「dispMsg」スクリプトを実行後、、、
![スクリーンショット 2018-12-22 20.54.54.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b85f9c21-8b70-3f5c-e4d3-f4f12ba8cd0c.png)

次のステップに進まず、即終了です。
![現在のスクリプト終了](https://qiita-image-store.s3.amazonaws.com/0/60538/64f4b370-df0d-b5f9-3f81-d9bf7cc57b78.png)
ちなみにここで「script一時停止」スクリプトを２個動かしておいた場合、１個のスクリプトが即終了し、残りのスクリプトは続きます。

図式すると、下のような感じです。
![現在のスクリプト終了](https://qiita-image-store.s3.amazonaws.com/0/60538/6fd53c23-feca-9a50-7621-affa19729b2e.png)

どういう順番で実行が行われ、何が先に実行・終了するかは、デバッガ(Advancedの機能)のコールスタックを見るとわかります。
下のケースは、
1.script一時停止を実行
2.script一時停止 2を実行
3.ボタンに実装したdspMsg実行
の順番です。
![コールスタック](https://qiita-image-store.s3.amazonaws.com/0/60538/f28c520b-377d-01f8-96b8-8415afbc6014.png)
最初に実行した順番に箱にスクリプトが入っていき、最後に入れた順番から処理が終了していく、という事になります。
簿記的にいうと、「先入れ後出し」というところでしょうか。

## (4)「現在の全スクリプト終了」
最後に、全スクリプト終了するケースです。
メッセージを出した後、、、
![スクリーンショット 2018-12-22 20.55.17.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b2c72c2c-4921-9bb5-d9b5-bd817a1d2b66.png)

(3)「現在のスクリプト終了」と同じように「script一時停止」スクリプトは次のステップに進まずに即時終了します。
![現在の全スクリプト終了](https://qiita-image-store.s3.amazonaws.com/0/60538/14896818-cebe-c8e9-1e62-e509f321c8e1.png)

図式すると、下のような感じです。
![現在の全スクリプト終了](https://qiita-image-store.s3.amazonaws.com/0/60538/0b2b5e33-26ee-f5b6-926b-22c7cb717209.png)

ではなぜ(3)と(4)のケースがあるのでしょう。
これは、複数のスクリプトをバックグラウンドで動かしているとわかります。
(3)の場合は、1つの実行スクリプトが終了しますが、(4)の場合はバックグラウンドで動いている「全ての」スクリプトが即終了するのです。

# まとめ
このオプションの動きを理解していないと、いつまでも動き続けるスクリプトが存在する。。。ゾンビ！？と思わせるような結果になてしまいますので、ボタンのオプションは状況に合わせて使い分けましょうね。（私含む）