« おばけつぶやき帳 | トップページ | 久し振りの多治見駅前…… »

2008年6月23日 (月曜日)

問2:第3回

手順3

前置がかなり長くなりましたが、いよいよ実際のスクリプトを書いていきます(って本当かな?)。その前にいま一度つぎの点を確認して下さい。

<フィールド名>
【図2の4】で1と表示されたフィールド:BaiKa
【図2の4】で2と表示されたフィールド:GenKa
【図2の4】で3と表示されたフィールド:NeIre

<イメージ名>
JPtext

<カード名>
Toi_2

<スタック名>
iToh_02

<スクリプト全体の流れ、構造>
【表2の1】


Itoh030

 上の表は、最初に入力のあったフィールドを元に、つぎに入力の可能性があるフィールド毎に、なすべき演算(対応するハンドラ)を一覧化(みえるか?)したものです。この表を見れば判る通り、当然のこととして、なすべき演算は三つだけ;「値入率の算出」「原価の算出」「売価の算出」です。
 この三つの演算をそれぞれハンドラ化してIF条件文により呼び出す、というのがどうもスクリプトの流れのようです。でも本当にIF条件文でよいのか?ということもありますね。なんかIF条件文だと面倒なことになりそうに思えませんか?マ色々ご意見もあろうことかと思いますが、ここでは新たなテクニックの紹介・習得ということもあり、次の様な流れを考えてみます。

【表2の2】


Itoh031

上の表からの流れ;
1:フィールドのどれかで入力があったら、enterInField、 returnInField、 tabKeyメッセージがどこで発せられたかを「target関数」で掴む
2:次にどのフィールドにデータを入力するかを「answerコマンド」で尋ねる
3:上の答えを元にして、指定された次の処理を実行する

この表の「対応演算」に相当する「NeIre」「GenKa」「BaiKa」の三つが、問2の最初に行った式と対応するわけです。そこで、この三つをそれぞれハンドラとして完成させていきます。

<NeIreハンドラの考え方>
値入率 = 1-原価/売価 = 1-fld “GenKa”/fld “BaiKa”
    = NeIre
    =round((1-fld “GenKa”/fld “BaiKa”)*100,2)

<GenKaハンドラの考え方>
原価 =(1-値入率)×売価 = (1-fld “NeIre”)×fld “BaiKa”
   = GenKa
   =round((1-(fld “NeIre”/100)*fld “BaiKa”)

<BaiKaハンドラの考え方>
売価 = 原価/(1-値入率) = 原価/1-値入率
   = fld “GenKa”/(1-(fld “NeIre”/100))
   = BaiKa
   =round(fld “GenKa”/1-fld “NeIre”/100)

【注】売価、原価に関しては小数部を四捨五入し整数表示としていますので、roundの使い方に注意をして下さい。

実際のハンドラは、
<NeIreハンドラ>
on NeIre
put round((1-fld “GenKa”/fld “BaiKa”)*100,2)
end NeIre

<GenKaハンドラ>
on GenKa
put round((1-(fld “NeIre”/100)*fld “BaiKa”)
end GenKa

<BaiKaハンドラ>
on BaiKa
put round(fld “GenKa”/1-fld “NeIre”/100)
end BaiKa

というものになります。ここまでは、既に問1の解説に現れている知識でできると思います。問題は、今回新たに出てきたanswerというコマンドです。

answerコマンドは、簡単に言えば、直接使用者に何かを答えてもらうためのもので、通常予め設定した選択肢を用意して使われます。

answerコマンドは;“Displays a dialog box with a message and up to seven buttons.”「メッセージとともに最大7つまでのボタンを持つダイアログ・ボックスを表示」します。“Use the answer command to get information or a confirmation from the user before continuing. The user must click one of the buttons to dismiss the dialog box.”「ある処理を続けていく際に、使用者に関連する情報を求めたり、確認を行ったりするのにanswerコマンドを使います。表示されたダイアログ・ボックスを閉じるには、必ずどれか一つのボタンをクリックしなければなりません」。

このanswerコマンドを【表2の2】と組み合わせて、表示させる質問の形式を作ってみます。今のところ、answerコマンドで表示させるメッセージやボタンに日本語を表示させることが難しいので、ここでは英語(モドキ)を使っています。

answerコマンドの形式は次の様になります。
answer “message” with button1 or button2 or button3 ..... or button7
answer“メッセージ” with ボタン1 or ボタン2 or ボタン3.....or ボタン7

メッセージは必ず引用符“”で囲います。またボタンは七つまでを「or」でつないで用います(この辺りも通常の英語と違いEnglish-Likeと言われる由縁です)。メッセージもボタンも省略することはできません。

それぞれのステイトメントは次の様になります。
<fld “BaiKa”に入力があった時のansweステイトメント>
answer “Which do you prefore Next ?” with “GenKa” or “NeiRe” or “Cancel”
<fld “GenKa”に入力があった時のansweステイトメント>
answer “Which do you prefore Next ?” with “BaiKa” or “NeiRe” or “Cancel”
<fld “NeIre”に入力があった時のansweステイトメント>
answer “Which do you prefore Next ?” with “BaiKa” or “GenKa” or “Cancel”


ではこれまでのまとめとして、カード・スクリプトに今まで考えてきた流れをスクリプトとして表現してみます。まだテスト段階なので本番でそのまま使えるスクリプトではありませんが……。

【スクリプト2の4】

on enterInField
-- put the target
if the target contains “BaiKa” then put “the target is BaiKa”
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

ここでは、テストに必要のないステイトメントの幾つか、例えばtabKeyハンドラ内のenterInField、をコメント化しておきます。

カード・スクリプトを上のように変更したら早速ブラウズ・モードでテストを実行します。ここで余談ですが;Runtime Revolutionの“Runtime”とは「スクリプトを書いたその場でスクリプトの実行を確認できる」という意味を表しています。他の多くの開発環境・開発言語では、スクリプトなどのプログラム・コードを書く作業と、そのプログラム・コードを実行する(Runする;Runtime)作業との間に、書いたプログラム・コードをコンピュータが理解できるように置き換える為のコンパイルという作業が存在します。この作業もプログラム開発者自身が行う必要があり、これが場合によっては結構時間と手間がかかる厄介な作業なのです。処が、RunRevでは、このコンパイル作業をRunRev自身が隠れてヒッソリ行ってくれるので、開発者は開発中にコンパイル作業に煩わされることがありません。今書いたプログラム・コードが直ぐその場で実行でき確認できることは、実は本当に革命的なことなんです。それ故RunRevは“Runtime Revolution”という名前を持っているわけです。因みにハイパーカードもRunRev同様、書いたスクリプトを直ぐその場で実行できましたが、残念ながらハイパーカードはコードをコンパイルしているものではありませんでした。

閑話休題。
ではテストです。三つあるフィールドのどこかでエンター(又はリターン)を押してみます。メッセージ・ボックスにそのフィールドに対応したメッセージが表示されればOKです。次にタブでフィールドを移動して同じことをやってみましょう。どうですか? うまく行ってますか?
このテスト用のスクリプトでtabKeyハンドラのenteInFieldをコメント化したのは、テスト中にタブを押すとメッセージ・ボックスの表示と実際のフィールドとがずれてしまうからです。どうしてそうなるのかは後で自身で考えてみて下さい【宿題】。
さてこのテストでtargetのとらえ方は理解できたと思います。そこで次の段階、targetによる処理の分岐に話題を進めます。

|

« おばけつぶやき帳 | トップページ | 久し振りの多治見駅前…… »