NewtonScript講座 online第2回: ビューシステム(前)
今月と来月の2回を使って、Newtonの表示系システムの中枢である「ビュー・システム」を勉強してみましょう。こいつをちゃんとマスターしておけば、簡単なアプリケーションが書けるようになるだけでなく、「このソフトちょっとビューの使い方があれだよね」などと知ったか振りも出来るようになります。重要です。
今月はまずサンプルの作成から始めます。いきなり理屈から行くよりも実際にNTKで何かを作ってみてからの方が理解も深まるはずです。サンプルとしてビューのメッセージ送信をうまく使った電卓を作成してみましょう。
プロジェクトウィンドウに「Calc.t」が追加されたのを確認しましょう。このときに、名前の左側に黒丸がついているのに気がついたでしょうか?この黒丸は「Calc.t」がこのプロジェクトの中でのメインのレイアウトであることを示しています。メインのレイアウトとはNewtonのExtras Drawerの中からアプリケーションを開いたときに最初に開かれるレイアウトのことです。今回は一つしかレイアウトを作成しませんから関係ありませんが、大きなプロジェクトではたくさんレイアウトを作成しますので、このメインレイアウトの指定が意味を持ってきます。
このビューに名前を付けておきましょう。ビューが選択されている状態で、「Browser」メニューから「Template Info...」を選んで名前を入力します。「calcBase」としておきましょう(左図)。名前を付けておくとレイアウトが分かりやすくなります。また後で重要な機能に必要になります。説明は後で。
今作ったボタンの選択を一度解除して、何も選択してない状態にしてから「Window」メニューから「New Browser」を選びましょう。新しくブラウザーが表示されます。このブラウザー上でいろいろな細かいボタンのパラメータなどを設定していきます。
左上に表示されているのが、配置したビューの階層構造を表しています。このリストからprotoTextButtonの方を選んで下さい(右図)。その右側に表示されたのがそのビューに設定されているスロットの値です。まずtextスロットの値を設定しましょう。右上のリストからtextスロットの行をクリックすると、下の編集エリアにその内容が表示されます。前後についてあるダブル・クオーテーションを消さないように、中味の「Button」という文字列を「0」に変更します。変更を有効にするためにウィンドウ左下のチェックマークをクリックしておきましょう。
次にフォントを少し大きくします。フォントの情報はスロット一覧には見あたりません。この場合システムに収められているprotoTextButtonの標準であるシステムフォントの9ポイントが使われることになります。今回は電卓のボタンですからもう少し大きい方がいいですので、フォントの情報を追加しておきましょう。
ウィンドウの真ん中右にある「Attributes」ポップアップメニューの中から「viewFont]を選び、その内容をROM_fontSystem9BoldからROM_fontSystem12Boldに変更して下さい。この値はNewtonScriptの定数ですので両端をダブル・クオーテーションではくくる必要はありません。 さていよいよプログラムを入力しましょう。ボタンはユーザーがタップするとパラメータなしでbuttonClickScriptを実行します。ですので、電卓のボタンが押されたときの処理はここに書いておくことになります。次のコードがここでのNewtonScriptの関数になります。
func() begin :DoCalcButton(text); endこのコードは実にシンプルですが、具体的な機能はここには書いてありません。ここに書かないでどうするのかというと、後でcalcBaseの方に追加することになります。なんでこんなことをするかというと、電卓のボタンはみんな同じ様な機能を持っているからというのが大きな理由です。一つにまとめておけば修正も楽ですし、ボタンを複製するときにも修正する個所が少なくてすみます。
では今作った「0」ボタンを複製して全てのボタンの配置を終わらせましょう。今回は非常にシンプルな電卓ですので、0から9までの数字と、足す、引く、イコール、クリアだけを作ることにしましょう。加減整数電卓です。レイアウトウィンドウをアクティブにして、「0」ボタンを選択して下さい。そして必要な個数だけボタンを「Edit」メニューの「Duplicate」で複製してから、適当な位置に動かします。ウィンドウの大きさが小さかったり大きかったりするでしょうから、また適当に直します(右図)。
実際のレイアウトとブラウザーでのリストの関係は、最初に作ったビューがリストの一番上に見えます。順番を考えて複製していくと後々楽です。まあ、この順番はなんとか変更することもできますので神経質になることはありません。
さらにブラウザーから設定を行います。電卓の表示は普通右揃えなので、この設定を追加します。「Attributes」ポップアップメニューから「viewJustify」を選びます。グラフィカルな設定欄が現れますので、その中の左下の「Text/Graphics」という囲みの「Horizontal」の項目をRightに設定して下さい。さらに「Attributes」ポップアップメニューから、今度は「viewFormat」を追加し、その設定の中で「Pen」を1に、「Inset」を2に、そして「Frame」をBlackになるように設定して下さい。これにより枠がテキストからちょっと離れて表示されます。
ここで重要な作業を行いましょう。ビューに名前を付けるのです。「なんださっきやったじゃん」と思わないように。今回はただ名前を付けるだけでなく別のビューに定義するのです。やり方は簡単です。先ほどと同じやり方で名前を「display」と付けますが、今度は名前入力欄の下の「Declare to:」のチェックマークを付けます。こうするとビュー「display」はビュー「calcBase」に定義されたことになります。この詳しい仕組みは次回詳しく説明しますが、階層が上のビューから下のビューへアクセスする必要があるときには必ずこの定義を行う必要があります。
ブラウザーからcalcBaseを選択して下さい。そしてウィンドウの真ん中にある「Methods」というポップアップメニューから、「viewSetupDoneScript」を選択して下さい。このスクリプトは電卓が最初に開かれたときに呼ばれる物なので、ここで電卓の初期化を行いましょう。次のコードを入力して下さい。これは電卓のクリアーボタンを押したのと同じことをしています。
func()
begin
:DoCalcButton("C");
end
次は実際の計算ルーチンです。「Browser」メニューから「New Slot...」を選択して、スロット追加ダイアログを表示します。Slot Name欄に「DoCalcButton」、その右のEditorのポップアップメニューは「Script」になるように設定して下さい。以下のコードを入力して下さい。
func(text)
begin
if StrPos("0123456789",text,0) then
begin
if clearFlag then
begin
result := 0;
operator := "=";
end;
if NOT value then value := 0;
value := value * 10 + Floor(StringToNumber(text));
SetValue(display, 'text, NumberStr(value));
clearFlag := nil;
end
else if StrPos("+-",text,0) then
begin
if value then :DoCalcButton("=");
operator := text;
clearFlag := nil;
end
else if StrEqual("=",text) then
begin
if value then
begin
memory := value;
value := nil;
end;
if StrEqual("+",operator) then
result := result + memory;
else if StrEqual("-",operator) then
result := result - memory;
else
result := memory;
SetValue(display, 'text, NumberStr(result));
clearFlag := true;
end
else if StrEqual("C",text) then
begin
self.value := nil;
self.memory := 0;
self.result := 0;
self.operator := "=";
self.clearFlag := nil;
SetValue(display, 'text, "0");
end
end
