23) 私を名前で呼んでね〜関数へオブジェクトを渡す
※注)NS Basic Ver.4.21以前のバージョンで本稿の内容を試した場合、正常に動作しない場合があります。
これは、NS Basicのバグで、主なバグはVer.4.22で解消される予定です。


 NS BasicのVer.3から、各スクリーンオブジェクトの取り扱いが容易になりました。
詳細については、「ようこそ!NS Basic/Palm Ver.3.0.0」を再読頂くとして、ざっと、おさらいをしてみますと、

1.オブジェクト型もどきの変数からアクセスできる。
    これは、比較的簡単な話です。
    フォーム上のオブジェクト、例えば、Field1004に対して、次のような形でアクセスが可能です。

      Dim strObjName as String

      strObjName="Field1004"

      strObjName.Text="こんにちは!"

    これを最初に見たときは、ちょっと戸惑いましたが、VB流に比べれば単なる「名札」でアクセスするこちらの方が理に適っているような気がします。

2.コントロール配列もどきが使える
    フォーム上のオブジェクトは、全てControls()という組み込みのコントロール配列からアクセス可能です。
    例えば次のような使い方が出来ます。

      Dim i as integer

      i=Field1004.Index

      Controls(i).Text="こんにちは!"

    これはこれで、便利なようですがIndex番号がフォームに貼り付けた順番になっているようで、プログラマ側で自由に変更できないのが難点でしょうか。
    一応、そのオブジェクトがFieldなのかButtonなのか、種類を判別するTypeというプロパティが用意されていますので、これらと組み合わせれば、使えないこともないでしょう。
さて、どちらかと言えば、まとめて扱える後者の方がプログラムをよりスッキリ整理させるのには適しているように見えますが、今回は、前者の方法にこだわってみたいと思います。

 NS Basicでは、前述のように、オブジェクトの名前を使ったアクセスが可能です。
つまり、文字列型の変数がオブジェクト型の変数を兼ねていると見ても良いのですが、別にVBと比べる必要もないので、こういうモノだと理解しても良いですね。

文字列型で扱える利点は、通常はあまりないように見えます。
誰が考えても、前述の例のようにするよりも、
    Field1004.Text="こんにちは!"
とした方が、はるかに便利でしょう。
しかし、文字列型であるので、次のような芸当が可能です。

    Sub Object1005()
    
        Call setText("Field1004","こんにちは!")
    
    End Sub
    
    
    Sub setText(strObj as string, strText as string)
    
        strObj.Text=strText
    
    End Sub
    
もちろん、文字列型の変数に代入してもOKです。

    Sub Object1005()
    
        Dim strField as string
    
        strField="Field1004"
    
        Call setText(strField,"こんにちは!")
    
    End Sub
    
    
    Sub setText(strObj as string, strText as string)
    
        strObj.Text=strText
    
    End Sub
    
サブルーチンにオブジェクトが渡せるようになると、プログラムの幅が広がりますね。
何せ、取り扱うのが文字列なので、それほど深く考える必要はありません。まぁ、関数に引数を渡す場合、どうせポインタを渡すんですから、型にこだわる必要はないのかも知れません。
どちらにしろ、名前だけで渡せる引数、原理的には今まででも可能だったのですが、一部の動作に不具合があったため、NS Basic Ver.4.22にて修正され、問題なく使えるようになりました。

さらに、これを知ったのは最近なのですが、プログラムコードの中からイベントを起こすことも可能です。
例えば、フォーム上にField1004、Button1005、Button1006の3つのオブジェクトがあったします。

    Sub Object1006()
    
        Call Object1005
    
    End Sub
    
    
    Sub Object1005()
    
        Call setText("Field1004","こんにちは!")
    
    End Sub
    
    
    Sub setText(strObj as string, strText as string)
    
        strObj.Text=strText
    
    End Sub
    
このようにすれば、Button1006をタップしたとき、Button1005のイベントを「コール」しますので、結果的に、どちらのボタンをタップしても同じ結果が得られます。


NS Basicを長いこと触っていると、あちらこちらを参照したり呼んだりするよりも、単純に上から下へ流れるだけのプログラムを書いた方が速く処理されることが、経験的に分かってきますが、NS Basic自体のパフォーマンスの向上と、デバイスの速度が向上したことで、多少「キレイな」プログラムを書く余裕が出てきました。
所詮、VBなどに比べれば、無理があるのは否めませんが、高機能なパソコンではなくPalm上で動くプログラムを作るツールとして見れば、それなりの評価が出来るツールじゃないかと思います。
ひとまず「らしい」プログラムを書く手段も用意されていますので、是非、チャレンジしてみてください。