ボタンの表示・非表示
投稿者 レオ♪  (小学生)
投稿日時
2009/1/11 18:16:32
初心者本には書いてない特別なレス。
勘違い例
1 オブジェクトとインスタンスは同じではない
2 Msgとメッセージボトックスは同じではない
3 乱数とランダムは同じではない
こうゆう似た物をイコールで解釈していると、将来的に壁として
障害になります。
と、まぁ参考までに。
勘違い例
1 オブジェクトとインスタンスは同じではない
2 Msgとメッセージボトックスは同じではない
3 乱数とランダムは同じではない
こうゆう似た物をイコールで解釈していると、将来的に壁として
障害になります。
と、まぁ参考までに。
投稿者 かずき  (社会人)
投稿日時
2009/1/11 19:48:30
うまくいくプログラムでは、フォーム上に直接ボタンを置いるのだと思います。
うまくいかないプログラムでは、フォームじゃなくてPanelやGroupBoxに置いてないですか?
Panelの上等においていると、書かれたプログラムの場合はNullReferenceExceptionが
発生します。(こちらでも確認しました)
書かれているコードは、Me(フォーム)の直下のコントロールから"btn" & iという名前の
コントロールのEnabledをFalseにするという意味です。
Panel等に置くと、フォームの直下ではなくPanelの子という扱いになるので
PanelのControls(コントロール名)を使ってボタンを探す必要があります。
> レオさん
本件と何の関係もありません。
うまくいかないプログラムでは、フォームじゃなくてPanelやGroupBoxに置いてないですか?
Panelの上等においていると、書かれたプログラムの場合はNullReferenceExceptionが
発生します。(こちらでも確認しました)
書かれているコードは、Me(フォーム)の直下のコントロールから"btn" & iという名前の
コントロールのEnabledをFalseにするという意味です。
Panel等に置くと、フォームの直下ではなくPanelの子という扱いになるので
PanelのControls(コントロール名)を使ってボタンを探す必要があります。
> レオさん
本件と何の関係もありません。
投稿者 熊造  (社会人)
投稿日時
2009/1/11 20:15:14
レオさん かずきさん ありがとうございました。
かずきさんのおっしゃるとうりPanelのなかにありました。
確認までしていただいてお手数をおかけしました。
かずきさんのおっしゃるとうり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個の中身
がこれでつくれます。
コードを掲載するのはとても恥ずかしいのですが・・・・
へたくそと笑わないでくださいね^^;;
メニューを作っています。 これがボタン表示の部分
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個の中身
がこれでつくれます。
For i=1 To 50
Me.Controls("btn" & i).Enabled = False
Next
オブジェクト参照がオブジェクト インスタンスに設定されていません。
というエラーがでてしまいます。
同じことを他のプログラムでやるとうまくいくのですが原因がわかりません
教えていただけないでしょうか