DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ユーザコントロールとコンポーネントクラスの役割

環境/言語:[windows xp / visual basic .NET 2003]
分類:[.NET]

お世話になります。かなだかと申します。
現在VB.NET 2003でコントロールについて勉強しているのですが、プロジェクト追加時や、新しいクラスの追加時に表示されるテンプレート内に、[ユーザコントロール]や[コンポーネントクラス]という項目があります。
これらをインターネットで調べてみたのですが、
[ユーザコントロール]はButtonやListboxを組み合わせてオリジナルのコントロールを作成するもの。[コンポーネントクラス]は、再利用可能である何か。程度にしか理解できず、イマイチ使いどころもわかりませんでした。
これらの適切な使いどころや、使い方はどういった場合なのでしょうか?
■No18099に返信(かなだかさんの記事)
> これらの適切な使いどころや、使い方はどういった場合なのでしょうか?

継承して新たに機能追加する場合は、コンポーネントになります。
複数のコントロールを組み合わせたコンテナを作る場合は、ユーザーコントロールになります。
じゃんぬねっとさん、ご回答ありがとうございます。
現在、Tabpageコントロールを拡張して、RichTextBoxコントロールを所持したコントロールを作成し、

Class C_ExpandedTabPage
Inherits TabPage
...
End Class

としているのですが、
>継承して新たに機能追加する場合は、コンポーネントになります。
これらをコンポーネントクラスのテンプレートから作成したほうが良いということでしょうか?

>複数のコントロールを組み合わせたコンテナを作る場合は、ユーザーコントロールになります。
わかりやすい回答ありがとうございます。
現在DriveListbox、DirectoryListboとFileListboxをフォーム上に別々に張っているのですが、これをユーザコントロールとして作成してみようかと思います。
■No18101に返信(かなだかさんの記事)
> これらをコンポーネントクラスのテンプレートから作成したほうが良いということでしょうか?

TabPage の場合はそうしなければならないでしょうね。
コンテナですから。

自動で生成された部分を見てみると良いです。
親切な回答ありがとうございます。
継承TabPageクラスをコンポーネントクラスへ置き換えることにしました。

> TabPage の場合はそうしなければならないでしょうね。
> コンテナですから。
いろいろ調べましたが、情報が掴めないので・・・
コンテナとは、MenuItem、PanelやTabPageのような自身にコントロールを0以上包含可能なコントロールであると認識しているのですが、包含できないTextboxやLabelにはコンポーネントの実装は不要なのでしょうか?

>自動で生成された部分を見てみると良いです。
アドバイスありがとうございます。
とりあえず、Private Sub InitializeComponent()内の内容を参考にしてみます。
■No18104に返信(かなだかさんの記事)
> いろいろ調べましたが、情報が掴めないので・・・
> コンテナとは、MenuItem、PanelやTabPageのような自身にコントロールを0以上包含可能なコントロールであると認識しているのですが、包含できないTextboxやLabelにはコンポーネントの実装は不要なのでしょうか?

はい、不要ですね。
ただ、そういう実装があっても問題にはなりません。

> アドバイスありがとうございます。
> とりあえず、Private Sub InitializeComponent()内の内容を参考にしてみます。

そこではなくて、Overrides された Dispose メソッドやフィールド メンバを見ましょう。
> そこではなくて、Overrides された Dispose メソッドやフィールド メンバを見ましょう。
すいません。コントロールプロパティを設定する場合の参考場所だと思っていました。
テンプレートを使用するとついてくるコンストラクタとデストラクタがMSDNライブラリで言われている「コンポーネントの初期化と終了」あたりの問題に絡んでくるのですね。ありがとうございました。
解決済み!
■No18108に返信(かなだかさんの記事)
> すいません。コントロールプロパティを設定する場合の参考場所だと思っていました。

すみません。(*_ _)
"コンポーネント クラスを選択した時に、雛形になっている部分" と書いた方が正しかったですね。
解決済み!
解決済み後に申し訳ないのですが、コンポーネントの利用について調べていますと、
http://www.vbstation.net/tips/inherits_control.htm
というページを見つけました。
上記のページの場合、ユーザコントロールからInherits部分を拡張目的のクラスへと書き換えるようにしているのですが・・・

コントロールを拡張したい場合はコンポーネントクラスを利用すると教えていただいたのですが、
コンポーネントテンプレートはデフォルトの設定でSystem.ComponentModel.Componentをインヘリタンスしていますよね?
そうなると拡張したいコントロールを継承できません。
ということは、インヘリタンス基を上記のような[コンポーネントクラステンプレートを選択]→[拡張したい目的のコントロールへ書き換え]
で継承元を書き換えるという手順は普通なのでしょうか?
書き換えが正しくないとすれば、コンポーネントクラスは、拡張コントロールというよりは、コントロール管理クラスのような気がするのですが・・・
というより、手順的には 「カスタム コントロール」 を選択するのが正しいと思います。
(コンポーネント クラスを脳内置換して答えていました)
うぅ〜ん・・・むずかしいですね(汗
コンポーネントクラス・ユーザコントロール・カスタムコントロールについて、書店にでも赴いて勉強してみます。
親切な回答ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板