« やっと歯の治療が終わった | トップページ | おばけつぶやき帳 »

2008年5月15日 (木曜日)

第6回 手順4

さて今回の手順4では、スクリプトを書く上で非常に重要な考え方を説明していきます。スクリプトは単に動けば良いと言うことではなく、使う側にとってどんな意味を持つものなのかを考えてみたいと思います。


さていよいよ手順4です。連載もかなり順調に進んできましたが、皆さんは復習をちゃんとしていますか? スクリプト上達のコツは数多くのスクリプトを書くことと、見ることです。
そうは言っても、スクリプトを見る機会というのは中々ないのが実情です。私がスクリプトを覚えたころは、ハイパーカードが新しい考え方に基づいたソフトウエアとして登場し(勿論まだWEBもHTMLも登場していませんでした)、多くの人が解説書を書いていましたから、そうした書籍を購入することでスクリプティングというものがどんなものかを知ることができました。またハイパーカードで作成されたスタックが雑誌の付録などでも入手でき(勿論インターネットなどまだない時代で、主に2HDのディスケットで配布されていました)、そうしたスタックのスクリプトを見ることで学ぶことが多くありました。
残念なことにランタイム・レヴォルーションはまだまだマイナーな開発環境であり、日本でのユーザーは極めて少ないため、スクリプトを学ぶ為の教材も整備されていないのが実情です。勿論、古本屋などでハイパーカードの本などを入手できれば大いに参考になるはずですが、そうしたものを入手できることは非常にまれであるのが現状です。
そんなこともあって、この連載では出きるかぎり使えるスクリプトを見られるようにしていくことと同時に、プログラムをする上での考え方の流れをお伝えできればと思います。
前置きが長くなりましたが……。

さて手順3で書いた通り、手順2のスクリプトをより洗練されたものにするには幾つか足りないものがあります。それは、まず


1)エラー・チェック
2)自動入力
3)%表示

の三つであることをお伝えしまいたので、今回はまず「1)エラー・チェック」を採り上げることにします。


1)エラー・チェック
手順2で書いた「計算」ボタンのスクリプトを実行させると必ず発生するエラーがあります。それはどんな時に発生するかというと、フィールドに何も入力されていない時、或いはフィールドに何行にもわたって数値が入力されているような時です。何故その様なエラーが発生するかを考えてみると、「計算」ボタンのスクリプトには割算が含まれているからです。
割算というのもご存知の通り分母と分子、つまり割る数と割られる数の二つが揃っていないと答えを出すことができません。どちらか一つ、或いは二つとも値が欠けているとスクリプトで演算を実行すると必ずエラーになります。この場合大抵は「divide by zero(0で割ってるヨ)」というエラーで、エクセルなどでも同じエラーが発生します。実際には数値が“0”でなくてもこのエラーは発生します。それは数値が「空(empty)」の場合です。RunRevでの演算の場合、「空」のデータは数値“0”と同じ意味を持ちます。
人間が筆算で割算をする場合には起こらないこうしたエラーがコンピュータを使った場合には発生します。その原因の多くはヒュー・マンエラー、つまり入力者によるデータの入力漏れであったり、演算には相応しくないデータの入力、です。従ってスクリプトを書く側は、人間が起こしうるこうした誤りを事前に想定し、そうしたエラーが発生しないような手立てをスクリプトとして用意しておく必要があります。
では具体的なエラー・チェックを考えてみます。

「計算」ボタンで書いたスクリプトは、値入率を求める演算でした。従って、数式の元となる分子と分母、つまりfld “BaiKa1”、fld “BaiKa2”、fld “GenKa”の全てがemptyでないことをまずチェックします。処が三つのフィールドがemptyでなくても、分母の値が“0”であればエラーが発生します。そこで次に値が“0”より大きいことを確認します。
こうしたエラー・チェックのためのスクリプトには通常『if文(条件文)』が使われます。『if文(条件文)』は英文法では仮定法で使われることが多いのですが、スクリプトにおいては『もし仮にⒶという条件が成立すればⒷを実行しなさい;Ⓐという条件が成り立たなければⒸを実行しなさい』という様に、設定した条件により実行する内容を分岐させる場合に使われます。
そこで今回のエラー・チェックには、まず次の様な条件を設定することにします。


条件1;fld “BaiKa1”(分母)がemptyでない
条件2;fld “BaiKa1”(分母)が“0”より大きい

処が当然のこととして分子も値“0”やemptyではまずい。従って、

条件3;「fld “BaiKa2” - fld “GenKa”」の演算結果も値“0”やemptyでない

ことをチェックする必要があります。

以上で『フィールドに何も入力されていない時』のエラーは回避できるはずですが、もう一つのエラーの原因である『フィールドに何行にもわたって数値が入力されている』は回避できません。では後者のエラーはどうしたらチェックできるのでしょうか? この問題は上で述べた『if文(条件文)』とは異なる視点で解決方法を考えてみることにします。その視点とは……。

