第14回 プログラミングの舞台裏「4.恐るべき縦スクロール〜Ver.0.3」

14−4 恐るべき縦スクロール〜Ver.0.3

コンバータが完成して、列幅問題も解決しましたので、一通り、読み込んだデータを縦横罫線付きで表示させるだけのことは、出来るようになりました。
次はスクロールの速度です。
表の一部分だけを見せるスクロールの原理は、それほど難しいことではありません。
要するに『左上の位置が、どのセルにあたるか』という情報だけあれば、その他の情報、つまり、表示すべき行数も列幅も決まっているので、それに合わせてデータを描画するだけです。
そして、その位置をジョグやボタンなどのイベントで変化させれば、スクロールしているように見えます。
図にすると、次のようなイメージですね。

    

最大のポイントは、1行でも動かせば、画面全部を再描画しなければならない、という点です。
実際にその速度が、どの程度になるのか、まずは、素直に作ってみましたが、結果としては、うーん、まぁまぁ、使えないこともないかな、という程度です。
ただし、CLIE N600C(33MHz)での使用感です。出来れば、VISORとは言いませんが、WorkPad c3(20MHz)で使える速度にしたいところです。しかし、いろいろ考えた結果、2つの選択肢が頭に浮かんでいました。


   「CodeWarriorでサブルーチンを作る」か「ギブアップ」か


問題は「方法」ではなく「速度」です。
グラフィックにしても、テキストにしても大量の画面データを移動する必要があるため、BASICでは実現できない、というのが正直なところです。

「ギブアップ」の文字が見え隠れする中で、遅れ気味のPalm Hackers Salonの原稿を書いていました。第7回「手書きメモを作ろう」です。
これは、NS BasicのGadgetオブジェクトの、シグネーチャ・キャプチャ機能を使った簡易手書きメモを作ろう、という内容です。
「その1」では、比較的サラサラと手書きが出来ることを題材にしていました。
この方法が、NS Basicで唯一のグラフィック画面を扱う方法だよなぁ、とサンプルプログラムなどを検討していました。
ご存知のとおり、このキャプチャ機能は、startSignatureCaptureで手書き機能を開始し、EndSignatureCaptureで終了して変数に取り込む、という手順です。
そのため、これは手書き限定だと思っていたのですが、実は、キャプチャ機能は思ったよりお行儀が悪いことを知りました。
それは、この機能で取り込まれる画像は、書かれた手書きの線だけでなく、配置されたGadgetオブジェクト上に存在するすべての画面情報が取り込まれる、という点です。
色々試してみると、予め表示されている線や図形はもちろん、文字やカラー情報、様々なオブジェクト類など、Gadgetオブジェクト上に表示されているものは何でも取り込まれるようです。


   偶然にも、Palm Hackers Salonの第7回のサブタイトルは「試してみるのはタダだから」でした。
   この時点で、一番得をしたのは私のようです。


NS Basic上で表示した文字列をグラフィックの情報として取り込むことが可能になりました。
キャプチャされた情報は、文字列型の変数に代入されますから、後は必要な部分だけを取り出せば、スクロールも出来るんじゃないか?
そう思ったのですが・・・形として文字列型に代入されているだけで、その中身は圧縮されているデータ列です。これをNS Basic側で展開して取り出そうとすれば、むしろこちら側の処理の方が足を引っ張る可能性があります。
(フォーマットの詳細については、ほぼ同じ頃、sdoさんがその構造を紹介されました。ご参照ください。)

でも、このキャプチャ機能が1つの望みですから捨てられません。ふと、スクロールのイメージ図に目を移します。

      

図にしてみると、書き直さない部分が上にズレるだけであることに気付きます。

    『2枚のGadgetをずらして使ったらどうだろう?』

そこで、2枚のGadget(Gad1、Gad2)を次のように、上下に少しずらして配置します。


    
    ※実際は、どちらも透明色です。


上の方にスクロールする場合、下の絵を上に移せば、スクロールするんじゃないか?
それは、2枚のGadgetを使って次の手順で実現できそうです。


    (1)Gad2の表示内容をキャプチャ
    (2)その内容をGad1へ表示
    (3)最下行のデータを更新


図にしてみれば、もう少しわかりやすいでしょう。


    
    ※実際は、どちらも透明色です。


早速テストです。
次のような簡単なサンプルを使って、出来るかどうか、また、その速度などはどうか、ということを試してみることにしました。
プログラム自体は、それほど複雑なものではありません。
左下の[START]をタップすると、Gad2の手書き機能が開始されるので、そこに適当に手書きをして、右下の[UP]をタップするとその内容がGad1に表示される、というものです。(ソースはこちら
実行してみると、Gad2の内容がGad1に表示され、上にスクロールした(ように)見えます。速度も悪くありません。
続けて、[START]→[UP]をタップすると、上方に更にスクロールします。


          


しかし、新たな問題が発生しました。
Gadgetを使ってキャプチャすると、そのオブジェクトの周囲に枠が表示されてしまいます。
通常は、この横線は致命的な問題ですが、幸いなことに、今回に限れば、この問題は些細なこと、いや、むしろラッキーなことです。
スクロールと同時に、高速で横線を引く処理まで手に入れたわけですから。


    
    ※横罫も同時に引けマス


後は、ビューアに組み込むだけです。


    と、簡単に書きましたが、位置調整にちょっと手間がかかった事を、付け加えておきましょう。


大幅な速度改善を盛り込んだVer.0.3は、こうやってリリースされました。

評価は「縦方向のスクロールがずいぶんと速くなったのですね。」というコメントです。
横方向のスクロールは・・・現状のままですが、データの閲覧は、縦スクロールが主体になりそうなので、横方向については現状でOKとさせていただきました。


さて、これは余談ですが、新しい方法を思いつき、密かなネタにしようと喜んでいたところ、某CLIE使いのお方より、仕組みがバレてしまいました。
どうやら、ハイレゾの状態では、キャプチャ機能が正常に働かないようです。
そのため、スクロールすると画面が乱れる、というか見えなくなってしまいます。
そういうことから、このスクロールがキャプチャを使った方法であることがバレてしまいましたが、同時に「ACV!はローレゾでお使いください」という但し書きが必要になりました。
なかなか世の中上手くいかないものですが、将来的にNS Basicのランタイムが解決してくれる日を待つことにしましょう。


前へ     目次へ     次へ

第14回 プログラミングの舞台裏「4.恐るべき縦スクロール〜Ver.0.3」