今年はGWの後半を4日間の連休とした。その間、Delphiをちょいちょい触っていた。

人間万事塞翁が馬、というべきか。

けっこうちんたらとやっていたのだが、最終日の午前中に開発環境がフリーズした。やむなく強制終了し起動し直すと、GW前半に手を入れた部分から消えている・・・。単に保存していなかっただけなのだが・・・。

仕方なく頭に残っているうちにコードを書き直してみた。しかし、これがいい復習になった。

成果としては、
・Delphiのポインタをほぼ使えるようになった。
・基本的な構文をかなり覚えた。
・共通モジュールを別のクラスへ難なく切り出せるようになった。

課題は
・ファイルのダイアログがあるが、もう少し慣れないと失敗しそう。おそらくDelphiでフォーム作成するとご丁寧にダイアログを呼び出すだけで使えるようにしているからだと思う。別言語でその都度生成する方が慣れているのでうっかり破棄しそうで・・。
・データクラスをJavaやVBAのようには作れなかった模様。これはたぶん何か間違えているだけだとは思うが・・。


昨日時点で完成形が明確になってきた。ついでに使いやすいバイナリファイルビューアも作ろうかと思ったが、とりあえずは今作りたいものを目指すことにする。
今、処理対象としているデータにはビッグエンディアンとリトルエンディアンが混在している。
エンディアンって何?という方はWikiのエンディアンの項目を参照されたい。
また、貰うデータでそんな混在やめて貰えばいいじゃない?という意見もあるかと思う。しかし、これもまたその拡張子のものは随分と昔からその定義であり、その分野では広く使われているものなのだ。これもやむをえまい。

Windowsでは通常リトルエンディアンを使う。

とはいえ、データクラスの getter/setterで吸収できるものだろう。が、ちと面倒なのがリトルエンディアンはアドレスの増加単位が8ビットとか16ビットかで値の格納方法が違う事だ。
これはファイルに必ず入っているファイルコード、これはビッグエンディアンなので、これを使って確認することにしようかと思っている。
具体的には、ファイルコードを増加単位が8ビットと16ビットのリトルエンディアンに変換し、それが定義されている値と合致した方を採用する、という方法だ。

VBAでもできるし、言語的に慣れているのだが・・。また、ポインタを多用したいのでCの方がラクかも知れないが、Delphiには描画に優れいるコンポーネントがあるため・・、って書いていて、それならC++Builderでもよかったんじゃ?と脳裏をかすめたのも事実である。
めげずにがんばる。
慣れていない言語でも、大まかの流れを読む事はできる。最近ではあるソフトのマクロ言語を読む羽目になったが、概ね理解できた。
しかし、書くとなったら話は別だ。

現在、あるツールを作りたくてDelphiでのファイル読み込み。バイナリファイルを3種類、読み/書きを行おうとしている。
昔ながらの書き方ってのもあるが、FileStreamを使いたいところだ。で、インターネット上でサンプルを探したのだが、失礼を承知で書くと、日本語のサイトはどうもいまひとつ・・・。

最終的にかなりシンプルに仕上がったのだが、そこに行き着くまでの道のりの長かったこと。

ただ、勉強にはなった。
・DelphiのポインタはCのものより使い勝手がよくない。
・あることを実現しようとすると、選択肢がありすぎる。まあ、これは使いこなすとなればいろんなアプローチで試せるということなのだろうね。

さて、ファイルは何とか読めたが、あとはいかに省メモリかつ簡単に必要なデータへアクセスする仕組みを作るか、である。それも極力高速で。

ゴールデンウィーク、といっても今年は3連休+4連休で、間は仕事であるが、この時期に進めていこうかと思う。