C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 91 を表示中)
■54466 / )  Re[3]: VB6.0からVB2005へコントロール配列の移植について
□投稿者/ 魔界の仮面弁士 (1880回)-(2010/10/21(Thu) 15:20:54)
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 内に隠ぺいされてしまうため、インデックスの修正等が必要になると、
自動生成されたデザイナコードを編集する羽目になりかねません。メンテナンスの面からも利用は避けるべきかと。

返信 編集キー/


管理者用

- Child Tree -