ユーザは、[OK]ボタンや[キャンセル]ボタンをクリックして、またはウィンドウの上隅にある赤色の[閉じる]ボタンをクリックしてウィンドウを閉じることができます。また、メッセージを送ってウィンドウを閉じることもできます。JSLスクリプトのOn ValidateとOn Closeには、ウィンドウが閉じられる時に行う処理を指定します。
• On Validateは、[OK]ボタンがクリックされると、式を評価します。他のボタンをクリックしたり、他の操作を行ったりしても式は評価されません。式の評価が真の場合、ウィンドウは閉じます。式の評価が偽の場合、ウィンドウは閉じません。なお、[OK]ボタンのボタンボックスで定義されたスクリプトは、On Validateの式とは無関係に、[OK]ボタンがクリックされると必ず実行されます。
• On Closeは、ウィンドウが閉じる直前に式を評価します。On Closeで戻される値は、On Validateの戻り値と同様に、ウィンドウを開いたままにする場合があります。しかし、On Closeを使う際の最良の方法は、常に1を戻すようにすることです。そうすれば、閉じないウィンドウを作成してしまうことがありません。
ウィンドウが閉じるとき、On Closeが評価されます。On Validateの式が偽を戻した場合はウィンドウが閉じないので、On Closeは評価されません。
ヒント:
• On Closeは、モーダルウィンドウと非モーダルウィンドウのどちらでも機能します。On Validateは、モーダルウィンドウでのみ機能します。
• On Closeは[OK]と[キャンセル]を区別しないので、検証に使うことはできません。On Closeは、ウィンドウが閉じるときに必ず実行されるので、リソース(非表示のデータテーブルなど)の整理に利用できます。
• On Validateをリソースの整理に利用しないでください。On Validateは、[キャンセル]ボタンまたは赤色の[閉じる]ボタンでは実行されないため、代わりにOn Closeを使うか、On Validateに加えてOn Closeを使うようにしてください。
ノンモーダルウィンドウであるレポートウィンドウがあり、整理する必要のあるリソースとして非表示のデータテーブルがあるとしましょう。On Closeスクリプトが、そのデータテーブルを閉じます。ユーザはデータテーブルが開いていることに気づかない場合が多く、たとえ気づいたとしても簡単に閉じる方法はないため、この方法はおすすめです。
dt = New Table( "無題", << Invisible,
New Column( "x", Set Values( [1, 2, 3, 4] ) ),
New Column( "y", Set Values( [4, 2, 3, 1] ) )
);
dt << Bivariate(
y( dt:y ), x( dt:x ), <<On Close( Close( dt, "nosave" ) )
);
スクリプトが実行される前には、開いているデータテーブルはないとします。上記のスクリプトを実行すると、「無題」という非表示のデータテーブルが作成されます。このデータテーブルのテーブル名は、ホームウィンドウ、および、スクリプトエディタの上にあるデータテーブルリストには表示されます。非表示のデータテーブルが作成された後、グラフが作成されます。レポートウィンドウを閉じると、On Closeによって非表示のテーブルが閉じられます。
モーダルウィンドウに質問が表示され、ユーザが回答しないとウィンドウが閉じない仕組みになっているとします。次のスクリプトは、ユーザがウィンドウを閉じるときに入力値が検証されるようにする例です。
win = New Window( "検証例",
<<Modal,
<<Return Result,
<<On Validate(
If( (!Is Missing( variablebox << Get ) & 40 <= variablebox << Get <= 50),
( 1 ), // そうでない場合は、ユーザが正しくない回答を入力した
tb << Set Text(
Match( Random Integer( 1, 3 ),
1, "本当にそう思いますか?",
2, "もう一度考えてみましょう。",
3, "質問を読んでください。"
)
);
( 0 );
)
),
Text Box( "私は40~ 50の数字のうち1つを思い浮かべました。当ててください。" ),
variablebox = Number Edit Box( . ),
H List Box( Button Box( "OK" ), Button Box( "キャンセル" ) ),
tb = Text Box( "" )
);
New Window( "モーダルウィンドウ",
<<Modal,
Text Box(
If(
// キャンセルボタンまたは赤色の閉じるボタンをクリックした場合
win["Button"] == -1, "調子のいいときにもう一度挑戦してください。",
win["variablebox"] == 42, "よくできました!", // 42を入力した場合
"もう一度挑戦してください。" // 42以外の値を入力してOK をクリックした場合
)
)
);