tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルクリックイベント発生時のIndex番号取得
記事No7806
投稿日: 2008/07/11(Fri) 09:21
投稿者皐月
いつもお世話になっております。
VB6からVB2005に移行してプログラムを作成しています。

VB6.0でいうIndex番号を取得したいのですが、どうしてもうまくいかないので質問させてください。

    Private MyButtones As Button()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer        

        Me.MyButtones = New Button(94) {}

        For i = 0 To 94
            Me.MyButtones(i) = New Button()

            Me.MyButtones(i).Height = 23
            Me.MyButtones(i).Width = 150

            Me.MyButtones(i).Name = "MyButton" & i.ToString

            If i > 79 Then
                Me.MyButtones(i).Left = 800 + 10 + 20
                Me.MyButtones(i).Top = (i - 80) * 30 + 10
            ElseIf i > 59 Then
                Me.MyButtones(i).Left = 600 + 10 + 20
                Me.MyButtones(i).Top = (i - 60) * 30 + 10
            ElseIf i > 39 Then
                Me.MyButtones(i).Left = 400 + 10 + 20
                Me.MyButtones(i).Top = (i - 40) * 30 + 10
            ElseIf i > 19 Then
                Me.MyButtones(i).Left = 200 + 10 + 20
                Me.MyButtones(i).Top = (i - 20) * 30 + 10
            Else
                Me.MyButtones(i).Left = 10 + 20
                Me.MyButtones(i).Top = i * 30 + 10
            End If

            'イベントハンドラに関連付け
            AddHandler Me.MyButtones(i).Click, AddressOf Me.MyButtones_click

            ' このコントロールをフォームに追加する
            Me.Controls.Add(Me.MyButtones(i))

        Next i

        For i = 0 To 94
            Me.MyButtones(i).Text = Chname(i)
        Next
    End Sub

    Private Sub MyButtones_click(ByVal sender As Object, ByVal e As EventArgs)

        Dim ColorDialog1 As New ColorDialog

        With ColorDialog1
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                CType(sender, System.Windows.Forms.Button).BackColor = .Color
                PVColor(i) = ColorTranslator.ToWin32(.Color)    'ここでインデックス番号を取得したい
            End If
        End With
    End Sub

Form1_Loadのイベントでボタンの配列を作り、Form画面上に並べました。
これをイベントハンドラに関連付けして、ボタンが押されたときに発生するイベントハンドライトは作成できたのですが、このとき押されたボタンがどのインデックス番号なのか取得する方法がわかりません。
上のソースだと下から4番目のコードで

PVColor(i) = ColorTranslator.ToWin32(.Color)    'ここでインデックス番号を取得したい

です。今の状態ではiの部分にどのようなコードを記述すればよいのかわからないため、この部分で詰まっています。
作成した配列のボタンの名前にIndexの番号が含まれているので、そこから、取得する方法や、TabIndexから取得する方法も考えたのですが、もっといい方法がある気がして投稿させていただきました。

どなたかご存知の方がいらっしゃいましたらよろしくお願いします。

[ツリー表示へ]
タイトルRe: クリックイベント発生時のIndex番号取得
記事No7808
投稿日: 2008/07/11(Fri) 09:40
投稿者よねKEN
> PVColor(i) = ColorTranslator.ToWin32(.Color)    'ここでインデックス番号を取得したい
>
> です。今の状態ではiの部分にどのようなコードを記述すればよいのかわからないため、この部分で詰まっています。
> 作成した配列のボタンの名前にIndexの番号が含まれているので、そこから、取得する方法や、TabIndexから取得する方法も考えたのですが、もっといい方法がある気がして投稿させていただきました。

Button(というかControl)のTagプロパティに予めインデックスをセットしておき、
必要なときはそこから取得すればよいかと思います。

#VB6からの移行とのことで今回は除外しましたが、
#新規開発であれば、そもそもインデックスを使わないで
#管理する方法を考えるとか別のアプローチもあるかもしれません。
#(PVColor(i)を後でどのように利用するのかによるので何とも言えませんが)

[ツリー表示へ]
タイトルRe: クリックイベント発生時のIndex番号取得
記事No7809
投稿日: 2008/07/11(Fri) 09:42
投稿者魔界の仮面弁士
> 'ここでインデックス番号を取得したい
Dim index As Integer = Array.IndexOf(MyButtones, sender)

[ツリー表示へ]
タイトルRe^2: クリックイベント発生時のIndex番号取得
記事No7810
投稿日: 2008/07/11(Fri) 10:21
投稿者皐月
よねKENさん、魔界の仮面弁士さんお返事ありがとうございます。

> Button(というかControl)のTagプロパティに予めインデックスをセットしておき、
> 必要なときはそこから取得すればよいかと思います。

なるほど、Tagってこういう風に使えるんですね。
ユーザーが自由に割り当てられる番号をセットできる程度にしか思っていませんでした(^^;

> Dim index As Integer = Array.IndexOf(MyButtones, sender)

キーワードで検索してみました。これは、「Array.IndexOf ジェネリック メソッド (T[], T)」と言うものでしょうか?.NET Framework version 2.0 以降で新しく追加されたメソッドと以下のURLへ書いてありました。

http://msdn.microsoft.com/ja-jp/library/eha9t187(VS.80).aspx

おかげさまで解決いたしました。ありがとうございました。

[ツリー表示へ]
タイトルRe^3: クリックイベント発生時のIndex番号取得
記事No7812
投稿日: 2008/07/11(Fri) 11:09
投稿者魔界の仮面弁士
> > Dim index As Integer = Array.IndexOf(MyButtones, sender)
> これは、「Array.IndexOf ジェネリック メソッド (T[], T)」と言うものでしょうか?
ジェネリック版も使えますが、その場合は
 Dim index As Integer = Array.IndexOf(Of Button)(MyButtones, DirectCast(sender, Button))
と書かねばなりません。

> http://msdn.microsoft.com/ja-jp/library/eha9t187(VS.80).aspx
今回の要件であれば、ジェネリック版では無い方の IndexOf メソッドで十分かと。
http://msdn.microsoft.com/ja-jp/library/7eddebat%28VS.80%29.aspx

[ツリー表示へ]