[VB.Net] 2010 - Open Filedialog en Streamreader *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • necessaryevil
  • Registratie: September 2005
  • Laatst online: 22-09 21:06
Ik wil een programma schijven dat gebruikt maakt van een openfiledialog en de streamreader.

Wat ik tot nu toe heb is dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
        ' Geef de gebruiker de mogelijkheid om een .txt bestand te openen
        Dim openFileDialog1 As New OpenFileDialog()
        openFileDialog1.Filter = "txt-bestanden|*.txt"
        openFileDialog1.Title = "Selecteer een txt-bestand met materiaaleigenschappen"

        ' Laat dialoog zien.
        ' lees file en schrijf afwisselend naar combobox en string
        If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Dim inputstream1 As StreamReader = File.OpenText(openFileDialog1.FileName)

            Do
                i = cboxH1.Items.Count

                cboxH1.Items.Add(inputstream1.ReadLine)
                H1(i) = inputstream1.ReadLine

            Loop Until inputstream1.EndOfStream
            inputstream1.Close()
        End If
    End Sub


Echter krijg ik een error. (System.NullReferenceException). De compiller wijst naar de regel H1(i) = Inputstream1.readline.

Ik heb google al heel wat bandbreedte afgesnoept, maar ik kan uit de voorbeelden niet opmaken hoe dit wel moet.

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • TallManNL
  • Registratie: Oktober 2005
  • Laatst online: 25-09 14:06
Wat verwacht je dat regel 17 doet? Die leest de volgende regel uit de inputstream en steekt deze op plaats i in een ongedefinieerd iets.
Wat is H1 en waar/hoe heb je die gedeclareerd?

geheelonthouder met geheugenverlies


Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 22-09 13:39
Daarbij lijkt dit ook mis te lopen als je aan het einde van de file bent. De until kijkt of er nog wat in je file zit, maar vervolgens haal je twee regels op. Bij een oneven aantal regels gaat dit fout, alleen denk ik niet dat dat de oorzaak van de fout is, hier verwacht ik eerder een exception.

Acties:
  • 0 Henk 'm!

  • svandewouw
  • Registratie: Maart 2001
  • Laatst online: 22-09 17:14
Wat TallManNL zegt klopt inderdaad.

Pas verder USING toe zodat alle objecten automatisch ge-disposed en eventueel ge-closed worden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Private Sub Button1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button1.Click
        ' Geef de gebruiker de mogelijkheid om een .txt bestand te openen
        Using openFileDialog1 As New OpenFileDialog()
            openFileDialog1.Filter = "txt-bestanden|*.txt"
            openFileDialog1.Title = "Selecteer een txt-bestand met materiaaleigenschappen"

            ' Laat dialoog zien.
            ' lees file en schrijf afwisselend naar combobox en string
            If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                Using inputstream1 As System.IO.StreamReader = System.IO.File.OpenText(openFileDialog1.FileName)
                    Do
                        i = cboxH1.Items.Count

                        cboxH1.Items.Add(inputstream1.ReadLine)
                        H1(i) = inputstream1.ReadLine

                    Loop Until inputstream1.EndOfStream
                End Using
            End If
        End Using
    End Sub


edit: Zoals RobIII aangeeft.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
svandewouw schreef op donderdag 19 april 2012 @ 15:44:
Wat TallManNL zegt klopt inderdaad.

Pas verder USING toe zodat alle objecten automatisch "geclosed" worden:
Even mierencopuleren: ge-disposed ;) Closen != Disposen (hoewel een Dispose() wel een Close() zal uitvoeren als dat nog nodig is). Dat is ook de reden waarop je Using alleen kunt gebruiken op classes die IDisposable implementeren.

[ Voor 20% gewijzigd door RobIII op 19-04-2012 16:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

OpenFileDialog heeft trouwens al iets ingebouwd om je file te openen.

Zie MSDN: OpenFileDialog.OpenFile Method (System.Windows.Forms)

Daarnaast wil je testen op (File.Exists); dat hoeft namelijk niet.

Als je ReadLine gebruikt, test dan altijd eerst even of je niet aan het einde van de filestream zit ( MSDN: StreamReader.EndOfStream Property (System.IO) ). Dus ipv do... loop while gewoon While Not inputstream1.EndOfStream i.v.m. mogelijk lege files.

Daarnaast zoals gezegd: ook binnen using altijd netjes .Close() op je streams, dan weet je zeker dat het vrij gegeven is voordat je hem weer nodig hebt.

[ Voor 6% gewijzigd door CMG op 19-04-2012 16:21 ]

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CMG schreef op donderdag 19 april 2012 @ 16:20:
Daarnaast wil je testen op (File.Exists); dat hoeft namelijk niet.
Dat is redelijk nutteloos. Wat nou als de file bestaat op 't moment dat je File.Exists() aanroept en een split second daarna, voordat je aan je volgende statement toekomt, verwijder ik 'm? Een exception ga je toch moeten afhandelen dus open gewoon die (al dan niet bestaande) file en vang eventuele exception. Daarbij kun je het CheckFileExists property van de FileDialog gebruiken (en dan nog heb je hetzelfde probleem; je moet een eventuele exception bij 't openen gewoon vangen).
CMG schreef op donderdag 19 april 2012 @ 16:20:
Daarnaast zoals gezegd: ook binnen using altijd netjes .Close() op je streams, dan weet je zeker dat het vrij gegeven is voordat je hem weer nodig hebt.
Als je een Using gebruikt wordt je object aan 't eind van de using-scope ge-disposed (en dus geclosed). Ik doe 't ook altijd netjes (closen), maar dat is om mijn (expliciete) intenties duidelijk te maken. "Zeker weten dat het vrij gegeven is" doe je toch wel, ook als je 'm niet closed; de using zal daar namelijk door 't disposen van 't object zorg voor dragen ;)
Closes the underlying stream, releases the unmanaged resources used by the StreamReader, and optionally releases the managed resources.

[ Voor 16% gewijzigd door RobIII op 19-04-2012 16:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1