16) 時代に逆らって その2
 前回の「時代に逆らって」はオブジェクトに頼らない、昔風のBASICプログラミングで、NS Basicを紹介してみました。
今回は、その続編として、一覧表をキレイに表示する方法を紹介しましょう。

一覧表、Palm上のアプリケーションでなくても、使う機会の多い部品です。
例えば、ワープロであれば、罫線を駆使して表示させるでしょうし、表計算であれば、・・・あ、そのままですね。
要するに、グリッドと呼ばれる縦横にマスメのある集計表のイメージを想像しますが、Palm上ではそのような気のきいたものが無さそうです。というより、あの狭い画面で表計算をする事が発想として難しいのですが(そういうアプリもありますが)とにかく、そのようなオブジェクトはありません。
画面上に直接描画をすれば、表示の上では実現できますが、それでは、グリッドオブジェクトを使った時のように選択したり、スクロールする事が厄介です。
そこで、画面に直接描画をして、尚且つ、そのデータが取得できる、という方法を紹介します。
一覧表示の1つの参考にしていただければ、よいかと思います。

さて、この画面をご覧下さい。
このアプリケーション(クリエータID:TEST)は、NS Basicだけで作られているチョットしたものですが、表の上下スクロールと値の選択が可能です。

      

一見、グリッドのオブジェクトを使っているようですが、IDEの画面を見てください。

      

プロジェクト内には、ビットマップが読み込まれていますが、画面上にはボタンが3つだけです。
このビットマップは、

      

です。そう、お分かりと思いますが、実際はこの上に、DrawCharsコマンドで直接文字を描画しているだけなのです。

プログラムの方を解説してみましょう。
まず、日付と内容と金額を扱う配列を用意します。
今回は、Typeを使ってユーザー定義の変数を用意しました。
    Type SheetData
        sWhen as String       'いつ
        sWhat as String       '何を
        sHow as Integer       'どれだけ
    End Type
    
    Global ShDat(30) as SheetData     '表示用の配列として準備
VBと違うのは、この配列の参照方法で、配列の添字用の()の位置が違うのが分かります。
  NS Basicでは、      ShDat.sWhat(i)   Visual BASICでは、      ShDat(i).sWhat さて、この変数に対してダミーのデータを入れます。
日付の項目を1文字にしたのは、表とは別の部分で「年」や「月」を表示すれば良いかな、という仕様を想定しましたので、こうなっています。
データは、適当ですね。
Sub Project_Startup()
    
    Type SheetData
        sWhen as String       'いつ
        sWhat as String       '何を
        sHow as Integer       'どれだけ
    End Type
    
    Global ShDat(30) as SheetData     '表示用の配列として準備
    
    'ここでダミーデータを作っておこう
    Dim i as Integer
    
    For i=1 to 25
        ShDat.sWhen(i) = Trim(Str(Int(i/3)+1))
        ShDat.sWhat(i) = "データ" + str(Int(i/3))
        ShDat.sHow(i) = 100*Rand()*100
    Next
    
End Sub
実は、30個の配列に対して、25個のデータなんですね。

さて、このデータを先ほどのビットマップ上に適当に表示するわけです。
イメージ的には、

      

こんな感じです。
必要なのは、表の一番上のデータが、配列の何番目か?という点です。
それがわかれば、そこから8つ分のデータを表示すれば良いだけですから、その情報を入れておく変数を用意します。
    Global iTop as Integer          '表示データ先頭位置

    '初期値
    iTop=1
初期値は、1番先頭なので、 1で良いですね。

ビットマップの表に、文字データを書き込むのは、座標に注意すれば、それほど難しくありません。
今回の表は、次のようなサイズになっています。

      

すると、i番目のデータの縦座標は、
i * 14 + Py Pyは、一番上の行の縦座標で、実際のデータにあてはめると、
    Dim iSt as Integer
    Dim iEd as Integer
    
    DrawBitmap 1004,0,16

    iSt=iTop
    iEd=iTop+7
    
    For j=iSt to iEd
        jy= (j-iSt) * 14 + 31
    
    ・・・・

    Next
です。注意すべき点は、次のところでしょう。
  • 表示データの先頭iTopが、用意した配列より大きくなったらどうするか。
  • 現在、選択している行(反転表示)はどうするか。
さて、ここまで説明すれば、概要程度は理解できたと思いますので、後の詳細はソースファイルをご覧下さい。
(超初心者向け講座じゃないから、楽だなぁ〜(+_+)\☆バキッ!!)
これらを対応した、プロジェクトファイルは、ここからダウロードできます。
注釈は2.03以前だと化けているかもしれませんので、メモ帳などで内容を確認されると良いでしょう。

このサンプルから分かるように、比較的描画が高速であるため、Labelなどの文字用オブジェクトを使わなくても、スクリーンへ直接DrawCharsコマンドで文字を「描画」する方法は結構使えるようです。
非オブジェクトのプログラムですが、積極的にグラフィック画面を使うことは、思ったより良い方法かもしれませんね。