Springen naar inhoud


- - - - -
VS 2015

Opnieuw Inlezen Binary File Gaat Niet Goed



  • Log in a.u.b. om te beantwoorden
Er zijn 3 reacties in dit onderwerp

#1 lampje25

lampje25

    Starting Developer

  • Leden
  • 3 berichten
    Laatst bezocht 28 aug 2020 21:47

Geplaatst op 23 augustus 2020 - 16:56

Hallo,

Ik lees een file in en zet deze vervolgens in textboxen.
dit gaat allemaal goed.

Als ik echter een andere file open, die kleiner is dan blijft er van het vorige nog dingen staan.

Hoe kan ik dat oplossen?

In "Private Sub LeesMddFile()" lees ik de file in.
alles komt te staan in: "Public bytesMdd = New Byte(bufferSizeMdd) {}"

Code:
Imports System.Text
Imports System.IO
Public Class Form1
Public Property Path As String 'bevat pad van de file
Public Property NaamFiles As String 'bevat naam van de filebufferSizeMdd
Public Property B As String
Public Property GekozenModel As Int16
Public Property GekozenRecept As Int16
Public Modelnr() As String
Public Stap As Int16 = "685"
Public StapRCD As Int16 = "685"
Public bufferSizeMdd As Integer = 5000
Public bufferSizeRcd As Integer = 5000
Public bytesMdd = New Byte(bufferSizeMdd) {}
Public bytesRcd = New Byte(bufferSizeRcd) {}
Public mdd_par As New MDD_par
Public mdd_pos As New MDD_Pos
Public rcd_par As New RCD_par
Public rcd_pos As New RCD_Pos
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
	 Me.CenterToParent()
	 ListBox2.Items.Add("1")
	 ListBox2.Items.Add("2")
	 ListBox2.Items.Add("3")
	 ListBox2.Items.Add("4")
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
	 'Call LeesWaardenMdd()
	 Call LeesWaardenRcd()
End Sub
Private Sub VullenModel()
	 'MDD_parameter.ModelNummer = Encoding.ASCII.GetString(bytes, MDD_Pos.ModelNummer + Stap, 32), 'string 32 modelnr
End Sub
Private Sub LeesMddFile()
	 Dim copyPathMdd As String
	 Dim overwrite As Boolean
	 Dim MDD_File As String
	 MDD_File = Path & "\" & NaamFiles & ".mdd"
	 copyPathMdd = Path & "\" & NaamFiles & "2.mdd"
	 Dim inputFileMdd = IO.File.Open(MDD_File, IO.FileMode.Open)
	 'Dim bytes = New Byte(bufferSizeMdd) {}
	 If overwrite AndAlso My.Computer.FileSystem.FileExists(copyPathMdd) Then
		 My.Computer.FileSystem.DeleteFile(copyPathMdd)
	 End If
	 While inputFileMdd.Read(bytesMdd, 0, bufferSizeMdd) > 0
		 My.Computer.FileSystem.WriteAllBytes(copyPathMdd, bytesMdd, True)
	 End While
	 inputFileMdd.Close()
End Sub
Private Sub LeesRcdFile()
	 Dim copyPathRcd As String
	 Dim overwrite As Boolean
	 Dim RCD_File As String
	 RCD_File = Path & "\" & NaamFiles & ".rcd"
	 copyPathRcd = Path & "\" & NaamFiles & "2.rcd"
	 Dim inputFileRcd = IO.File.Open(RCD_File, IO.FileMode.Open)
	 'Dim bytes = New Byte(bufferSizeMdd) {}
	 If overwrite AndAlso My.Computer.FileSystem.FileExists(copyPathRcd) Then
		 My.Computer.FileSystem.DeleteFile(copyPathRcd)
	 End If
	 While inputFileRcd.Read(bytesRcd, 0, bufferSizeRcd) > 0
		 My.Computer.FileSystem.WriteAllBytes(copyPathRcd, bytesRcd, True)
	 End While
	 inputFileRcd.Close()
