趣味のプログラミングではC++Builderを使っています。仕事では Visual Studio か vi です。
ここでは、Borland C++Builder に関連する記事を書きます。
ただ、時間もあまりないので、良いサイトへのリンクがメインになります。
このページに記載されている情報は自由に参考にして頂いて構いません。
ただし、忙しい中で書いているのでご質問には解答できませんのでご了承下さい。
・ドッキング/フローティング
・TDockTabSet
・より高度なドッキング
ドッキング/フローティング
パネルなどのコントロールは DragKind プロパティを drDock、DragMode を dmAutomatic にすることで
ドラッグによってコントロールを任意のドッキングサイトにドッキングしたり、フローティング状態に
することが可能。
ドッキングサイト側は、DockSite を true にし、UseDockManager も true とすること。
また、起動時にドッキング状態から始めたい場合は ManualDockメソッドでドックサイトにドッキングすることで実現する。
フローティングから始めたい場合は、ManualFlotメソッドを使用して任意の位置にフローティング可能。
なお、Borland Developer Studio 2006 (SP1) はフォームをドッキングクライアントとするのが良いようだ。
パネルなどをそのままドッキングクライアントとすると、フローティング位置が正しく設定されないようだ。
TDockTabSet
Borland Developer Studio 2006 や Visual Studio 2003/2005 などで利用されている
ユーザインタフェースを実現するためのコントロールです。
いつもは画面端にタブ形式で小さくなっているが、マウスカーソルを合わせると自動的に
ウィンドウが現れるというコントロールです。
Using the TDockTabSet component by Jeremy North
Delphi 2005 メモ
TDockTabSet.DestinationDockSiteのドッキング状態を保存・復元するには?
より高度なドッキング
Borland Developer Studio 2006 の IDE はドッキングやフローティングができます。
また、TDockTabSet も利用されているようで画面を広く使うのにも便利です。
その中でもドッキングクライアントを重ねるとタブコントロールになるというのは便利じゃないでしょうか?
Visual Studio の IDE にもそのような機能がありますね。
これを実現する方法ですが、標準のコントロールのプロパティをいじるだけではダメなようです。
現在開発中の 1st Modeller での試行錯誤から見つけた方法を以下に書きます。(2006/5/21現在)
- ドッキングクライアントはフォームとする(frmClient)
- frmClient上にコントロールをAlign=alClientで貼り付ける
- frmClientはDragKind=dkDock、DragMode=dmAutomatic
- frmClientは別のコントロールを受け入れるためにDockSite=trueとする
- ただし、frmClient上のコントロールはDockSite=falseとする
- frmClientはドッキングクライアントの種類だけ作る
- 別途複数ドッキングを表すためのページコントロールを含むフォームを作成する(frmPageControl)
- frmPageControlはDockSite=false、DragKind=dkDock、DragMode=dmAutomatic
- frmPageControl内にあるTPageControlはDockSite=trueとする。
- frmClientにOnDockDropイベントを実装する
- OnDockDropイベントではドロップされたコントロール(つまり他のfrmClient)を新たに作成したfrmPageControlに再ドッキングする
- frmPageControlをVisible=trueとする
上記で大まかには上手く行きますが、frmClientがドッキング済みの場合は勝手にフローティングされてしまいます。
そこで、以下の手順でドッキングクライアントの差し替えを行います。これはfrmClientのOnDockDropイベント内で行います。
- // frmPageControlとfrmClientの差し替え & 自分自身はページコントロールにドッキング
frmPageControl->ReplaceDockedControl(this, frmPageControl->PageControl1, frmPageControl->PageControl1, alClient );
- // frmPageControlに先ほどドロップしたコントロールを再ドッキング
Source->Control->ManualDock(frmPageControl->PageControl1, Source->Control, alClient);
また、フローティングの場合でも位置が正しく復元されない問題は以下の手順で直ります。
- frmPageControl->BoundsRect = this->BoundsRect;
これであとはfrmPageControlのPageControl1がドッキングサイトになってくれますのでドロップされる度に
ページコントロールが増えてゆきます。
しかし、逆にアンドックしてページが1つになった時は元のfrmClientに戻って欲しいと考えますが、
自動ではそのようになってくれません。
以下の手順で解決します。
- frmPageControlに張り付いているTPageControlを派生したものに換える
- 派生したページコントロールにDoRemoveDockClient()をオーバライドさせる
- DoRemoveDockClient()内でフローティング時は次の処理を行う。
- PageControl1->DockClients[0]->ManualFloat(frmPageControl->BoundsRect);
- DoRemoveDockClient()内でフローティング時でない場合は次の処理を行う。
- PageControl1->DockClients[0]->ReplaceDockedControl(frmPageControl, frmPageControl->Parent, frmPageControl->Parent, alClient );
他にもまだまだ問題があります。解決方法は時間が出来たら書きます。
- frmPageControlにfrmPageControlをドッキングしたら入れ子のページコントロールになってしまう
- ページコントロールのタブにfrmClientのアイコンを表示したい
- frmPageControlのアイコンとタイトル名はアクティブなタブの値を表示したい
- frmClientをパネルなどにドッキングすると新たにドッキングするコントロールは横や下に並べることが出来なくなる
- 上記と同様にfrmPageControlの横や下に並べてドッキングできなくなる
VCLの標準機能でドッキングができるのは素晴らしいのですが、中途半端なんですよね。困ったものです。
|