子ウィンドウによってツールバーが変わる
MITOUJTAG Version2では、子ウィンドウがいっぱい開いて、その中でいろんなツールが動きます。
バウンダリスキャンの可視化や、ロジアナ、JTAGスクリプト、etc...
こういったいろいろなツールが切り替わったときに、メインのツールバーのボタンに、現在可能な操作だけが出ると便利だと思いました。
・バウンダリスキャン可視化画面のツールバー
・ロジアナ画面のツールバー
・テキストエディタ(JTAGスクリプト)のツールバー
このような感じで切り替わります。
現在可能な操作に関するボタンだけがメインのツールバーに現れるので、操作の間違いが少なくなります。
このしくみを作るのは結構難しかったです。
Borland C++ Builderのビジュアルコンポーネントライブラリでは、TToolBarは複数のボタン(TToolButton)を持つことでツールバーの機能を実現しています。しかし、TToolButtonに対するAddとかClearとかDeleteといったメソッドがありません。ボタンを動的に追加したり削除したりするということはあまり考慮されていないようです。
ツールバーにボタンを追加するには、
TToolButton *tb = new TToolButton(ToolBarTmp);
tb->Parent = ToolBarTmp;
tb->ImageIndex = ...;
tb->OnClick = ...;
とやって、ボタンの親コンテナとなるTToolBarを引数にTToolButtonのコンストラクタを呼び、parentやイメージ番号やキャプション、幅などを指定します。
子ウィンドウを作るDLLの中で、これらの元になるデータを用意します。そして、MDIの子ウィンドウがアクティブになったのをトリガとして、ツールバーの動的生成ルーチンを呼び出せば、子ウィンドウを切り替えるたびにツールバーが切り替わる仕組みができあがります。
こうして作ったボタンは親コンテナからTToolBar->Buttons[i]で参照できるのですが、ボタンを削除するには、
for(int i= ToolBarTmp->ButtonCount - 1;i >= 0;i--)
{
delete ToolBarTmp->Buttons[i];
}
のように、ボタンのデストラクタを呼び出すようです。
親の削除メソッドを呼ぶのではなく、子のオブジェクトを直接削除するのが気持悪いところです。
しかも、新しく作ったボタンはツールバーの左から追加されていきます。
たくさんのボタンを作ると、今まで作ったボタンがスクロールして右にずれていくのが見えてしまいます。
これを回避する正しい方法はわかりませんでしたが、機能上常に固定されるボタンと、ウィンドウによって表示・非表示を変えたいボタンを別々のツールバーに用意すると、心理的にはちらつかなくなるようでした。
| 固定リンク
コメント