順序よくオブジェクトにアクセスするには?

解決


ashigiku  2006-02-15 16:32:19  No: 130231

VB.NETでテキストファイルから一行ずつ読み込み、
静的に作られたテキストボックスに上から順に
格納するプログラムを制作しています。

しかし、下記のコードの様にFor~Each~Nextを使用すると、
読んだ一行が、何らかの順序に則って格納されてしまいます。

MSDNをみるとFor~Each~Nextは順番を予測した処理に不向きで、
For~NextやDo~Loopを使用したほうがよい場合があると書いてありましたが、
VB6と違いIndexの無い環境でFor~Nextをどう使えばよいのかわかりません。
どなたか詳しい方ご教授願います。

//コード

Dim sr As System.IO.StreamReader

sr = New System.IO.StreamReader _
 (".\Test.txt", System.Text.Encoding.GetEncoding(932))

For Each Temp As Object In Me.GroupBox1.Controls

  If TypeOf (Temp) Is TextBox Then
    If sr.Peek > -1 Then
      CType(Temp, TextBox).Text = sr.ReadLine()
    End If
  End If

Next


特攻隊長まるるう  2006-02-15 20:07:15  No: 130232

何らかの手段が存在するかどうかは知りません。が、
例え用意されてなくても好きなようにプログラムすればいいと思います。
[VB.NET]
    Private GroupBox1TextBoxes() As TextBox

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sr As System.IO.StreamReader
        Dim i As Integer
        'sr = New System.IO.StreamReader _
        ' (".\Test.txt", System.Text.Encoding.GetEncoding(932))

        If Me.GroupBox1TextBoxes Is Nothing Then
            Call Me.SetGroupBox1TextBoxes(Me.GroupBox1TextBoxes)
        End If
        If Me.GroupBox1TextBoxes Is Nothing Then Exit Sub

        For i = 0 To Me.GroupBox1TextBoxes.GetUpperBound(0)
            Debug.WriteLine(Me.GroupBox1TextBoxes(i).Text)
            'If sr.Peek > -1 Then
            '    Me.GroupBox1TextBoxes(i).Text = sr.ReadLine()
            'End If
        Next i
    End Sub

    Private Sub SetGroupBox1TextBoxes(ByRef TextBoxes() As TextBox)
        Dim wTextBoxIndexMax As Integer = -1
        Dim wTextBoxIndex As Integer
        ReDim TextBoxes(Me.GroupBox1.Controls.Count - 1)

        For Each Temp As Control In Me.GroupBox1.Controls
            If TypeOf (Temp) Is TextBox Then
                wTextBoxIndex = DirectCast(Temp, TextBox).TabIndex
                TextBoxes(wTextBoxIndex) = Temp
                If wTextBoxIndexMax < wTextBoxIndex Then
                    wTextBoxIndexMax = wTextBoxIndex
                End If
            End If
        Next

        If wTextBoxIndexMax = -1 Then
            TextBoxes = Nothing
        Else
            ReDim Preserve TextBoxes(wTextBoxIndexMax)
        End If
    End Sub


ashigiku  2006-02-16 09:05:46  No: 130233

まるるうさんの一旦配列にTabIndexで順序良く格納し、
そこにアクセスするというアドバイスを元に、
Sortのあるリストで処理を実現してみました。

Private Function Comparison _
  (ByVal x As TextBox, ByVal y As TextBox) As Integer

  If x.TabIndex < y.TabIndex Then
    Comparison = -1
  ElseIf x.TabIndex > y.TabIndex Then
    Comparison = 1
  Else
    Comparison = 0
  End If

End Function

という関数を用意し、

Dim TextList As New List(Of TextBox)

For Each Temp As Object In Me.GroupBox1.Controls
    If TypeOf Temp Is TextBox Then TextList.Add(CType(Temp, TextBox))
Next

TextList.Sort(AddressOf Comparison)

Dim sr As System.IO.StreamReader
sr = New System.IO.StreamReader _
  (MyFolder & "\DirAdmin.txt", System.Text.Encoding.GetEncoding(932))

Dim i As Integer

For i = 0 To TextList.Count - 1
  If sr.Peek <= -1 Then Exit For
  TextList(i).Text = sr.ReadLine
Next

sr.Close()

と記述することで順序よくテキストを格納することに成功しました。
お付き合いくださりどうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加