第14回 プログラミングの舞台裏「3.嘘も方便『読み込み中』〜Ver.0.2」

14−3 嘘も方便『読み込み中』〜Ver.0.2

要望点では、表計算ソフトにあるような縦横罫線が必要、ということです。
横罫線は、それほど問題ありません。1行ごとに線を引けばよいわけですから、セルの高さを行の高さとするだけでよく、これは文字の高さから考えることが出来ます。
ただし、ビューアですから、出来るだけ画面上に情報を表示したいところです。そこで、1行の高さをギリギリの11ピクセルにしました。これで、1画面で13行の表示が可能です。
しかし、DrawCharsで文字列を描画すると、文字の周囲に多少の空白が描かれてしまいます。従って、文字自体の高さは11ピクセルで考えてもよいのですが、実際には余分にサイズを取っておかないと表示できません。
そこで、文字を書いてから罫線を引く、という方法で、消された部分を再描画するようにしました。ちょっとした処理の順番で、狭い画面が有効利用できます。

    

横罫に比べて、縦は、ファイルや列ごとに幅が違いますから、毎回、計算しなければなりません。
幸いなことに、NSBSystemLibには、文字列の長さをピクセル単位で返してくれるFontCharWidth()やFontCharsWidth()等の関数が用意されています。
前者が先頭の1文字であるのに対して、後者は、指定された文字列全部の長さになります。
そこで、各列を全部検索して、その列で最大の長さを持つ値を、その列の表示幅にすることにしました。
簡単なフローチャートは次の通りです。

    

全部の行・列で検索する必要があるのですが、考え方は簡単です。
この処理は、データベースからデータを読み込んで配列変数に分解・代入処理をする時に、あわせて行うことが出来ました。

しかし、考え方は簡単でしたが、発生した問題は深刻でした。

データを配列変数に展開するまでに、数秒から数十秒程度の時間がかかることが判明しました。
つまり、データを選択して、そのデータが表示されるまでに、ユーザーは何もしないで数十秒待つ必要がありました。最悪の場合、データが表示されたと同時に、オートパワーオフです。


そこで、苦肉の策ですが、この待ち時間中に「読み込み中」と表示するようにしました。


これで「ああ、読み込みをしているんだなぁ」と思って待ってもらうようにしましたが、根本的な解決ではありません。
プログラムは、データの読み込みをしているわけではなく、偽りの表示の裏で、必死に最大幅の列を検索していたわけです。


無論、ユーザーの声は甘くありません。もちろん、自分でも満足しなかったので、改良案を考えました。


明らかに、ボトルネックになっているのは、Palm側の処理速度の遅さです。そこで、この横幅を計算する処理をコンバータ側、つまり、PC側で実行させることにしました。
一方は30MHz程度のクロック数のPalm、もう一方は、その10倍も20倍も処理速度の速いPCですから、処理速度の問題は解決されると思われます。


しかし、別の問題が発生しました。


PC側では(当然ですが)NS BasicのFontCharsWidth()という関数が使えませんので、Palmのディスプレイに表示される文字の幅を取得することが出来ません。
そのため、何らかの方法で文字幅を取得しなければならない、という問題が発生したのです。
そこで、次の方法で、簡易的な変換テーブルを作ろうと考えました。

まず、Palm側で、全部の文字の幅を計算し、データベースに保存します。
これをHotSyncしてPC側に移して、ここから各文字の幅を得るテーブルを作成する、という方法です。

半角英数は、大きな問題ではありません。この程度のプログラムで、全部の文字種の幅を取得できます。

	Dim strX as string
	Dim i as integer
	Dim j as integer
	Dim strRes as string

	strRes=""

	For i=32 to 254
	    strX=Chr(i)

	    j=NSL.FontCharsWidth(strX)
	    strRes=strRes + Trim(Str(j))
	Next

ここで得られた文字列strResを何らかの方法でパソコン側に渡せば、キャラクターコード32番(半角スペース)からすべての半角文字の文字幅を取得することが出来ます。
メモ帳に書き出してもよかったですが、1回だけなので、簡単なデータベースに書き出して取り出しました。

しかし、全角文字は、そのコードだけを比べても半角文字の256倍の種類があります。
面倒で大変な動作だと思い、何か楽な方法はないものかと、Palmのメモ帳に適当に文字を入れて試していました。


  !?


日本語は、どの文字も一様に「四角く」見えます。
調べてみると、全角文字は文字種類に関係なく、横幅が9ピクセルであることがわかりました。したがって、半角英数以外は全部9ピクセルで計算すればよい、という結論に達しました。
一瞬にして、作業量が256分の1に軽減された瞬間です。

    

これで、コンバータ側で各列の列幅が計算できるようになりました。
この列幅データをこっそり、変換したPDBファイルの最終レコードに忍ばせておけば、準備は完了です。
Palm側のビューアでは、一覧からデータを選択した際、最終レコードにアクセスして、列幅をこっそり取得しますから、見かけ上、劇的に『データの読み込み』速度が速くなったように見えます。

こうして「読み込み中」の表示が不要になったVer.0.2がリリースされたのです。


前へ     目次へ     次へ

第14回 プログラミングの舞台裏「3.嘘も方便『読み込み中』〜Ver.0.2」