ユーザは、[OK]ボタンや[キャンセル]ボタンをクリックして、またはウィンドウの上隅にある赤色の[閉じる]ボタンをクリックしてウィンドウを閉じることができます。また、メッセージを送ってウィンドウを閉じることもできます。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 をクリックした場合
)
)
);