TagControlのTabPageの分割

タグの編集
投稿者 刈谷勇  () 投稿日時 2008/8/7 07:32:00
現在、VB2005で開発しています。 
 
TabControlがあるFormがあります。 
TabControl上にはTabPageが数枚あり、それぞれ別のレイアウトになっています。 
そのため、Formクラスが大きくなってしまうため、別のクラスか、ファイルに分割したいと思っています。 
 
普通に考えるとPartial Classでファイルを分割すればいいのですが、今後もTabPageのレイアウトを考えると変更するたびにPartial Classへ手作業で切り分けなくなってしまうと思います。 
 
なにかいい方法はないでしょうか? 
よろしくお願いします。
投稿者 うたひこ  () 投稿日時 2008/8/7 08:15:00
こんばんわ。 
 
ちょうど今タブコントロールをいじっていて、 
実にタイムリーな話題です。 
 
 
 
なんだかインテリセンスに表示されないこともありますが、TabPageを継承したコントロールをおつくりになられてはいかがですか? 
 
ちなみにTabpageはPanelから継承されています。
投稿者 刈谷勇  () 投稿日時 2008/8/7 19:57:00
>>1 
うたひこさん、こんにちは(で、いいのかな) 
 
>なんだかインテリセンスに表示されないこともありますが、TabPageを継承したコントロールをおつくりになられてはいかがですか?  
 
多分、継承で作成する場合、デザイン画面でのオブジェクトの配置等が出来なくなってしまいますよね。これだと、後々画面にオブジェクトを追加しようとしたときにレイアウトの変更が大変かと思いまして、やめてしまいました。 
 
私の知識不足の部分もあると思いますが、継承で作成した場合のアドバイスをお聞かせ願えればと思います。
投稿者 刈谷勇  () 投稿日時 2008/8/7 20:17:00
すみません、開発環境に誤りがありました。 
正式には VB2005 Expressです。 
(今回の質問にはあまり関係ないかもしれませんが・・・)
投稿者 うたひこ  () 投稿日時 2008/8/7 20:44:00
>>5 
 
そういうことですか。失礼しました。 
 
タブコントロールについて経験値はさほどありませんが、 
「僕が同じことをやるならこうする」というプロセスを、 
実現可能か検証してはいないですが、 
ご参考程度に書いてみます。 
 
 
1、デザイン画面での編集は、 
何かの属性を付加すればできたような気がしたので、 
UserControlやControlクラスにどんな属性が付加されているかオブジェクトブラウザやReflectionの機能を用いて調査し、 
それと同じ属性を継承タブページに付加する。 
2、1によってデザイン画面での編集が実現できたら、 
継承タブページを全て特定の名前空間や 
特定のクラスの入れ子クラスにし、 
いちいちタブページが増えるたびに 
タブコントロールに追加しなくても、 
リフレクションを用いてタブコントロールに 
自動追加できる仕組みを作る。
投稿者 刈谷勇  () 投稿日時 2008/8/7 22:30:00
>>6 
うたひこさん 
さらなるアドバイスありがとうございます。 
 
>そういうことですか。失礼しました。 
いえ、最初にExpressと明記しなかった私が悪いので、こちらこそ申し訳ありませんでした。 
ちなみに、Standard Editionだとこの辺の作成支援の機能があるのでしょうか? 
 
 
教えていただいた方法を早速調査して見ます。 
結論がでるまでしばらく時間がかかると思いますが、質問や最終結果が出ましたら、ご報告します。
投稿者 刈谷勇  () 投稿日時 2008/9/12 18:58:00
>>7 
うたひこさん、こんにちは。 
回答が遅くなり申し訳ありません。 
 
結論からいいますと、教えて頂いた方法では行いませんでした。 
理由として、 
・Reflectionの知識が無く、習得に時間がかかる。 
・完全に属性を抜き出した保障が出来なく、動作不安定になることが懸念される。 
です。 
せっかく教えていただいたのに申し訳ありませんでした。 
 
代替案として行った方法は、UserControlにページの内容を作成しページ作成時にリアルタイムでUserControlを追加する方法で対応しました。 
 
また、なにかありましたらよろしくお願いします。 
 
P.S. うたひこさんが戻ってきていただいてうれしいです。
投稿者 うたひこ  () 投稿日時 2008/9/12 21:39:00
>>8 
こんにちは。 
 
僕の方も、この問題について色々と試みた結果、 
 
1,プロジェクトにクラスを追加する。 
 (UserControlを追加した場合の挙動を完全に把握している場合は 
  UserControlを追加しても可) 
2、UserControlを継承させ、デザイナ画面でレイアウトする。 
3、レイアウトが終わったら、UserControlではなくTabPageを継承するように書き換える。 
4、その後もレイアウトの変更が必要な場合は一時的にUserControlに書き換える。 
 
という手法に落ち着きました。 
 
ただしこの手法は予期しないコード改変の危険性があるので、 
信頼性が強く要求されている場合には刈谷さんの方法がいいと思います。 
僕はUserControl一枚分のメモリがもったいないことと、 
階層が深くなるのがいやだと思い、この方法にしました。 
(こういった時こそソリューション分割かな…?) 
 
機会があればお試し下さい。