« おばけつぶやき帳 | トップページ | お蕎麦の美味しいお店…… »

2008年6月30日 (月曜日)

問2:第4回

手順4

ここからはtargetによる処理の分岐の為のスクリプトのテストです。

【スクリプト2の5】

on enterInField
-- put the target
-- if the target contains “BaiKa” then put “the target is BaiKa”
if the target contains “BaiKa” then
answer “Which is the Next ?” with “GenKa” or “NeIre” or “Cancel”
end if
-- if the target contains “GenKa” then put “the target is GenKa”
-- if the target contains “NeIre” then put “the target is NeIre”
end enterInField

on returnInField
enterInField
end returnInField

on tabKey
-- enterInField
put empty
pass tabKey
-- put “This is tabKey !!”
end tabkey


上のスクリプトで一度テストをしてみます。どんな風になるでしょうか?特にタブを使った時の動き、メッセージ・ボックスガ開いたままの時の動きに注意してみて下さい。思いも寄らないエラー・メッセージが表示されるかも知れません。

久し振りにエラーの話がでましたネ そうです、今書いているスクリプトには問1で言及したエラー・チェックの機能がまだ一つもありません。そこでエラー・チェックの機能をつけるのですが、その前にfld “GenKa”とfld “NeIre”に対応するenterInFieldハンドラを書き直しておきます。書き直した後には必ず全てのフィールドでanswerに対応するダイアログが表示されることを確認して下さい。こうして確実に動作するスクリプトを確定させていくわけです。


【スクリプト2の6】

on enterInField
-- put the target
-- if the target contains “BaiKa” then put “the target is BaiKa”
if the target contains “BaiKa” then
answer “Which is the Next ?” with “GenKa” or “NeIre” or “Cancel”
put it
end if
-- if the target contains “GenKa” then put “the target is GenKa”
-- if the target contains “NeIre” then put “the target is NeIre”
end enterInField

on returnInField
enterInField
end returnInField

on tabKey
-- enterInField
put empty
pass tabKey
-- put “This is tabKey !!”
end tabkey


ではanswerの構造ですが;answerで始まる一行のあとに「put it」の一行を追加し、上と同様のテストをします。これで、売価フィールドでエンターを押すと、answerダイアログが開き、どれかボタンを押すと、そのボタンに対応したメッセージがメッセージ・ボックスに表示されるはずです。
answerダイアログのGenKaボタンならGenKa
answerダイアログのNeIreボタンならNeIre
answerダイアログのCancelボタンならCancel
つまりanswerダイアログで押されたボタンがどれかをRunRevが覚えているので、その記憶を取り出すことで上のようなことが可能になるのです。ではどこに記憶しているのかというと「it」に記憶しているわけです。その「it」の内容を取り出して次の処理の分岐を決定するわけです。
この「it」は問1ででてきた「me」と同様、非常に英語らしい振る舞いをする語(keyword)ですが、ここでは詳しい説明をしません。では処理の続きを;
GenKaボタンならGenKaの処理へ
NeIreボタンならNeIreの処理へ
CancelボタンならCancelの処理へ
それぞれIF条件文を使って分岐させます。ここではIF条件文の中にIF条件文を書く、つまりIF条件文のネスティング(“To enclose a part within another part of the same kind.”「同種の別の処理部分の中にある部分を囲い込むこと」)処理ということになり、やや処理が複雑になります。その分書き漏れや誤記などのエラー候補が発生しやすくなるので十分注意して下さい。
先程の「put it」をコメント化して、次のスクリプトを新たに追加します。

【スクリプト2の7】

on enterInField
-- put the target
-- if the target contains “BaiKa” then put “the target is BaiKa”
if the target contains “BaiKa” then
answer “Which is the Next ?” with “GenKa” or “NeIre” or “Cancel”
-- put it
if it is “Cancel” then exit to top
if it is “GenKa” then GenKa
if it is “NeIre” then NeIre
end if
-- if the target contains “GenKa” then put “the target is GenKa”
-- if the target contains “NeIre” then put “the target is NeIre”
end enterInField

on returnInField
enterInField
end returnInField

on tabKey
-- enterInField
put empty
pass tabKey
-- put “This is tabKey !!”
end tabkey


ここまで書いたらまたテストです。GenKa、NeIre、Cancelの全てのボタンをテストしてください。するとCancel以外は全て「Can’t find Handler」エラーとなるはずです。これはGenKaとNeIreに対応するハンドラが存在しないために発生するものなので、カード・スクリプトに必要な次のハンドラを追加します。

【スクリプト2の7】

on enterInField
-- put the target
-- if the target contains “BaiKa” then put “the target is BaiKa”
if the target contains “BaiKa” then
answer “Which is the Next ?” with “GenKa” or “NeIre” or “Cancel”
-- put it
if it is “Cancel” then exit to top
if it is “GenKa” then GenKa
if it is “NeIre” then NeIre
end if
-- if the target contains “GenKa” then put “the target is GenKa”
-- if the target contains “NeIre” then put “the target is NeIre”
end enterInField

on returnInField
enterInField
end returnInField

on tabKey
-- enterInField
put empty
pass tabKey
-- put “This is tabKey !!”
end tabkey

on GenKa
beep 3
end Genka

on BaiKa
Beep 5
end BaiKa

on NeIre
Beep 7
end NeIre


当然またテストです。これで先程の「Can’t find Handler」エラーは発生しないはずです。但し、ここにはまだ気付いていないエラー候補が潜んでいます。enterInFieldはフィールド内でエンターが押された時に発生するメッセージです。ということは、フィールドに何も入力されていなくてもエンターを押せばenterInFieldハンドラは実行されてしまいます。これは問題ですね。そこで問1で書いたスクリプトを参考にエラー・チェックを行います。
ここですべきエラー・チェックは問1の場合と同様、フィールドに数値以外が入力できないようにするということです。そこで、enterInFieldハンドラの冒頭でisNumber関数によるチェックを行い、入力された値が数値の場合には次の処理に、そうでなければ数値の入力を催促するようにします。

【スクリプト2の8】

on enterInField
if isNumber(field the target) then
-- put the target
-- if the target contains “BaiKa” then put “the target is BaiKa”
if the target contains “BaiKa” then
answer “Which is the Next ?” with “GenKa” or “NeIre” or “Cancel”
-- put it
if it is “Cancel” then exit to top
if it is “GenKa” then GenKa
if it is “NeIre” then NeIre
end if
-- if the target contains “GenKa” then put “the target is GenKa”
-- if the target contains “NeIre” then put “the target is NeIre”
else
answer “Put the number first, shall you ?”
end if
end enterInField

on returnInField
enterInField
end returnInField

on tabKey
-- enterInField
put empty
pass tabKey
-- put “This is tabKey !!”
end tabkey

on GenKa
beep 3
end Genka

on BaiKa
Beep 5
end BaiKa

on NeIre
Beep 7
end NeIre

さて、ここまで書いたスクリプトを全てテストしてみましょう。見落としている観点があるかも知れません。エラーがあることを前提に色々と入力してみて、なにが問題かを考えてみて下さい。

|

« おばけつぶやき帳 | トップページ | お蕎麦の美味しいお店…… »