2)自動入力
今回のスクリプトの場合、『if文(条件文)』を使わないでエラー・チェックを行うという視点を一言で言えば『2)自動入力』ということになります。

エラーのチェック時に『if文(条件文)』を使うのは非常に一般的なことですが、チェックすべき条件が多くなるとスクリプが非常に複雑になります。しかも今回は「fld “BaiKa1」と「fld ”BaiKa2」に同じ値を入力できたかどうかをチェックするというのが目的です。
従って、視点を変えて問1の式の分母にあたる「fld “BaiKa1」に値が入力された時に自動的に「fld ”BaiKa2」にその同じ値が入力されるようなスクリプトにしてみたいと思います。さらに、設定した条件を満たさない時には、(RunRevが自動的に表示するものとは別に)エラーの発生を知らせる独自のウィンドウを開く機能もつけてみます。


Itoh004

上図は、RunRevが自動的に表示するエラー・ウィンドウで、上の場合は「divide by zero」のエラーを示しています。ウィンドウの下部に表示された「Script」と表示されたボタンをクリックすると、スクリプト編集用のウィンドウが自動的に開き、該当するエラー部分が反転表示されます。

【参考】


通常、RunRevの開発環境(つまり、スタックをスタンドアローン化していない状態)では、RunRevが用意したエラー用のウィンドウが上図のように開きます。これとは別に、自身が設定した条件に反した場合に独自のウィンドウを設定しておくことは、エラー処理の基本になるかと思います。


以上のことを整理すると;


If 条件 then
   条件を満たした時に実行する内容
else
   条件に反した時に実行する内容
end if

となります。
これが条件文の一つのカタチです;まずカタチから入ることが、やはりプログラミングでも重要なことだと思います。条件文には大まかに四つのカタチがありますが、詳しくはDictionaryを参考にして下さい。

では、新しいボタンを一つ作って、名前を「KeiSan2」、ラベルを「計算2」とします。そのボタンに以下のスクリプトを書いていきます。

  on mouseUp
     put fld “BaiKa1” into fld “BaiKa2”
     if fld “Baika1” is not empty and fld “BaiKa1” > 0 \
       and fld “GenKa” is not empty and fld “GenKa” > 0 then
     put (fld “BaiKa2” - fld “GenKa”)/fld “BaiKa1” into fld “NeIre”
   else
     answer “You’ve got an Error !!” as sheet
   end if
  end mouseUp

このスクリプトでどんなことをしているのかを説明していきます。

まず「put fld “BaiKa1” into fld “BaiKa2”」では「fld “BaiKa2”」に「fld “BaiKa1”」と同じ値を入力しています。使っているコマンドは「put」です。
次に「 fld “Baika1” is not empty and fld “BaiKa1” > 0 and fld “GenKa” is not empty and fld “GenKa” > 0 」の部分ですが、ここが条件になります。このスクリプトでの条件は、四つのサブ条件の全てが成立した時が一つの条件として設定されています。その四つのサブ条件とは次の様なものです。


  fld “Baika1” is not empty:fld “Baika1”が空ではない
  fld “BaiKa1” > 0:fld “BaiKa1”は“0”より大きい
  fld “GenKa” is not empty:fld “GenKa”が空ではない
  fld “GenKa” > 0:fld “GenKa”は“0”より大きい

この四つのサブ条件が同時に成り立つ時に条件が満たされるということになります。これは論理式と同じ考え方で、『「fld “Baika1”が空ではない」且つ「fld “BaiKa1”は“0”より大きい」且つ「fld “GenKa”が空ではない」且つ「fld “GenKa”は“0”より大きい」』が「真」のとき、次のスクリプトを実行することになります。つまり、『if文(条件文)』の中では「and」は「且つ」という意味を持ちます。
この条件が成立する時に「put (fld “BaiKa2” - fld “GenKa”)/fld “BaiKa1” into fld “NeIre”」というスクリプトが実行され、計算が実行されるわけです。
この条件が成立されない時、つまり「else」(そのほか)の時には「answer “You’ve got an Error !!” as sheet」が実行されるわけです。この「answer “You’ve got an Error !!” as sheet」は、「You’ve got an Error !!」というエラー通知用のウィンドウを開くためのスクリプトです。このスクリプトには「answer」という新たなコマンドが使われています。

では、各フィールドに色々な値を入れ、或いは入れないでどんなことが起こるのか実際に試してみて下さい。

今回、変更・追加した「計算2」ボタンを含む画面


Itoh005

追加したエラー表示が機能した時のウィンドウ


Itoh006

|

« やっと歯の治療が終わった | トップページ | おばけつぶやき帳 »