NewtonScript講座 online

第2回: ビューシステム(前)

 今月と来月の2回を使って、Newtonの表示系システムの中枢である「ビュー・システム」を勉強してみましょう。こいつをちゃんとマスターしておけば、簡単なアプリケーションが書けるようになるだけでなく、「このソフトちょっとビューの使い方があれだよね」などと知ったか振りも出来るようになります。重要です。

 今月はまずサンプルの作成から始めます。いきなり理屈から行くよりも実際にNTKで何かを作ってみてからの方が理解も深まるはずです。サンプルとしてビューのメッセージ送信をうまく使った電卓を作成してみましょう。



プロジェクトの作成

 まず初めに電卓用のプロジェクトファイルを作成します。前回と同じように「Project」メニューから「New Project..」を選びます。名前は「Calc.prj」とでもしておきます。細かい設定は後で行います。


レイアウトの作成

 電卓用のレイアウトファイルを作成します。「File」メニューから「New Layout」を選びます。「Save as...」で保存しておきましょう。レイアウトの名前には「.t」を付けるのが一般的になっていますので、それに従って「Calc.t」とかにしておくといいでしょう。保存できたらプロジェクトに追加するために「Project」メニューから「Add Calc.t」を選んで下さい。

 プロジェクトウィンドウに「Calc.t」が追加されたのを確認しましょう。このときに、名前の左側に黒丸がついているのに気がついたでしょうか?この黒丸は「Calc.t」がこのプロジェクトの中でのメインのレイアウトであることを示しています。メインのレイアウトとはNewtonのExtras Drawerの中からアプリケーションを開いたときに最初に開かれるレイアウトのことです。今回は一つしかレイアウトを作成しませんから関係ありませんが、大きなプロジェクトではたくさんレイアウトを作成しますので、このメインレイアウトの指定が意味を持ってきます。


電卓のベースの配置

 レイアウト「Calc.t」にパーツを配置していきます。まず最初に電卓のベースとなる部分を作ります。パレットの中からprotoFloatNGoを選び、レイアウトのウィンドウの中に適当な大きさになるようにマウスでドラッグしてビューを配置します。大きさは後でも修正できますので、いい加減でかまいません。たいてい最後近くになって、Newtonに実際にダウンロードして実物を見ながら細かい調整を行うことになります。

このビューに名前を付けておきましょう。ビューが選択されている状態で、「Browser」メニューから「Template Info...」を選んで名前を入力します。「calcBase」としておきましょう(左図)。名前を付けておくとレイアウトが分かりやすくなります。また後で重要な機能に必要になります。説明は後で。



最初のボタンの配置と設定

 まず数字ボタンから始めましょう。パレットからprotoTextButtonを選び、先ほどのcalcBaseの上に新しくボタンを作成します。大きさはグリッドの4個分ぐらいの大きさでいいでしょう(右図)。このボタンは数字の0になる予定です。このボタンをしっかり作っておけば、後はこれをコピーしてたくさん作り、数字の部分を変更して大量生産できるわけです。

 今作ったボタンの選択を一度解除して、何も選択してない状態にしてから「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」で複製してから、適当な位置に動かします。ウィンドウの大きさが小さかったり大きかったりするでしょうから、また適当に直します(右図)。

 実際のレイアウトとブラウザーでのリストの関係は、最初に作ったビューがリストの一番上に見えます。順番を考えて複製していくと後々楽です。まあ、この順番はなんとか変更することもできますので神経質になることはありません。


 複製が終わったら、今度はボタンの設定を変えていきましょう。といってもやることはそれぞれのボタン一つづつで、textスロットをそれぞれ適当に変更してあげることです。右図のような配置になるように変更して下さい。buttonClickScriptを共通で使えるようにしたおかげで、ここで楽になるわけです。


表示窓の配置

 結果を表示するための表示窓を作りましょう。パレットからprotoStaticTextを選択し、さっき配置したボタンの上の位置に電卓らしくなるように配置して下さい。

 さらにブラウザーから設定を行います。電卓の表示は普通右揃えなので、この設定を追加します。「Attributes」ポップアップメニューから「viewJustify」を選びます。グラフィカルな設定欄が現れますので、その中の左下の「Text/Graphics」という囲みの「Horizontal」の項目をRightに設定して下さい。さらに「Attributes」ポップアップメニューから、今度は「viewFormat」を追加し、その設定の中で「Pen」を1に、「Inset」を2に、そして「Frame」をBlackになるように設定して下さい。これにより枠がテキストからちょっと離れて表示されます。

 ここで重要な作業を行いましょう。ビューに名前を付けるのです。「なんださっきやったじゃん」と思わないように。今回はただ名前を付けるだけでなく別のビューに定義するのです。やり方は簡単です。先ほどと同じやり方で名前を「display」と付けますが、今度は名前入力欄の下の「Declare to:」のチェックマークを付けます。こうするとビュー「display」はビュー「calcBase」に定義されたことになります。この詳しい仕組みは次回詳しく説明しますが、階層が上のビューから下のビューへアクセスする必要があるときには必ずこの定義を行う必要があります。


機能の作成

 さあ、インターフェースは一応これでそろったわけですので、次に実際の機能を作っていきましょう。機能は「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


動作チェック

 これでプログラムは完成です。Newtonにダウンロードして動作をチェックしてみましょう。ボタンの位置がおかしいようなら、修正してはダウンロードを繰り返して微調整を行って下さい。NTKのレイアウトの画面はあまり正確ではないので、最終的にはNewton上でチェックするしかないわけです。


次回予告

 次回は、今回作った電卓の仕組みを解説しながら、Newtonのビューシステムの中味を見ていくことにします。


サンプルのダウンロード


前に戻る 目次に戻る 次に進む