- - PR -
【VB.NET】Form上のコントロール一覧を取得する方法
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-08-05 18:51
実際に試験してみました。
デバックに表示される自動変数のMe.Controlsは値が{System.Windows.Forms.Form.ControlCollection}と表示されているのでその型だと思うのですが・・・ で、おっしゃるとおりControls.ControlCollectionにしてもエラーは発生しませんでした! 派生していると大丈夫なんですね、勉強になりました。 ところでなちゃ様、男性ですね!(近頃心理学に興味が・・・間違ってたらすみません。) | ||||||||
|
投稿日時: 2003-08-05 19:45
なんと言うかイメージが難しい場合もありますが、実行時の型(デバッグ時などに表示される型ですね)を見るよりも、メソッドやプロパティなどの「定義の型」が(まずは)重要だったりします。 # 場合によっては実行時の型に依存することもあります。 多くの場合、定義されている型に対して操作を行うプログラムを書くことが基本になります。この辺は、インターフェイスに対してプログラミングするという考え方に近くなります。 # 今回の場合は基底のクラスに対してになりますが。 Form の Controls の実行時の型は Form.ControlCollection ですが、 Form の Controls の定義されている型 Control.ControlCollection という感じですね。 ※実際に定義されているのは Control クラス で、通常は、定義されている型である Control.ControlCollection 型に対してプログラミングするという事になります。 Controls は Control.ControlCollection であると思っておけば通常は差し支えないという事です。 # Form.ControlCollection は public ですが、 # 同じような物で、型が public ではない場合とかもあります。 # このような場合、実行時の型としてはアクセスできません。
うっ。18:33 辺り?ですか? | ||||||||
|
投稿日時: 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 ------------------------------------------------------------ どうもありがとうございました。 | ||||||||
