2010/10/21(Thu) 23:33:10 編集(投稿者)
■No54460 (uooono さん) に返信
> 今後のバージョンアップ・・・今のところ不明なのです。
であればなおのこと、レガシーコードは捨てるべきかと思いますよ。
shu さんが指摘されていますように、現在は Obsolete とされるクラスなのですから。
.NET 4 では、既に「警告」が発生する機能であり、使うべきではありません。
.NET 3.5 以下では警告にならないとはいえ、やはり積極的に使うべき物ではありません。
> > Visual Basic 6.0 のコントロール配列のデザイン時の機能は提供されません。」
> とありました。実行時の機能は提供されているため、使ってみようと思います。
あえて、非推奨とされている手法を採用する事も無いと思いますが…。
いずれは廃止される可能性があり、少なくとも現行バージョンでは警告されるわけですし。
イベントをまとめられるという利点はありますが、デザイン時の機能が提供されていない以上、
使い勝手は List クラスと大差無いですし、設置する手間を考えると、むしろメンテナンスしにくくなりますよ。
それでも使いたいのであれば、こんな感じです。
下記では、Label1〜3、TextBox1〜3 をコントロール配列にしています。
'
'Microsoft.VisualBasic.Compatibility アセンブリを参照設定に加えておいてください。
'
Imports System.ComponentModel
Imports Microsoft.VisualBasic.Compatibility.VB6
Public Class Form1
Private WithEvents Labels As Microsoft.VisualBasic.Compatibility.VB6.LabelArray
Private WithEvents TextBoxes As Microsoft.VisualBasic.Compatibility.VB6.TextBoxArray
Public Sub New()
InitializeComponent()
If Me.components Is Nothing Then
Me.components = New Container()
End If
Me.Labels = New Microsoft.VisualBasic.Compatibility.VB6.LabelArray(Me.components)
Me.TextBoxes = New Microsoft.VisualBasic.Compatibility.VB6.TextBoxArray(Me.components)
Me.Labels.SetIndex(Me.Label1, 0S)
Me.Labels.SetIndex(Me.Label2, 1S)
Me.Labels.SetIndex(Me.Label3, 2S)
Me.TextBoxes.SetIndex(Me.TextBox1, 0S)
Me.TextBoxes.SetIndex(Me.TextBox2, 1S)
Me.TextBoxes.SetIndex(Me.TextBox3, 2S)
'これらは、Form の Load イベントに置いても良い。
'VB6 からの自動コンバート時には、これらが designer.vb 内の InitializeComponent に記載される。
End Sub
Private Sub TextBoxes_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBoxes.TextChanged
Dim index As Integer = TextBoxes.GetIndex(DirectCast(sender, TextBox))
Labels(index).Text = "[" & TextBoxes(index).Text & "]と入力"
End Sub
End Class
> ここで、コンバートされたArrayをみてみると、例えば、Label1オブジェクトで0と1のインデックスをもつ場合、
> Label1(0).Text
> Label1(1).Text
> でVB6.0でも、コンバージョン直後のLavelArrayを使用したVB2005でも設定・参照なりができていました。
Label1(0) は Label 型で、Label1 は LabelArray コンポーネントですね。
結局、先のスレッド( No54311 〜)の中で、shu さんが提案された「配列やListで管理する」という話が
「LabelArray クラスで管理する」へと変わっただけで、その本質は何も変わっていません。
> VB2005でのデザインをみてみると、実際のラベルのNameはそれぞれ「_Label1_0」と「_Label1_1」へ自動変換されていました。
> (枠外に水車マークの「Lavel1」オブジェクトが出現していました)
Lavel → Label1 という突っ込みはさておき、
枠外に表示されているものは、それがコントロール(System.Windows.Forms.Control)ではなく
コンポーネント(System.ComponentModel.Component)であることを示しています。
コンポーネントとしては、他にも Timer、BackgroundWorker、OpenFileDialog などがありますが、
LabelArray 等には固有の画像が用意されてないため、「歯車」な標準アイコンで表示されているわけです。
> VB2005では、どこで(どこをみれば)このLavel1(LavelArray)の要素が「_Label1_0」と「_Label1_1」であることがわかるのでしょうか?
_Label1_0 のデザイン時プロパティを見ると、「Label1 の Index」というプロパティが追加されているはずです。
ただし基本的に、フォームデザイナからの操作は考慮されていません。
今回のように自分で記載したものであれば、Load やコンストラクタに記述するのでまだマシですが、
自動変換された物は InitializeComponent 内に隠ぺいされてしまうため、インデックスの修正等が必要になると、
自動生成されたデザイナコードを編集する羽目になりかねません。メンテナンスの面からも利用は避けるべきかと。