HTMLエディタを作る(10)(1999/06/20)

現在、ツールバーのカスタマイズを捻出している所である。有り勝ちなものとしては「定義済みのボタンを選択して並び替える」というのが一般的なものなのだが、それは後回しにする事にした。HotMilkでのカスタマイズは、タグの挿入に重点を置いたもので、ユーザーが設定できるタグの数に制限がない事を仕様とした。

まぁ、ウィンドウの方の都合で数の上限そのものは存在するのだが、設定できる文字列には制限を設けない。良くある文章のテンプレート化にも使えるものを目指し、タグ挿入時に必要な情報を補完できるように、各種のダイアログの呼び出しを可能とさせる!



現時点ではTControlBar、TToolBar、TToolButtonを一括してリスト管理できる非ビジュアルコンポーネントを開発中である。これがまた難物で、既に4度ほど設計変更を行いようやく思い通りの動作をはじめるようになった。最終的にはもう一度くらい大変更が加わるかもしれない。

というのは、結局の所は独立したコンポーネントでなくともTControlBarを継承すればすっきりするという事だ。最初の仕様決定の時、この事は十分に悩んだはずだった。しかし、TControlBarにはTControlBarのメソッドやプロパティがあり、それらと混ざってややこしいコンポーネントになる事を嫌ったので、非ビジュアルコンポーネントにTControlBarを登録するという形を選んだのである。

ちなみに何故TCoolBarを使わずにTControlBarなのかというと、バンドの管理が面倒だからである。コレクションクラスの一種としては確かにTCoolBarの方が整備されているのであるが、実行時の取り扱いの点ではTControlBarの方が使いやすく感じたのだ。

第一、整備されてない分は自分好みの設計ができるとい余地があるという事ではないか!


TToolBarもまた、配下のコンポーネントをリストを持っているが、集中管理機構としては弱いと思われたので、TListクラスと組み合わせて強化してある。ただしButtonsプロパティを上書きしてしまったのでTToolButton以外のオブジェクトが登録される事を想定していない。追加できる事はできるが、従来の総括アクセス方法ではアクセスできないという事だ。

TToolBar自体に Addメソッドを搭載し、動的なバンドやボタンの生成が楽にできるようにした。基本的な値の設定などの為にはこの方が統一しやすいのだ。


ToolButtonもまた拡張されている。前述のタグ指定などの為のプロパティを実装し、内部的なクリックイベントへの対処の為のハンドラを追加し……と言った具合に。



この種のコンポーネントのリスト管理について、難しいと思う事があった。すなわち、あるインデックスで返されたポインタが現存する実体を指しているとは限らないし、既に削除されてNILを返すかもしれないという事だ。

VCl一般では内部で不都合がでない限りは、そういうことに無頓着に言われたまま処理を行っているようだ。しかし、今回の様なコンポーネントの配列管理というとそうも行かないらしい。処理できない値の処理を、コンポーネントで解決するのかアプリ側で解決するのか曖昧である。

筆者個人の指針としては、コンポーネント側で不正な値をNILにすげ替えて返答し、アプリ側でNILポインタを処理しない様に組むと具合が良いように感じる。まぁしかし、オブジェクトを破棄しても参照ポインタを初期化しないVCLの仕様も変だし、それを知ってて初期化し忘れる開発者もいけないのだろう



HotMilk 0.0.4.27

上のスナップショットで「背景画」というボタンが無効になっているのが解ると思うが、これが何だか上手く動作しないで悩んでいる。TControlBarにはコントロールに画像を貼り付けて背景とする機能があり、それ自体はちゃんと動作してくれた。しかし、その上に張りつけるTToolBarのTransparentプロパティを設定しても透過しないのである。

ヘルプによれば「ペイント時の不具合はツールバーが可視化する前に設定して回避せよ」てな風に書いてあるので、その様にしてみたが、デフォルト値としてそうする限り上手く行かない模様。透過する事はしてくれるのだが、TControlはおろかTFormをブチ抜いてデスクトップまで貫通してしまうから困りもの……

流石に他のアプリは透過していないものの、これでは却って見難いではないか! 困った困った!! 何が悪いのか判らないので、当面この機能は眠らせる事にする。この辺りはTCoolBarの方がきちんと動作してくれるようだ。むう。