TFormPanel : TPanel に TForm をハメ込んで表示する written by Osamu Takeuchi 2001.04.14 版 osamu@big.or.jp, http://www.big.or.jp/~osamu/ [説明] 別のフォームを、パネル内にハメ込み、チャイルドウィンドウと して使うためのコントロールです。TNotebook/TPageControl の 代わりに使えば、各ページを独立のTFormとして設計・管理する ことができます。これにより、肥大化しがちなメインフォームの ユニットを、いくつかのユニットに無理なく分割することができ、 コードの管理をしやすくなります。 [使い方] 内部にハメ込むフォームを指定するために、次の2つのプロパティ がTPanelに追加されています。 public property Form:TForm; read/write published {$IFDEF WIN32} property FormName:string; read/write {$ELSE} property FormCaption:string; read/write {$ENDIF} それぞれ、フォームそのもの、あるいはフォームのキャプション・ Name プロパティを代入することで、指定したフォームをチャイルド ウィンドウとして、TFormPanel いっぱいに表示することができます。 また、Form に nil が代入されたり、FormCaption/FormName に '' が 代入された時には設計時に TFormPanel に乗せてあったコントロールが そのまま表示されます。 初期 Delphi では実行時にすべての Form の Name プロパティが 空であると言う困った仕様(?)になっているため、FormName は FormCaption というプロパティで代用されています。実際には WIN32 環境でも FormCaption プロパティは利用可能ですが、 これは下位互換性のためだけに残されているものです。 代わりに FormName プロパティを使うようにしてください。 設計時には Form プロパティは使用できません。FormName (または FormCaption) プロパティでフォームを指定して下さい。 実行時には、Fromプロパティを利用した方が、確実で、高速と なります。 フォームはハメ込まれる前にCreateされている必要があります。 ただし、csLoading in ComponentState の場合には、ハメ込む フォームが作られていない場合が多いと考え、TFormPanelが表示 されるまでに指定フォームがCreateされていればよいようにして あります。 指定されたフォームがメニューを持つ場合、つまり Form.Menu <>nil の場合には、このメニューはTFormPanelを所有する フォームのメニューにマージされます。 ただし、メニューのマージは、TMainMenu.Merge手続きを使って 実現されているため、同時に2つ以上のメニューをマージすること はできません。したがって、一つのフォームに2つ以上の TFormPanelを配置する場合や、MDIアプリケーションの中で使う 場合、他でAutoMergeをTrueにしたMenuを使う場合には注意が必要 です。 TFormPanelを所有するフォームがメニューを持たない場合、かつ、 はめ込まれたフォームがメニューを持つ場合には、はめ込まれた フォームのメニューを、所有フォームのメインメニューとします。 [制限事項] はめ込まれるFormのTForm.AutoScrollはTFormPanelの中では機能 しないので、AutoScrollの変わりに、TScrollBoxを使う必要が あります。 TFormPanelのOwnerがメインフォームである場合、他フォームを モードレスでShowすると、MergeされていたメニューがUnMerge されてしまいます。これを防ぐには、メインフォームの OnActivate で TFormPanel.SetupMenu を呼んでください。 [使用例] TNoteBook/TPageControl の代用として用いる。 > オブジェクトインスペクタにて > TabSet1.PageIndex:=0; > FormPanel1.FormName:='Form2'; > あるいは > FormPanel1.FormCaption:='Form2'; procedure TForm1.TabSet1Click(Sender:TObject); begin case TabSet1.TabIndex of 0: FormPanel1.Form:=Form2; 1: FormPanel1.Form:=Form3; 2: FormPanel1.Form:=Form4; 3: FormPanel1.Form:=Form5; end; end; [使用に関する注意] 特に制限は設けませんが、ソースを再配布する場合には、コメント 部分を残し、原作者がtakeuchi@exp.t.u-tokyo.ac.jpであること、 誰がどの部分に手を加えたか(もしあれば)を明記した上でお願い します。 これを使って有用なアプリケーションが出来上がったらメールでで も御一報頂けると励みになります。 ************************************************************** modified by Osamu Takeuchi 1997.4.30 takeuchi@exp.t.u-tokyo.ac.jp フォーム切り替え時のShow/Hideのタイミングを調整し、ちらつきを 押さえた。これにより、Form=nil、あるいは、FromCaption=''の時 に、もともと設計時にTFormPanel上に配置してあったコントロール を利用することができるようになった。 ************************************************************** modified by Osamu Takeuchi 1997.11.14 takeuchi@exp.t.u-tokyo.ac.jp TFormPanelをメインフォームに貼った場合にメニューのMergeが 解けてしまう場合があるのを回避するため、SetupMenu手続きを 新設した。 ************************************************************** modified by Osamu Takeuchi 2001.04.14 osamu@big.or.jp 32bit 版 Delphi では、はめ込む Form を Name プロパティで 設定できるように改良。Delphi 1 では実行時、すべてのForm の Name プロパティが空であるという困った仕様(?)があるので、 このプロパティは利用できない。この変更により、32bit Delphi では FormCaption プロパティの利用は推奨されなくなった。 このプロパティは下位互換性のためのみに残されている。Delphi5 以降では FormCaption プロパティは旧式とされ、デフォルトで オブジェクトインスペクタに表示されない。 Delphian World に登録した初期バージョン。 ************************************************************** modified by Osamu Takeuchi 2003.11.11 osamu@big.or.jp Delphi7 への対応 FmPnlReg.pas にちょっと手直し Version.inc のバージョンアップ **************************************************************