|
前回の「時代に逆らって」はオブジェクトに頼らない、昔風の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
です。注意すべき点は、次のところでしょう。
(超初心者向け講座じゃないから、楽だなぁ〜(+_+)\☆バキッ!!) これらを対応した、プロジェクトファイルは、ここからダウロードできます。 注釈は2.03以前だと化けているかもしれませんので、メモ帳などで内容を確認されると良いでしょう。 このサンプルから分かるように、比較的描画が高速であるため、Labelなどの文字用オブジェクトを使わなくても、スクリーンへ直接DrawCharsコマンドで文字を「描画」する方法は結構使えるようです。 非オブジェクトのプログラムですが、積極的にグラフィック画面を使うことは、思ったより良い方法かもしれませんね。 |