0000
0000

Reputation: 677

Variables are used before it is assigned a null value. Using StreamReader

I decided to try one of the advanced exercises in my book, it needs me to edit a program. Before getting the artist name and price, the btn.Add_Click procedure should determine whether the CD name is already included in the list box. If the list box contains the CD name, the procedure should display an appropriate message and then not add the CD to the list. Problem is the Do Until inFile.Peek = -1 and the For Each Name As String In strNameCollection apparently are assigned a null value. Any ideas on why this is or possibly how to get this to work? btn.Add_Click is towards the bottom of the code

Option Explicit On
Option Strict On
Option Infer Off

Public Class frmMain

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    Me.Close()
End Sub

Private Sub frmMain_FormClosing(sender As Object, e As Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    ' save the list box information

    ' declare a StreamWriter variable
    Dim outFile As IO.StreamWriter
    ' open the file for output
    outFile = IO.File.CreateText("CDs.txt")
    ' write each line in the list box
    For intIndex As Integer = 0 To lstCds.Items.Count - 1
        outFile.WriteLine(lstCds.Items(intIndex))
    Next intIndex

    ' close the file
    outFile.Close()
End Sub

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    ' fills the list box with data 
    ' stored in a sequential access file

    ' declare variables
    Dim inFile As IO.StreamReader
    Dim strInfo As String

    ' verify that the file exists
    If IO.File.Exists("CDs.txt") Then
        ' open the file for input
        inFile = IO.File.OpenText("CDs.txt")

        ' process loop instructions until end of file
        Do Until inFile.Peek = -1
            strInfo = inFile.ReadLine
            lstCds.Items.Add(strInfo)
        Loop
        inFile.Close()

        ' select the first line in the list box
        lstCds.SelectedIndex = 0
    Else
        MessageBox.Show("Can't find the CDs.txt file",
                        "CD Collection",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information)
    End If
End Sub

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
    ' adds CD information to the list box

    ' declare variables
    Dim strName As String
    Dim strArtist As String
    Dim strPrice As String
    Dim strConcatenatedInfo As String
    Dim dblPrice As Double
    Dim strNameCollection() As String

    'read all names into array 

    Dim inFile As IO.StreamReader

    If IO.File.Exists("CDs.txt") Then
        ' open the file for input
        inFile = IO.File.OpenText("CDs.txt")
    End If
    'read all names into array 
    Dim index As Integer = 0
    Do Until inFile.Peek = -1
        ReDim strNameCollection(index)
        strNameCollection(index) = inFile.ReadLine
    Loop
    inFile.Close()

    ' get the CD information 
    strName = InputBox("CD name:", "CD Collection")
    For Each Name As String In strNameCollection
        If strName = Name Then
            MessageBox.Show("Sorry that name was alread on the list", "CD Project",
                            MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        Else
            strArtist = InputBox("Artist:", "CD Collection")
            strPrice = InputBox("Price:", "CD Collection")

            Double.TryParse(strPrice, dblPrice)
            strPrice = dblPrice.ToString("N2")

            strConcatenatedInfo = strName.PadRight(40) &
        strArtist.PadRight(25) & strPrice.PadLeft(5)
            lstCds.Items.Add(strConcatenatedInfo)
        End If
    Next Name

End Sub

Private Sub btnRemove_Click(sender As Object, e As EventArgs) Handles btnRemove.Click
    ' removes the selected line from the list box

    ' if a line is selected, remove the line
    If lstCds.SelectedIndex <> -1 Then
        lstCds.Items.RemoveAt(lstCds.SelectedIndex)
    End If
End Sub
End Class

Upvotes: 0

Views: 359

Answers (1)

OneFineDay
OneFineDay

Reputation: 9024

Why not take advantage of the Using blocks? Make strNameCollection a List(Of String) instead of an array that you are not increasing it's size correctly.

Private strNameCollection As New List(Of String)
Using sr As New StreamReader("CDs.txt")
  While Not sr.EndOfStream
    strNameCollection.Add(sr.ReadLine)
  End while
End Using ' file closed and stream disposed    

Upvotes: 3

Related Questions