End Sub
Private Sub LeesWaardenMdd()
	 Dim sStap As Int16
	 mdd_pos.MddVersion = "0"
	 mdd_pos.AantModel = "1"
	 mdd_pos.ModelNummer = "2"
	 mdd_pos.ModelNaam = "35"
	 mdd_pos.MuntKanaal6 = "167"
	 mdd_pos.Pincode = "452"
	 mdd_pos.GewInhoudCanisterStep = "686"
	 sStap = Stap
	 If GekozenModel = "1" Then
		 sStap -= sStap
	 ElseIf GekozenModel = "2" Then
		 'geen keuze nodig
	 ElseIf GekozenModel > "2" Then
		 GekozenModel -= "1"
		 sStap *= GekozenModel
	 End If
	 mdd_par.MddVersion = CStr(bytesMdd(mdd_pos.MddVersion))
	 mdd_par.AantModel = CStr(bytesMdd(mdd_pos.AantModel))
	 mdd_par.ModelNummer = Encoding.ASCII.GetString(bytesMdd, mdd_pos.ModelNummer + sStap, 32) 'string 32 modelnr
	 mdd_par.ModelNaam = Encoding.ASCII.GetString(bytesMdd, mdd_pos.ModelNaam + sStap, 32) 'string 32 modelnaam
	 mdd_par.MuntKanaal6 = BitConverter.ToInt16(bytesMdd, mdd_pos.MuntKanaal6 + sStap) ' integer muntkanaal 6
	 mdd_par.Pincode = Encoding.ASCII.GetString(bytesMdd, mdd_pos.Pincode + sStap, 5) 'string 5 pincode
	 mdd_par.GewInhoudCanisterStep = CStr(bytesMdd(mdd_pos.GewInhoudCanisterStep + sStap))
	 TextBox11.Text = mdd_par.MddVersion
	 TextBox12.Text = mdd_par.AantModel
	 TextBox13.Text = mdd_par.ModelNummer
	 TextBox14.Text = mdd_par.ModelNaam
	 TextBox15.Text = mdd_par.MuntKanaal6
	 TextBox16.Text = mdd_par.Pincode
	 TextBox17.Text = mdd_par.GewInhoudCanisterStep
End Sub
Private Sub LeesWaardenRcd()
	 Dim sStap As Int16
	 rcd_pos.RCDVersion = "0"
	 rcd_pos.RCDMajor = "1"
	 rcd_pos.ModelNaam = "3"
	 rcd_pos.AantRecept = "35"
	 rcd_pos.ReceptNaamNr = "36"
	 rcd_pos.ReceptID = "37"
	 GekozenRecept = 1
	 sStap = StapRCD
	 If GekozenRecept = "1" Then
		 sStap -= sStap
	 ElseIf GekozenRecept = "2" Then
		 'geen keuze nodig
	 ElseIf GekozenRecept > "2" Then
		 GekozenRecept -= "1"
		 sStap *= GekozenRecept
	 End If
	 rcd_par.RCDVersion = CStr(bytesRcd(rcd_pos.RCDVersion))
	 rcd_par.RCDMajor = CStr(bytesRcd(rcd_pos.RCDMajor))
	 rcd_par.ModelNaam = Encoding.ASCII.GetString(bytesRcd, rcd_pos.ModelNaam + sStap, 32) 'string 32 modelnaam
	 rcd_par.AantRecept = CStr(bytesRcd(rcd_pos.AantRecept))
	 rcd_par.ReceptNaamNr = CStr(bytesRcd(rcd_pos.ReceptNaamNr))
	 rcd_par.ReceptID = BitConverter.ToInt16(bytesRcd, rcd_pos.ReceptID + sStap)
	 TextBox1.Text = rcd_par.RCDVersion
	 TextBox2.Text = rcd_par.RCDMajor
	 TextBox3.Text = rcd_par.ModelNaam
	 TextBox4.Text = rcd_par.AantRecept
	 TextBox5.Text = rcd_par.ReceptNaamNr
	 TextBox6.Text = rcd_par.ReceptID
End Sub
Private Sub VulLsb1()
	 Dim counter As Integer
	 Dim i As Integer
	 Dim sStap As Int16
	 sStap = Stap
	 ListBox2.Items.Clear()
	 counter = "1"
	 For i = 1 To mdd_par.AantModel
		 If counter = "1" Then
			 sStap -= sStap
		 ElseIf counter = "2" Then
			 sStap = "685"
		 End If
		 mdd_par.ModelNaam = Encoding.ASCII.GetString(bytesMdd, mdd_pos.ModelNummer + sStap, 32) 'string 32 modelnr)
		 ListBox2.Items.Add(mdd_par.ModelNaam)
		 sStap += 685
		 counter += "1"
	 Next
End Sub
'Private Sub NederlandsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles NederlandsToolStripMenuItem.Click
Private Sub NederlandsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NederlandsToolStripMenuItem.Click
	 ChangeLanguage("nl-NL")
	 NederlandsToolStripMenuItem.Checked = True
	 DuitsToolStripMenuItem.Checked = False
	 EngelsToolStripMenuItem.Checked = False
End Sub
'Private Sub DuitsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DuitsToolStripMenuItem.Click
Private Sub DuitsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DuitsToolStripMenuItem.Click
	 ChangeLanguage("de-DE")
	 DuitsToolStripMenuItem.Checked = True
	 EngelsToolStripMenuItem.Checked = False
	 NederlandsToolStripMenuItem.Checked = False
