ボタンの表示・非表示

タグの編集
投稿者 熊造  (社会人) 投稿日時 2009/1/11 18:04:43
50個のボタンをつくり Nameにはbtn1.234・・・とbtnのあとは連番にしています

For i=1 To 50
    Me.Controls("btn" & i).Enabled = False
Next

オブジェクト参照がオブジェクト インスタンスに設定されていません。
というエラーがでてしまいます。

同じことを他のプログラムでやるとうまくいくのですが原因がわかりません
教えていただけないでしょうか
投稿者 レオ♪  (小学生) 投稿日時 2009/1/11 18:16:32
初心者本には書いてない特別なレス。
勘違い例
1 オブジェクトとインスタンスは同じではない
2 Msgとメッセージボトックスは同じではない
3 乱数とランダムは同じではない
こうゆう似た物をイコールで解釈していると、将来的に壁として
障害になります。
と、まぁ参考までに。
投稿者 かずき  (社会人) 投稿日時 2009/1/11 19:48:30
うまくいくプログラムでは、フォーム上に直接ボタンを置いるのだと思います。
うまくいかないプログラムでは、フォームじゃなくてPanelやGroupBoxに置いてないですか?
Panelの上等においていると、書かれたプログラムの場合はNullReferenceExceptionが
発生します。(こちらでも確認しました)

書かれているコードは、Me(フォーム)の直下のコントロールから"btn" & iという名前の
コントロールのEnabledをFalseにするという意味です。
Panel等に置くと、フォームの直下ではなくPanelの子という扱いになるので
PanelのControls(コントロール名)を使ってボタンを探す必要があります。

> レオさん
本件と何の関係もありません。
投稿者 熊造  (社会人) 投稿日時 2009/1/11 20:15:14
レオさん かずきさん ありがとうございました。
かずきさんのおっしゃるとうりPanelのなかにありました。

確認までしていただいてお手数をおかけしました。

投稿者 太郎冠者  (社会人) 投稿日時 2009/1/11 21:39:38
汎用性を持たせるなら、再起処理を使う、という手もありますね。
投稿者 レオ♪  (小学生) 投稿日時 2009/1/12 00:25:05
金がないんでヒキコモリ中のレオちゃんです。
解決したんなら全体的にコードを掲載した方がいいかもね。
アドバイスとか出る場合もあるし。
Option Strict On
'VisualBsic2008 
Public Class Form1
    'ボタンコントロール配列のフィールドを作成 
    Private testButtons() As System.Windows.Forms.Button

    Private Sub Form1_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles MyBase.Load
        Me.testButtons = New System.Windows.Forms.Button(49) {}
        Me.SuspendLayout()
        Dim i As Integer
        Dim c, d As Integer
        c = 0 : d = 0
        For i = 0 To Me.testButtons.Length - 1
            Me.testButtons(i) = New System.Windows.Forms.Button
            Me.testButtons(i).Name = "Button" + i.ToString()
            Me.testButtons(i).Text = i.ToString()
            Me.testButtons(i).Size = New Size(30, 30)
            Me.testButtons(i).Location = New Point(c * 30, 10 + d)
            c += 1
            If c = 9 Then
                c = 0 : d += 30
            End If
            AddHandler Me.testButtons(i).Click, _
                AddressOf Me.testButtons_Click
        Next i
        Me.Controls.AddRange(Me.testButtons)
        Me.ResumeLayout(False)
    End Sub
    Private Sub testButtons_Click(ByVal sender As Object, _
            ByVal e As EventArgs)
        MessageBox.Show(CType(sender, System.Windows.Forms.Button).Name)
    End Sub
End Class

投稿者 熊造  (社会人) 投稿日時 2009/1/12 00:51:19
レオさんありがとうございます。 VB2008をはじめて数ケ月の未熟者ですので
コードを掲載するのはとても恥ずかしいのですが・・・・
へたくそと笑わないでくださいね^^;;
メニューを作っています。 これがボタン表示の部分
 Dim i As Integer
 Dim myValue As Integer
 
 For i = 1 To 50
     Me.Panel1.Controls("cmd" & i).Enabled = False
 Next

 M_MyMenuBindingSource.MoveFirst()

For i = 1 To M_MyMenuBindingSource.Count
     myValue = M_MyMenuBindingSource.Current("ID")

     Me.Panel1.Controls("cmd" & myValue).Text = M_MyMenuBindingSource.Current("名称")
     Me.Panel1.Controls("cmd" & myValue).Enabled = True

     M_MyMenuBindingSource.MoveNext()
 Next

ボタンを押されたとき実行する部分
Dim strPath As String

M_MyMenuBindingSource.Filter = "ID = " & prgId
strPath = M_MyMenuBindingSource.Current("Path1")

If prgId <= 9 Then
    Call Shell(strPath, AppWinStyle.NormalFocus)
End If

If prgId > 9 Then
    Call Shell("Explorer " & strPath, AppWinStyle.NormalFocus)
End If

M_MyMenuBindingSource.RemoveFilter()

こんな感じで作っています。
うまくいったのでPanal1 Panal2を作って 1にはボタン5個 2にはボタン50個
1のボタンにより2のボタンの中身がかわるものを作ります。 合計250個の中身
がこれでつくれます。