- PR -

【VB.NET】Form上のコントロール一覧を取得する方法

投稿者投稿内容
mito
ベテラン
会議室デビュー日: 2002/05/17
投稿数: 50
投稿日時: 2003-08-05 18:51
実際に試験してみました。
デバックに表示される自動変数のMe.Controlsは値が{System.Windows.Forms.Form.ControlCollection}と表示されているのでその型だと思うのですが・・・

で、おっしゃるとおりControls.ControlCollectionにしてもエラーは発生しませんでした!
派生していると大丈夫なんですね、勉強になりました。

ところでなちゃ様、男性ですね!(近頃心理学に興味が・・・間違ってたらすみません。)
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-05 19:45
引用:

mitoさんの書き込み (2003-08-05 18:51) より:
で、おっしゃるとおりControls.ControlCollectionにしてもエラーは発生しませんでした!
派生していると大丈夫なんですね、勉強になりました。


なんと言うかイメージが難しい場合もありますが、実行時の型(デバッグ時などに表示される型ですね)を見るよりも、メソッドやプロパティなどの「定義の型」が(まずは)重要だったりします。
# 場合によっては実行時の型に依存することもあります。

多くの場合、定義されている型に対して操作を行うプログラムを書くことが基本になります。この辺は、インターフェイスに対してプログラミングするという考え方に近くなります。
# 今回の場合は基底のクラスに対してになりますが。

Form の Controls の実行時の型は Form.ControlCollection ですが、
Form の Controls の定義されている型 Control.ControlCollection
という感じですね。
※実際に定義されているのは Control クラス

で、通常は、定義されている型である Control.ControlCollection 型に対してプログラミングするという事になります。
Controls は Control.ControlCollection であると思っておけば通常は差し支えないという事です。
# Form.ControlCollection は public ですが、
# 同じような物で、型が public ではない場合とかもあります。
# このような場合、実行時の型としてはアクセスできません。

引用:

ところでなちゃ様、男性ですね!(近頃心理学に興味が・・・間違ってたらすみません。)


うっ。18:33 辺り?ですか?
masima
会議室デビュー日: 2003/08/05
投稿数: 7
投稿日時: 2003-08-06 13:52
mitoさん、なちゃさん、回答ありがとうございました。
引数の型をControl.ControlCollectionにしたところ、問題なく動作しました。

元のソースだとコンテナ自身がコレクションに追加されなかったので、
以下のように修正しました。
------------------------------------------------------------
Public Sub ControlList(ByVal f As Control.ControlCollection)
Dim c As Control

For Each c In f
r.Add(c)
If c.Controls.Count <> 0 Then
Call ControlList(c.Controls)
End If
Next
End Sub
------------------------------------------------------------

どうもありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)