この11個前にも質問したものです。何度もすいません。自分なりに努力しているつもりですがどうしてもわからないもので・・・。11個前の質問を見ていただけたらわかるようにボーリングの点数計算表をつくっていて、コマンドボックスの入力方法は解決したのですが、その同じ処理をあと8回繰り返すにはどうしたらいいでしょうか?For〜Nextを使うのではないかと考えましたがFor〜Nextをいれるとエラーになってしまいます。conbobox毎に一つずつ数字を増やしていけばできるにはできますがよろしくお願いします。
編集 削除>この11個前にも質問したものです。
そのような場合はリンク貼って下さい。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200412/04120061.txt
自分の環境もスレッドごとに毎回書くようにして下さい。
[VB.NET]
>その同じ処理をあと8回繰り返すにはどうしたらいいでしょうか?
引数にコンボボックスを渡す関数を作ってみてはどうでしょう。
>For〜Nextを使うのではないかと考えましたがFor〜Nextをいれるとエラーになってしまいます。
そういった方法もあると思います。コーディングの手法は無数に
ありますのでサンプルコードを示すなどしてエラーになる状況を
もっと具体的に説明して下さい。また、エラーに関して質問する
場合はエラーメッセージを必ず書いて下さい。
ん〜っと、順番は入れ替わるので、
このような場合にはリンクを張りましょうね。
っと、この投稿をした瞬間、11個前ではなくなってしまいますので
「特攻隊長まるるう」さん、「いな」さん即答ありがとうございます。
いろいろ勉強になります。
>引数にコンボボックスを渡す関数
何の事だかわかりませんが、調べてみます。
たとえば下記のコードを繰り返すとしてどこにForを入れたらいいのでしょう?
ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim t As Integer
Dim n As Integer
t = Val(ComboBox1.Text)
With ComboBox2
.Items.Clear()
Select Case (t)
Case 0 To 8
.Text = "-"
.Items.Add("-")
For n = 1 To (10 - t - 1)
.Items.Add(CStr(n))
Next
.Items.Add("/")
Case 9
.Text = "-"
.Items.Add("-")
.Items.Add("/")
Case Else
.Text = ""
End Select
End With
一番上のByVal 〜 .SelectedIndexChanged も含めて
For〜Nextでくくることはできるんですか?
よろしくお願いします。
それぞれ、過去ログにも似たようなサンプルはたくさんありますし、
ヘルプでもひと通り調べておいて下さい。
[VB.NET]
' ループで利用できるようにコンボボックスの配列に参照を格納する例
Private mComboBoxes() As ComboBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Call Me.SetComboBoxes()
End Sub
Private Sub SetComboBoxes()
ReDim Me.mComboBoxes(7)
Me.mComboBoxes(0) = Me.ComboBox1
Me.mComboBoxes(1) = Me.ComboBox3
Me.mComboBoxes(2) = Me.ComboBox5
'(省略)
End Sub
' 複数のコンボボックスのイベントを1つの関数で受け取る例
Private Sub Cbo_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles ComboBox1.SelectedIndexChanged, _
ComboBox3.SelectedIndexChanged, _
ComboBox5.SelectedIndexChanged
' (省略)
Dim wComboBoxX As ComboBox = DirectCast(sender, ComboBox)
Debug.WriteLine(wComboBoxX.Name)
End Sub
' 引数にコンボボックスを渡す関数の例
Private Sub DispScore(ByVal ComboBoxFirst As ComboBox, ByVal ComboBoxSecond As ComboBox)
If ComboBoxFirst.Text = "0" Then
ComboBoxSecond.SelectedIndex = -1
Else
ComboBoxSecond.SelectedIndex = 0
End If
End Sub
>たとえば下記のコードを繰り返すとしてどこにForを入れたらいいのでしょう?
ComboBox1 と ComboBox2 が固定ではループ処理できません。
「特攻隊長まるるう」さん、教えていただきありがとうございます。
とてもむずかしいですね。3つのどれかを使うとき固定されたループは
書き直さなくてはならないんですね。
こういう処理はなんという名前で呼ばれているのでしょう?
繰り返し処理?ですか?
もう少しがんばってみます。
ありがとうございました。
だめです。どうしてもわかりません。特攻隊長まるるうさんに書いていただいたコードがどのようにつながるのかわかりません。過去ログのどれが似たようなサンプルなのか、どなたかヒントをいただけませんでしょうか???
編集 削除もがきながらさん、あなたのやろうとしている事は、VB.NETでは
結構難しい事なんです。
この掲示板上だけで説明する事は少し無理があるかも知れません。
やはり本か何かでVB.NETの基本を少し勉強する必要があります。
コントロールの配列とかイベントハンドラなどと言うことが少し
理解できるようになれば、特攻隊長まるるうさんが書いたコードが
理解できると思います。
やっぱりそうなんですか・・・。だからC言語のサンプルが多かったんですね。自分はプログラミングはVB.Netが初めてなので他の言語がどういうことを意味してるのかまったくわかりません。いづれにしても基本的な勉強が必要ですね。コントロールの配列、イベントハンドラ、教えていただいてありがとうございました。
編集 削除>とてもむずかしいですね。
>こういう処理はなんという名前で呼ばれているのでしょう?
いえ、知らないと自分で思いつくのは難しいですが、技術的には簡単な
レベルだと思います。いたって普通のコードなので特に名前は付いて
いないです。強いてあげるならコメントの文章そのままかと思います。
自分で関数(SetComboBoxesFirstやDispSecondCboScore)をつくる
のは『サブプロシージャ(sub procedure)にする』『関数化する』
などと呼ばれたりします。[VB6.0]ではコントロール配列という、
同じ名前のコントロールに連番をつけて扱う処理があったので比較的
簡単でしたし、初心者でも知ってる場合が多かったですが、[VB.NET]
ではサポートされていませんので自分で似たようなモノを用意する
必要があります。
たとえ初心者でも基礎ができてるちゃんとした『初心者プログラマ』
ならボクのヒントで下のコードくらいは書けるでしょう。『プログラム
未経験者』に入門本50ページくらいの基礎知識をつけるのを掲示板で
やるのははた迷惑です。基礎知識は自分でつけてきて下さい。
とりあえずコンボボックスの6つでね。
[VB.NET]
Option Strict On
Public Class Form1
Inherits System.Windows.Forms.Form
[省略] Windows フォーム デザイナで生成されたコード
' ループで利用できるようにコンボボックスの配列に参照を格納する
Private mComboBoxesFirst() As ComboBox ' 1投目用コンボボックス格納(奇数番目)
Private mComboBoxesSecond() As ComboBox ' 2投目用コンボボックス格納(偶数番目)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Call Me.SetComboBoxes()
End Sub
Private Sub SetComboBoxes()
ReDim Me.mComboBoxesFirst(2)
Me.ComboBox1.Tag = 0 ' コンボボックス識別用のタグ設定
Me.ComboBox3.Tag = 1
Me.ComboBox5.Tag = 2
Me.mComboBoxesFirst(0) = Me.ComboBox1
Me.mComboBoxesFirst(1) = Me.ComboBox3
Me.mComboBoxesFirst(2) = Me.ComboBox5
ReDim Me.mComboBoxesSecond(2)
Me.ComboBox2.Tag = 0
Me.ComboBox4.Tag = 1
Me.ComboBox6.Tag = 2
Me.mComboBoxesSecond(0) = Me.ComboBox2
Me.mComboBoxesSecond(1) = Me.ComboBox4
Me.mComboBoxesSecond(2) = Me.ComboBox6
' 奇数番目のコンボボックスに1投目用の値設定
Call Me.SetComboBoxesFirst()
End Sub
' 奇数番目のコンボボックスに1投目用の値設定
Private Sub SetComboBoxesFirst()
Dim i, j As Integer
' コンボボックスの配列を使ったループ処理
For i = 0 To Me.mComboBoxesFirst.GetLength(0) - 1
If Me.mComboBoxesFirst(i) Is Nothing Then
MessageBox.Show("設定されていないコンボボックスがあります。", "コンボボックス設定", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
With Me.mComboBoxesFirst(i)
With .Items
.Clear()
For j = 0 To 10
.Add(CStr(j))
Next
End With
.SelectedIndex = 0
End With
End If
Next
End Sub
' 奇数番目のコンボボックスを変更した時、偶数番目のコンボボックスの値を変更する関数呼び出し
Private Sub Cbo_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles ComboBox1.SelectedIndexChanged, _
ComboBox3.SelectedIndexChanged, _
ComboBox5.SelectedIndexChanged
Dim wComboBoxX As ComboBox = DirectCast(sender, ComboBox)
Dim wEventNo As Integer = CInt(wComboBoxX.Tag)
'Debug.WriteLine(wComboBoxX.Name)
Call Me.DispSecondCboScore(Me.mComboBoxesFirst(wEventNo), Me.mComboBoxesSecond(wEventNo))
End Sub
' 奇数番目のコンボボックスを変更した時、偶数番目のコンボボックスの値を変更する関数
Private Sub DispSecondCboScore(ByVal ComboBoxFirst As ComboBox, ByVal ComboBoxSecond As ComboBox)
Dim wFirstScore, n As Integer
wFirstScore = CInt(Val(ComboBoxFirst.Text))
With ComboBoxSecond
.Items.Clear()
Select Case (wFirstScore)
Case 0 To 8
.Text = "-"
.Items.Add("-")
For n = 1 To (10 - wFirstScore - 1)
.Items.Add(CStr(n))
Next
.Items.Add("/")
Case 9
.Text = "-"
.Items.Add("-")
.Items.Add("/")
Case Else
.Text = ""
End Select
End With
End Sub
End Class
私も一応こんなの作っていたんですが、乗っけようか、止めようか迷っていたところで。。。
Dim comb(20) As ComboBox 'コンボボックス配列宣言
Dim lbl(9) As Label
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim n, m As Integer
Me.Width = 80 * 9 + 150
Me.Height = 100
For n = 0 To 9
lbl(n) = New Label() 'インスタンスの作成
lbl(n).Parent = Me 'フォームの上に配置
With lbl(n)
.Width = 80
.Left = lbl(n).Width * n
.Text = Str(n + 1)
.BackColor = Color.Blue
.ForeColor = Color.White
If n = 9 Then
.Width = 120
Else
.Width = 80
End If
End With
Next
For n = 0 To 20
comb(n) = New ComboBox() 'インスタンスの作成
comb(n).Parent = Me 'フォームの上に配置
With comb(n) 'コンボボックスの配置
.Width = 40
.Left = comb(n).Width * n
.Top = lbl(0).Top + lbl(0).Height
.Text = ""
.Tag = n
End With
If n \ 2 = n / 2 Then '偶数奇数--偶数だっら
comb(n).Items.Add("-")
'イベントハンドラーの作成
AddHandler comb(n).Click, AddressOf ComboBox_SelectedIndexChanged
For m = 1 To 10
comb(n).Items.Add(CStr(m))
Next
Else
comb(n).Text = ""
End If
Next
End Sub
Private Sub ComboBox_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Dim cmb As ComboBox
Dim t As Integer
Dim n As Integer
Dim s As Integer
cmb = DirectCast(sender, ComboBox)
If comb(cmb.Tag).Text() <> "" Then
t = Val(comb(cmb.Tag).Text)
If t = 20 Then Exit Sub
With comb(cmb.Tag + 1)
.Items.Clear()
Select Case (t)
Case 0 To 8
.Text = "-"
.Items.Add("-")
For n = 1 To (10 - t - 1)
.Items.Add(CStr(n))
Next
.Items.Add("/")
Case 9
.Text = "-"
.Items.Add("-")
.Items.Add("/")
Case Else
.Text = ""
End Select
End With
End If
End Sub
このコードは一つ欠陥があり、ComnboBoxを配列にするとComboBoxのIndexで項目を選択してもTextが確定せずに
マウスで一回Textをクリックしないとだめなようです。配列にしないといいのですが。ComnboBoxの仕様かな。。
まあ参考までに。
「特攻隊長まるるう」さん、「ねろ」さん、本当にありがとうございました。それと返事が遅くなり申し訳ありません。一応VB.Netの本は2冊持ってるんですが、それは基礎本ではありません。
昔、Accessの基礎の本を買ったら、マクロのこととか全然載っていなくて失敗した経験があるので、ケチって中級くらいまで長く使えるのを買ってしまいました。もう一冊は辞書みたいにたくさん技が載ってるものを買いました。その結果意味もわからず暗号のように使ってるコードがあったりします。たとえばモジュールなんかは何度意味を調べても???です。
「特攻隊長まるるう」さん、「ねろ」さんの言うように基礎本を買って
やさしいプログラミングを本を見ないでつくれることから練習することが必要だと感じました。 何の利益もないのにおつきあいいただいてありがとうございました。今度もう少しハイレベルな質問を載せたときには、また回答よろしくおねがいしますね。
>もがきながらさん
>ケチって中級くらいまで長く使えるのを買ってしまいました
あはは。。
私も本が好きで、しょっちゅう買ってくるけど、家に帰ってから
買って良かったと思う本は1/5位かな、後は本棚の肥やしに。
それでもその時は役に立たないと思っても、後から役に立つ事もあるし、
自分への投資だから、けちけちせずに買いの一手ですね。