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

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

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

Re[4]: VB6.0からVB2005へコントロール配列の移植について


(過去ログ 91 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■54456 / inTopicNo.1)  VB6.0からVB2005へコントロール配列の移植について
  
□投稿者/ uooono (16回)-(2010/10/21(Thu) 13:39:09)

分類:[VB.NET/VB2005 以降] 

以前の質問でVB2005ではコントロール配列は一般的に

@ロード時にオブジェクトを配列化する
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
lstv = New ListView() {Me.lstv1, Me.lstv2}

Aイベント割り当てを行う
For Each lstvTmp In lstv
AddHandler lstvTmp.Click, AddressOf lstv_Click

ということをshuさん、魔界の仮面弁士さんより教えていただきました。
ただ、この方法であると大量にコンバートするにはコーディング量が増え、不具合の原因になる可能性が高くなると思われます。


それ以外の方法として以下のような解説をしていただきました。

>そして VB.NET の場合、この「コントロール配列オブジェクト」を再現するため、
>Microsoft.VisualBasic.Compatibility.VB6 名前空間に、
> ButtonArray
> LabelArray
> TextBoxArray
> ListViewArray
>などといったクラスが用意されています。ただし、デザイナ側のサポートは無いため、
>これらを利用するには VB6 プロジェクトをコンバートして自動生成させたものに頼るか、
>もしくは手動で、TextBox を TextBoxArray に登録するコードを書かなければなりません。

>そのため、これらの互換クラスは、あくまで移植用の一時的な物とされています。
>http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.compatibility.vb6%28VS.80%29.aspx

これらのArrayはどのように使用するべきか、参考リンクや検索を行ってもサンプルもないし、サイトを見つけることができませんでした。
何かよい使用方法のサンプルがあれば教えていただきたいと思います。



引用返信 編集キー/
■54458 / inTopicNo.2)  Re[1]: VB6.0からVB2005へコントロール配列の移植について
□投稿者/ shu (115回)-(2010/10/21(Thu) 14:04:19)
No54456 (uooono さん) に返信

http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.compatibility.vb6.textboxarray.aspx
MSDN内にあるFrameWork4のTextBoxArray のページです

バージョン情報として
『4 では、互換性のために残されています (コンパイル時に警告) 』
と記述されています。
今後もバージョンアップしていくのなら、使うのは避けた方がいいでしょう。

ここは、頑張ってコンバートするかコントロールの配置方法の見直しをした方がいいかもしれません。

例1)伝票系画面であれば1行分をユーザコントロールとして実装する
例2)複数のコントロールをデザイン時に作成せず、実行時に作成する
引用返信 編集キー/
■54460 / inTopicNo.3)  Re[2]: VB6.0からVB2005へコントロール配列の移植について
□投稿者/ uooono (17回)-(2010/10/21(Thu) 14:33:02)
2010/10/21(Thu) 14:33:23 編集(投稿者)

No54458 (shu さん) に返信
> バージョン情報として
> 『4 では、互換性のために残されています (コンパイル時に警告) 』
> と記述されています。
> 今後もバージョンアップしていくのなら、使うのは避けた方がいいでしょう。

今後のバージョンアップ・・・今のところ不明なのです。
解説をみると、
>「TextBoxArray クラスは、Visual Basic 6.0 の TextBox コントロール配列に相当する実行時の機能を提供します。
> Visual Basic 6.0 のコントロール配列のデザイン時の機能は提供されません。」
とありました。実行時の機能は提供されているため、使ってみようと思います。

ここで、コンバートされたArrayをみてみると、例えば、Label1オブジェクトで0と1のインデックスをもつ場合、
Label1(0).Text
Label1(1).Text
でVB6.0でも、コンバージョン直後のLavelArrayを使用したVB2005でも設定・参照なりができていました。
VB2005でのデザインをみてみると、実際のラベルのNameはそれぞれ「_Label1_0」と「_Label1_1」へ自動変換されていました。
(枠外に水車マークの「Lavel1」オブジェクトが出現していました)
VB2005では、どこで(どこをみれば)このLavel1(LavelArray)の要素が「_Label1_0」と「_Label1_1」であることがわかるのでしょうか?


引用返信 編集キー/
■54466 / inTopicNo.4)  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 内に隠ぺいされてしまうため、インデックスの修正等が必要になると、
自動生成されたデザイナコードを編集する羽目になりかねません。メンテナンスの面からも利用は避けるべきかと。

引用返信 編集キー/
■54467 / inTopicNo.5)  Re[4]: VB6.0からVB2005へコントロール配列の移植について
□投稿者/ 魔界の仮面弁士 (1881回)-(2010/10/21(Thu) 15:39:14)
No54466 (魔界の仮面弁士 さん) に返信
> イベントをまとめられるという利点はありますが、デザイン時の機能が提供されていない以上、
> 使い勝手は List クラスと大差無いですし、設置する手間を考えると、むしろメンテナンスしにくくなりますよ。
> 
> 無理に使うなら、Microsoft.VisualBasic.Compatibility アセンブリを参照設定に加えて、こんな感じです。
> Label1〜3、TextBox1〜3 をコントロール配列にしています。

比較のため、List クラスで管理するバージョンを掲載しておきます。


Public Class Form1
    'List クラスの代わりに、配列や Dictionaryクラスなども利用できます。
    Private Labels As New List(Of Label)()
    Private TextBoxes As New List(Of TextBox)()

    Public Sub New()
        InitializeComponent()

        'これらは、Form の Load イベントに置いても良い。
        Labels.Add(Label1)
        Labels.Add(Label2)
        Labels.Add(Label3)

        TextBoxes.Add(TextBox1)
        TextBoxes.Add(TextBox2)
        TextBoxes.Add(TextBox3)
    End Sub

    Private Sub TextBoxes_TextChanged(ByVal sender As Object, ByVal e As EventArgs) _
        Handles TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged

        Dim index As Integer = TextBoxes.IndexOf(DirectCast(sender, TextBox))
        Labels(index).Text = "[" & TextBoxes(index).Text & "]と入力"
    End Sub
End Class

引用返信 編集キー/
■54483 / inTopicNo.6)  Re[4]: VB6.0からVB2005へコントロール配列の移植について
□投稿者/ uooono (18回)-(2010/10/22(Fri) 09:34:16)
No54466 (魔界の仮面弁士 さん) に返信

いつもご丁寧な回答ありがとうございます!
返信が遅くなり申し訳ありません。

> '
> '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

たしかにdesigner.vbへ上記のような記述がありました。
ここでArray関連の設定をしていたのですね。
このdesigner.vbのファイル自体に気づくことができていませんでした。
「すべてのファイルを表示する」というアイコンをクリックすると表示され、確認することができました。

> 結局、先のスレッド( No54311 〜)の中で、shu さんが提案された「配列やListで管理する」という話が
> 「LabelArray クラスで管理する」へと変わっただけで、その本質は何も変わっていません。
そのようですね。

> _Label1_0 のデザイン時プロパティを見ると、「Label1 の Index」というプロパティが追加されているはずです。
そのようなプロパティを発見しました。
擬似コントロール配列のようですね。

> ただし基本的に、フォームデザイナからの操作は考慮されていません。
> 今回のように自分で記載したものであれば、Load やコンストラクタに記述するのでまだマシですが、
> 自動変換された物は InitializeComponent 内に隠ぺいされてしまうため、インデックスの修正等が必要になると、
> 自動生成されたデザイナコードを編集する羽目になりかねません。メンテナンスの面からも利用は避けるべきかと。
確かに隠蔽されるとメンテナンス時には困りそうです。
大変勉強になり、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -