HTMLエディタを作る(17)(2000/08/28)
唐突ですが、再構築、って言うか全部書き直しになりました(笑)
まぁ第一の理由は、ソースコードが壮大になるにつれて潜在的バグの所在が把握しきれなくなったためですが。こう言う場合はゼロから組み直すと、全体の構造を掴めているので間違いが起き難くなるんですよね。実際、組み直しが功を奏してか、既知のバグは殆ど無くなりました。ま、あとはエンバグ部分だけでかね。
第二の理由としては……理由って言うか、きっかけと言うか。某ヤンジャン誌上で同名の漫画がスタートしたから、だったりする(爆) だって「萌え?」とかメールきたら俺、キレちゃうかもよ?(笑) 雑誌名の方は俺がは購読しているので良いのだが。読む気もねぇ漫画のファンだと思われたくない。それだけっす。
ちなみに、新しい名前は「マイページ・ストラクタ」にしました。まいぺ、とでも呼んでください。
作る前には良かれと思っていた仕様も、実際に使ってみると駄目駄目だったりすることはよくある話で、今回の場合はツールバーによく表れています。ボタンが大きすぎて使いにくかったですなぁ……と言うわけで、ツールバーは挿入ボタン系と編集ボタン系の二種類に独立しました。ちったぁマシになったかと。
今回、とくにユーザー定義ツールバー回りは原型を留めてないかも。ボタンエディタも昔風のでなくて、TTreeView を使った物に替えました。まだちっと小馴れてないので操作方法に問題がありますけどね。マウスとキーボード、行ったり来たり……書き換えの反応が鈍いし(^^;)
……が、見栄え的には良いでしょう。かなり。ふふっ★

前版の最終リリースで搭載したシェアウェアコンポーネント TEditor を本格的に取り込みましたんですが、特に着色に付いては嫌になるほどラクチンですなぁ! もう離れられないわっ!
ソースコードをかなり弄って MPS に特化しちゃいました。お陰でコンポーネントのバージョンアップが大変になってしまったかも(汗)
っていうか既に最新版への差し替えは絶望してたりして(爆死)
ブラウザ部、ファイラー部は今のところ移植に手をつけてません。まぁこのあたりは殆どカット&ペーストで事足りるのですが。ただ前版ではあっちこっちを同時進行してたせいで路頭に迷ってしまったわけですから、今回はエディタ部を完璧に仕上げてから、と言う事で……当面は手をつけられないですな(^^;)
ところで、ファイラーはどうも要らない気がしてきました。その分、リンク用の選択ダイアログをはなり汎用化してあります。今の仕様の方がすっきりしていて良いのかもしれない……
マクロプリプロセッサですが、機能的にはかなり後退しています。この辺も全面的に書きなおしているので……ただし前みたいな酷いスパゲッティでもない……かな。多分。同じ程度だとしても、マクロのネストが完全に動作するので良しとしよう、と。書き換えて良くなった部分の筆頭ですかね。
このマクロは複数行で書くことが出来ますが、1行としてしか読みこめない INI ファイルでの管理の為にはそのままでは拙いです。この辺は前版でももちろん実装していましたが、今回は更に賢くなりました。……って大袈裟か。
単に改行コード CRLF を '$n' に置換えたりするだけです(^^;) 同時にテキスト中の単体 '$' は '$$' にエンコードするので、ユーザーからは全く意識する必要はなくなった……筈です。
当初、エンコード後のコントロール文字のためのエスケープシーケンスは '\' で始まっていたんですが、'\' はディレクトリ名などのデリミタとして使われます。と言う事はテキスト中のエスケープシーケンスと混乱するので、C 言語などと同じく '\\' と書く仕様に落ち着きかけたんです。
が、そうなると実際にファイル名として使う場合には '\\' を一つにまとめなければなりません。ダルいでしょ、無駄でしょ。と言う事で、'\' は廃止して '$' にすることにしたんです……これなら普通使いませんからね。使うときにもそのままで構わないし。
……あれ? ってそのままでいいってコトは、デリミタの '\' だって別にいいんじゃないの? と思ったんですが。でも、現実にやってみると何故か駄目。エンコードは上手く行ってもデコードが上手く行かず、テキストが壊れます。アルゴリズムが悪いんですが……なので '$' だって頻繁に使うとなるとバグるんでしょうねえ……あうう。
ちなみにこのマクロテキストの保持・エンコード・デコード自体は、ツールバーの方の仕事です。
もう一つの大幅書き直しを行ったのが、通称スクリプトバーこと TScriptBars 。TScriptBars は TControlBar を継承して、内部配列を保持し TScriptBar という拡張した TToolBar を管理します。TScriptBar は TScriptButton を保持・管理します。
TScriptButton はマクロスクリプトを保持していて、押下されるとイベントハンドラを呼び出します。
これも「リスト系クラスだから」という思い込みで、TList クラスのインターフェイスと同等のメソッドを用意していました。再利用すると思って汎用性を求めたんですね。今回の大改変では「気にしないで特化する」と言う基本ラインがあるので、実装したのは Add、Remove、Clear くらいだったりします。
それも内部では TList クラスに処理されてますし……手抜きだなぁ(^^;) でも安定性はあがりましたよ。
再利用性はソースコードどころか関数単位にまで低下しましたが……ま、学習はしたので汎用のヤツはまたいずれ完成させられるでしょう。きっと。
コレクションクラスを使わないのも、手抜きのためです。あれってリストとアイテムの両方を継承しなきゃ行けないですが、そうしたところで殆どの機能は使いませんからねぇ(笑) TObjectList クラスに関しては後から知りました……。今更、設計の変更はだるいので、子オブジェクトについては自前で解放、で良いや(^^;)
文字列の検索・置換えは新たに実装。まぁ、TRichEdit を除けば自前で持ってるクラスは皆無ですし。ダイアログまでも自分で組みました。コモンダイアログのは論外って言うくらい使えるものではない! 検索くらいはともかく、置換えでは「全て置換え」は必須でしょう。
あとは入力の履歴とか、あるとないとでは大違いですし。
しかしまぁ、ウィンドウの数が異常に多いのか、実行ファイルのサイズが既に一メガに届きつつありますな(汗) .DFM をもとに、実行時にウィンドウを生成するコードを吐くツールで作ろうかしらん。
と言うわけで、最新の 0.2.00.007 をおっ届け〜っv(^^)