tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2005の配列の扱いについて
記事No6236
投稿日: 2007/09/05(Wed) 10:54
投稿者皐月
VB6.0からVB2005への移行を行っています。VB6.0ではCheck1(i)というチェックボックスをコントロール配列でまとめCommandChk(i)という配列にValue値を保存するようなプログラムを作成していました。以下がそのコードです。

<VB6.0>
Private Sub Command1_Click()
    Dim i As Integer
        
    For i = 0 To 100
        Commandchk(i) = Check1(i).Value
    Next i
    Unload Me
End Sub

Commandchk(i)の配列に保持した値は、再度メインフォームからCommand1_Clickの処理があるフォームを呼び出されたときに、Check1(i)に代入され、どのチェックボックスにチェックが入っていたか呼び出すことが可能です。

上記の処理をVB2005で実現しようと思ったのですが・・・。以下はイベントプロパティCheckedChangedを利用してまとめようとしました。

<VB2005>
Private Sub docommand(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox99.CheckedChanged, CheckBox98.CheckedChanged, CheckBox97.CheckedChanged, CheckBox96.CheckedChanged, CheckBox95.CheckedChanged, CheckBox94.CheckedChanged,・・・・100個あるため省略・・・・・CheckBox1.CheckedChanged

        Dim ChkOn As CheckBox
        Dim No As String

        ChkOn = CType(sender, CheckBox)
        No = Microsoft.VisualBasic.Left(ChkOn.Name, 9)
        MsgBox("ボタン[" & Me.Controls(2).Name & "]が押されました")
    End Sub

省略している部分からもわかるように非常に頭でっかちな、ソースになってしましました。また、コントロール配列が使えないことから、どのCheckBoxにチェックがついているのかどのように保持すればよいのかわからなくなってしまいました。チェックボックスひとつひとつの状態を見ていくコードを書くのは面倒だし、ソース的にも美しくありません。Indexの代わりになるような値はないのでしょうか?

なんとかVB6.0でのソースのようにスマートにしたいのですが、本に書いている方法はどれもCheckedChangedイベントだったので、やはり頭でっかちな部分が気になります。なにはスマートないい方法はないでしょうか?

[ツリー表示へ]
タイトルRe: VB2005のコントロール配列
記事No6238
投稿日: 2007/09/05(Wed) 11:43
投稿者ダンボ
> VB6.0からVB2005への移行を行っています。VB6.0ではCheck1(i)というチェックボックスを状態を見ていくコードを書くのは面倒だし、ソース的にも美しくありません。Indexの代わりになるような値はないのでしょうか?

VB6と全く同じように使いたいというのであれば、素直に移行ツールで移行すれば1見コントロール配列
のようになりますけど。

移行ツールの使用はデメリットがあるので使いたくないと言うならサンプルを移行してみて
テクニックだけを流用したらどうでしょう。
・SetIndex
・GetIndex

[ツリー表示へ]
タイトルRe: VB2005の配列の扱いについて
記事No6240
投稿日: 2007/09/05(Wed) 12:32
投稿者花ちゃん
ヒントになる過去ログを。

http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=6143&page=0

http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=6027

http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=5916

http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=5543

[ツリー表示へ]
タイトルRe: VB2005の配列の扱いについて
記事No6242
投稿日: 2007/09/05(Wed) 12:50
投稿者るしぇ
内容は先の2人と似たようなことを言ってるだけなんだけど、
単純に、コントロール"の"配列を自分で用意すればいいかと。
花ちゃん提示のリンク以外でも、過去ログに何回か出てきてるよ。

[VB.NET]
    Private m_myCheckBoxes(99) As CheckBox

    Private Sub InitializeMyCheckBoxes()
        m_myCheckBoxes(0) = Me.CheckBox00
        m_myCheckBoxes(1) = Me.CheckBox01
        ・・・(省略)
        m_myCheckBoxes(99) = Me.CheckBox99
    End Sub

[じゃんぬねっと コントロールの配列を作成する]
http://jeanne.wankuma.com/tips/control/arraycontrol.html

[ツリー表示へ]
タイトルRe^2: VB2005の配列の扱いについて
記事No6290
投稿日: 2007/09/12(Wed) 17:32
投稿者皐月
皆さん、お返事ありがとうございます。
現在、るしぇさんに書いて頂いたコードを元にcheckedのプロパティの値を取得する処理を作成しているのですが、

        Private CheckBoxState(99) As Short

        CheckBoxState(0) = Me.CheckBox1.Checked
        CheckBoxState(1) = Me.CheckBox2.Checked
        CheckBoxState(2) = Me.CheckBox3.Checked
        CheckBoxState(3) = Me.CheckBox4.Checked
        CheckBoxState(4) = Me.CheckBox5.Checked
    ・・・(省略)
        CheckBoxState(99) = Me.CheckBox100.Checked

と非常に長いコードになってしまいます。なんとか短いコードにしようと思い、自分なりに配列の変数を作成してみました。

    FileName = "CheckBox" & No

    for No = 1 to 100
         CheckBoxState(No) = Me.FileName.Checked
        Next

FileNameはただのStringですので、当然動くことはないのですが、したい処理としては上記のような処理をしたいと思っています。どうすれば、CheckBoxのプロパティCheckedを配列CheckBoxState(No)に挿入することができるのでしょうか?

[ツリー表示へ]
タイトルRe^3: VB2005の配列の扱いについて
記事No6292
投稿日: 2007/09/12(Wed) 20:43
投稿者ダンボ
これはこれで現在のご期待に添えるとは思いますが、もっと根本的なアプローチを
考え直した方が良いのではないでしょうか?
わざわざCheckBoxStateを100個も取って保存するより必要な度に該当するCheckBoxを
見に行けばよいだけだし。
いやその前にCheckBoxを100個もデザイナーで貼り付けていく方が非人道的で。。。
CheckBoxの自動生成を検討したほうが良いのでは。(まあ移行だから)


Option Strict On
Option Explicit On
Public Class Form1
    Private CheckBoxState(99) As System.Windows.Forms.CheckState
    Private Sub CopyCheckState()
        For Each CNT As Control In Me.Controls
            If TypeOf CNT Is CheckBox Then
                If InStr(CNT.Name, "CheckBox") > 0 Then
                    Dim SubNum As String = CNT.Name.Substring("CheckBox".Length)
                    Dim Index As Integer
                    If Integer.TryParse(SubNum, Index) Then
                        CheckBoxState(Index - 1) = CType(CNT, CheckBox).CheckState
                    End If
                End If
            End If
        Next
    End Sub
End Class

[ツリー表示へ]
タイトルRe: VB2005の配列の扱いについて
記事No6243
投稿日: 2007/09/05(Wed) 12:56
投稿者よねKEN
コントロール配列はありませんので、コントロールの配列を使えばよいと思います。
また、イベントの関連付けにはHandles句の代わりにAddHandlerを使うのをお勧めします。

--こんな感じ------------------
' 宣言でCheckBoxの配列を用意しておく
Private CheckBoxes() As CheckBox

' FormのLoadイベントでCheckBox配列を初期化
' 各CheckBoxとイベントハンドラdocommandと関連付ける
CheckBoxes = New CheckBox(){CheckBox1, CheckBox2, ・・・ ,CheckBox101}
For i = 0 To 100
   CheckBoxes.Tag = i ' インデックスを知りたいということであれば、Tagプロパティに入れておくとか
   AddHandler CheckBoxes(i).CheckedChanged, AddressOf docommand
Next


'docommandのHandles句は削除
Private Sub docommand(ByVal sender As System.Object, ByVal e As System.EventArgs)
     ' 略
End Sub

[ツリー表示へ]