同じ操作

解決


もがきながら  2004-12-13 12:31:39  No: 118252  IP: [192.*.*.*]

この11個前にも質問したものです。何度もすいません。自分なりに努力しているつもりですがどうしてもわからないもので・・・。11個前の質問を見ていただけたらわかるようにボーリングの点数計算表をつくっていて、コマンドボックスの入力方法は解決したのですが、その同じ処理をあと8回繰り返すにはどうしたらいいでしょうか?For〜Nextを使うのではないかと考えましたがFor〜Nextをいれるとエラーになってしまいます。conbobox毎に一つずつ数字を増やしていけばできるにはできますがよろしくお願いします。

編集 削除
特攻隊長まるるう  2004-12-13 13:13:20  No: 118253  IP: [192.*.*.*]

>この11個前にも質問したものです。
そのような場合はリンク貼って下さい。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200412/04120061.txt
自分の環境もスレッドごとに毎回書くようにして下さい。
[VB.NET]

>その同じ処理をあと8回繰り返すにはどうしたらいいでしょうか?
引数にコンボボックスを渡す関数を作ってみてはどうでしょう。

>For〜Nextを使うのではないかと考えましたがFor〜Nextをいれるとエラーになってしまいます。
そういった方法もあると思います。コーディングの手法は無数に
ありますのでサンプルコードを示すなどしてエラーになる状況を
もっと具体的に説明して下さい。また、エラーに関して質問する
場合はエラーメッセージを必ず書いて下さい。

編集 削除
いな  2004-12-13 13:13:49  No: 118254  IP: [192.*.*.*]

ん〜っと、順番は入れ替わるので、
このような場合にはリンクを張りましょうね。

っと、この投稿をした瞬間、11個前ではなくなってしまいますので

編集 削除
もがきながら  2004-12-13 13:45:53  No: 118255  IP: [192.*.*.*]

「特攻隊長まるるう」さん、「いな」さん即答ありがとうございます。
いろいろ勉強になります。

>引数にコンボボックスを渡す関数
何の事だかわかりませんが、調べてみます。

たとえば下記のコードを繰り返すとしてどこに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でくくることはできるんですか?
よろしくお願いします。

編集 削除
特攻隊長まるるう  2004-12-13 14:24:58  No: 118256  IP: [192.*.*.*]

それぞれ、過去ログにも似たようなサンプルはたくさんありますし、
ヘルプでもひと通り調べておいて下さい。
[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

編集 削除
特攻隊長まるるう  2004-12-13 14:28:58  No: 118257  IP: [192.*.*.*]

>たとえば下記のコードを繰り返すとしてどこにForを入れたらいいのでしょう?
ComboBox1 と ComboBox2 が固定ではループ処理できません。

編集 削除
もがきながら  2004-12-13 16:16:25  No: 118258  IP: [192.*.*.*]

「特攻隊長まるるう」さん、教えていただきありがとうございます。
とてもむずかしいですね。3つのどれかを使うとき固定されたループは
書き直さなくてはならないんですね。
こういう処理はなんという名前で呼ばれているのでしょう?
繰り返し処理?ですか?
もう少しがんばってみます。
ありがとうございました。

編集 削除
もがきながら  2004-12-13 18:42:39  No: 118259  IP: [192.*.*.*]

だめです。どうしてもわかりません。特攻隊長まるるうさんに書いていただいたコードがどのようにつながるのかわかりません。過去ログのどれが似たようなサンプルなのか、どなたかヒントをいただけませんでしょうか???

編集 削除
ねろ  2004-12-13 20:27:53  No: 118260  IP: [192.*.*.*]

もがきながらさん、あなたのやろうとしている事は、VB.NETでは
結構難しい事なんです。
この掲示板上だけで説明する事は少し無理があるかも知れません。
やはり本か何かでVB.NETの基本を少し勉強する必要があります。
コントロールの配列とかイベントハンドラなどと言うことが少し
理解できるようになれば、特攻隊長まるるうさんが書いたコードが
理解できると思います。

編集 削除
もがきながら  2004-12-14 04:24:40  No: 118261  IP: [192.*.*.*]

やっぱりそうなんですか・・・。だからC言語のサンプルが多かったんですね。自分はプログラミングはVB.Netが初めてなので他の言語がどういうことを意味してるのかまったくわかりません。いづれにしても基本的な勉強が必要ですね。コントロールの配列、イベントハンドラ、教えていただいてありがとうございました。

編集 削除
特攻隊長まるるう  2004-12-14 14:30:36  No: 118262  IP: [192.*.*.*]

>とてもむずかしいですね。
>こういう処理はなんという名前で呼ばれているのでしょう?
いえ、知らないと自分で思いつくのは難しいですが、技術的には簡単な
レベルだと思います。いたって普通のコードなので特に名前は付いて
いないです。強いてあげるならコメントの文章そのままかと思います。
自分で関数(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

編集 削除
ねろ  2004-12-14 16:32:28  No: 118263  IP: [192.*.*.*]

私も一応こんなの作っていたんですが、乗っけようか、止めようか迷っていたところで。。。
    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の仕様かな。。
まあ参考までに。

編集 削除
もがきながら  2004-12-14 17:36:14  No: 118264  IP: [192.*.*.*]

「特攻隊長まるるう」さん、「ねろ」さん、本当にありがとうございました。それと返事が遅くなり申し訳ありません。一応VB.Netの本は2冊持ってるんですが、それは基礎本ではありません。
昔、Accessの基礎の本を買ったら、マクロのこととか全然載っていなくて失敗した経験があるので、ケチって中級くらいまで長く使えるのを買ってしまいました。もう一冊は辞書みたいにたくさん技が載ってるものを買いました。その結果意味もわからず暗号のように使ってるコードがあったりします。たとえばモジュールなんかは何度意味を調べても???です。
「特攻隊長まるるう」さん、「ねろ」さんの言うように基礎本を買って
やさしいプログラミングを本を見ないでつくれることから練習することが必要だと感じました。  何の利益もないのにおつきあいいただいてありがとうございました。今度もう少しハイレベルな質問を載せたときには、また回答よろしくおねがいしますね。

編集 削除
ねろ  2004-12-14 21:11:02  No: 118265  IP: [192.*.*.*]

>もがきながらさん
>ケチって中級くらいまで長く使えるのを買ってしまいました
あはは。。
私も本が好きで、しょっちゅう買ってくるけど、家に帰ってから
買って良かったと思う本は1/5位かな、後は本棚の肥やしに。
それでもその時は役に立たないと思っても、後から役に立つ事もあるし、
自分への投資だから、けちけちせずに買いの一手ですね。

編集 削除