End Sub
'Private Sub EngelsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EngelsToolStripMenuItem.Click
Private Sub EngelsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EngelsToolStripMenuItem.Click
	 ChangeLanguage("en-US")
	 EngelsToolStripMenuItem.Checked = True
	 DuitsToolStripMenuItem.Checked = False
	 NederlandsToolStripMenuItem.Checked = False
End Sub

Private Sub OpenFileToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenFileToolStripMenuItem.Click
	 Dim dlg As New OpenFileDialog
	 'bytesMdd = bufferSizeMd
	 dlg.Filter = "All Files|*.mdd"
	 'Return fi.Directory.ToString
	 ' dlg.ShowDialog()
	 If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
		 Dim filename As String
		 filename = dlg.FileName
		 Dim fi As New FileInfo(filename)
		 'C = Path.GetFileNameWithoutExtension(filename)
		 NaamFiles = System.IO.Path.GetFileNameWithoutExtension(filename) 'naam van de gekozen file
		 Path = fi.Directory.ToString 'pad van de gekozen file
		 ' MsgBox(C)
		 'Path = filename
	 End If
	 'ListBox2.Items.Clear()
	 Call LeesMddFile()
	 Call LeesRcdFile()
	 ListBox2.SelectedItem = "1"
	 Call VulLsb1()
End Sub

Public Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged
	 GekozenModel = ListBox2.SelectedIndex + 1
	 Call LeesWaardenMdd()
End Sub
End Class
Public Structure MDD_par
Public MddVersion As Byte
Public AantModel As Byte
Public ModelNummer As String
Public ModelNaam As String
Public MuntKanaal6 As Integer
Public Pincode As String
Public GewInhoudCanisterStep As Byte
End Structure
Public Structure MDD_Pos
Public MddVersion As Int16
Public AantModel As Int16
Public ModelNummer As Int16
Public ModelNaam As Int16
Public MuntKanaal6 As Int16
Public Pincode As Int16
Public GewInhoudCanisterStep As Int16
End Structure
Public Structure RCD_par
Public RCDVersion As Byte
Public RCDMajor As Byte
Public AantRecept As Byte
Public ModelNaam As String
Public ReceptNaamNr As Byte
Public ReceptID As Integer
End Structure
Public Structure RCD_Pos
Public RCDVersion As Int16
Public RCDMajor As Int16
Public AantRecept As Int16
Public ModelNaam As Int16
Public ReceptNaamNr As Int16
Public ReceptID As Int16
End Structure



#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1200 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 23 augustus 2020 - 18:34

Bericht bekijkenlampje25, op 23 augustus 2020 - 16:56, zei:

Als ik echter een andere file open, die kleiner is dan blijft er van het vorige nog dingen staan.

In "Private Sub LeesMddFile()" lees ik de file in.
alles komt te staan in: "Public bytesMdd = New Byte(bufferSizeMdd) {}"

Oplossing: ken een nieuwe array van bytes toe aan bytesMdd als je een nieuw bestand inleest.
Je zou zelfs onmiddellijk de juiste grootte kunnen meegeven, dat lijkt me overigens slimmer.

Verder: waarom zijn al die fields public?
En nog verder: is het wel nodig dat het fields zijn i.p.v. lokale variabelen?

#3 lampje25

lampje25

    Starting Developer

  • Leden
  • 3 berichten
    Laatst bezocht 28 aug 2020 21:47

Geplaatst op 23 augustus 2020 - 21:43

Ik gebruik bytesMdd elders voor het vullen van de textboxen, dus vandaar dat ik die ook als een public gebruik
dus kom er zo niet uit hoe ik dat zou moeten oplossen.
bedoeling is dat ik de variabelen ook weer gebruik voor wegschrijven naar een bestand.

Ook is de indeling nog niet goed, volgens mij moet alles overzichtelijker kunnen (meer met modules werken??)

(ik al redelijk wat in VBA en VB6 gemaakt maar dit is de eerste keer in VB.net)
met wat ik nu gemaakt heb, leer ik door te proberen en via internet gevonden.

Veranderd door lampje25, 23 augustus 2020 - 21:47.


#4 lampje25

lampje25

    Starting Developer

  • Leden
  • 3 berichten
    Laatst bezocht 28 aug 2020 21:47

Geplaatst op 23 augustus 2020 - 22:58

Sorry, probleem is al opgelost.
op de e.o.a. manier werden de waarden niet opnieuw ingelezen, "Private Sub LeesWaardenMdd()" werd niet opnieuw aangeroepen na kiezen nieuwe file.
Door het toe te toevoegen aan "Private Sub OpenFileToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenFileToolStripMenuItem.Click" is mijn probleem opgelost!





Ook met taq VS 2015 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2015] Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)