FileSystemWatcher Textbox Aktualisieren

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Departet.

    FileSystemWatcher Textbox Aktualisieren

    Hallo,

    ich bin zur Zeit mit meinem Abschlussprojekt beschäftigt. Es wird eine CSV Datei eingelesen, in der sich die CPU Temperaturen befinden. Anschließend leuchtet auf einem MSR Board eine dementsprechende LED auf. Nun soll jedesmal wenn sich die CSV aktualisiert das Array der Werte aktualisiert werden und der letzte, neuste Wert ins TextFeld geschrieben werden. Bei allen Lösungen, die ich bisher hatte ist das Programm einfach ausgegangen. Ohne Fehler!

    Ich hänge einfach mal das KOMPLETTE Programm an.
    (Wenn etwas komisch programmiert ist bitte nicht so hart sein ^^)


    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim Datei As Object
    4. Dim myComPort As IO.Ports.SerialPort
    5. Private Sub ReadCSVFileToArray()
    6. Dim Reihe As Long
    7. Dim Spalte As Long
    8. Dim x As Integer
    9. Dim y As Integer
    10. Dim Test(1, 1) As String
    11. If Datei = "" Then
    12. MsgBox("Bitte erst eine Datei auswählen.")
    13. Else
    14. 'Check if file exist
    15. If File.Exists(Datei) Then
    16. Dim tmpstream As StreamReader = File.OpenText(Datei)
    17. Dim dateireihe() As String
    18. Dim Buffer() As String
    19. dateireihe = tmpstream.ReadToEnd().Split(Environment.NewLine)
    20. 'Auslesen des Ordners der CSV Datei
    21. Dim pfad As String
    22. pfad = Path.GetDirectoryName(Datei)
    23. 'Starten eines neuen FileSystemWatchers in dem Ordner der CSV. Beim ändern einer Datei wird das Event OnChanged gestartet
    24. Dim spy As New FileSystemWatcher()
    25. spy.Path = pfad
    26. spy.NotifyFilter = (NotifyFilters.LastWrite)
    27. AddHandler spy.Changed, AddressOf OnChanged
    28. spy.EnableRaisingEvents = True
    29. ' Display the data in textbox
    30. TextBox1.Text = TextBox1.Text & "In diesem Textfeld sehen sie die derzeitigen Temperaturwerte ihrer CPU."
    31. TextBox1.Text = TextBox1.Text & vbNewLine & "Diese aktualisieren sich alle 30 Sekunden."
    32. TextBox1.Text = TextBox1.Text & vbNewLine
    33. TextBox1.Text = TextBox1.Text & vbNewLine
    34. ' Redimension the array.
    35. Reihe = UBound(dateireihe)
    36. Buffer = dateireihe(0).Split(",")
    37. Spalte = UBound(Buffer)
    38. ReDim Test(Reihe, Spalte)
    39. ' Copy the data into the array.
    40. For x = 0 To Reihe
    41. Buffer = dateireihe(x).Split(",")
    42. For y = 0 To Spalte
    43. Test(x, y) = Buffer(y)
    44. Next
    45. Next
    46. tmpstream.Close()
    47. Dim CpuTemp As Integer
    48. Dim Cputemperatur(1) As Integer
    49. ReDim Cputemperatur(CpuTemp)
    50. For x = 8 To Reihe - 1
    51. For y = 0 To Spalte
    52. TextBox1.Text = TextBox1.Text & "Ihre derzeitige Cpu Temperatur beträgt: "
    53. CpuTemp = Test(x, y)
    54. TextBox1.Text = TextBox1.Text & CpuTemp & "°C"
    55. TextBox1.Text = TextBox1.Text & Environment.NewLine
    56. Next
    57. Next
    58. 'Fehler des Programmes werden ab hier übersrprungen
    59. On Error Resume Next
    60. 'Sollte die CPU Temperatur über 50° sein, so färbt sich die PictureBox rot und die rote LED des MSR Boards leuchtet auf
    61. If (CpuTemp > 50) Then
    62. PictureBox1.BackColor = Color.Red
    63. myComPort.DtrEnable = False
    64. myComPort.RtsEnable = True
    65. Else
    66. 'Sollte die CPU Temperatur <=50° sein, so färbt sich die PictureBox grün und die grüne LED des MSR Boards leuchtet auf
    67. PictureBox1.BackColor = Color.Green
    68. myComPort.RtsEnable = False
    69. myComPort.DtrEnable = True
    70. On Error GoTo 0
    71. End If
    72. 'Ans Ende der Box springen
    73. With TextBox1
    74. .Select()
    75. SendKeys.Send("^({END})")
    76. End With
    77. End If
    78. End If
    79. End Sub
    80. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    81. ReadCSVFileToArray()
    82. End Sub
    83. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    84. End Sub
    85. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    86. End Sub
    87. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    88. PictureBox1.BorderStyle = 1
    89. PictureBox2.BorderStyle = 1
    90. End Sub
    91. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    92. Datei = FktDatei()
    93. End Sub
    94. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    95. 'Bei einem Fehler wird zu dem Punkt "Fehler" gesprungen, welcher dann eine Fehler Meldung ausgibt und die Picture Box rot färbt
    96. On Error GoTo Fehler
    97. 'Es wird versucht den COM Port zu öffnen. Sollte dies ohne Fehler erfolgen, so färbt sich die PictureBox grün und das Sub wird verlassen
    98. myComPort = New IO.Ports.SerialPort("COM" + RichTextBox1.Text)
    99. myComPort.Open()
    100. If (Err.Number = 0) Then
    101. PictureBox2.BackColor = Color.Green
    102. Exit Sub
    103. End If
    104. Fehler:
    105. PictureBox2.BackColor = Color.Red
    106. MsgBox("COM-Port nicht verfügbar")
    107. End Sub
    108. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    109. 'Sollte der COM Port geschlossen werden, so färbt sich die PictureBox gelb
    110. myComPort.Close()
    111. PictureBox1.BackColor = Color.Yellow
    112. End Sub
    113. Public Function FktDatei()
    114. 'Einlesen der Datei
    115. Dim pathinfo As Object
    116. Dim openFileDialog1 As New OpenFileDialog()
    117. openFileDialog1.Filter = "Text (*.CSV)|*.CSV|Alle Dateien (*.*)|*.*"
    118. openFileDialog1.Title = "Wähle die auszulesende Csv Datei aus."
    119. openFileDialog1.InitialDirectory = "C:\"
    120. If openFileDialog1.ShowDialog() = DialogResult.OK Then
    121. ListBox1.Items.AddRange(openFileDialog1.FileNames)
    122. End If
    123. ' Load the file.
    124. pathinfo = openFileDialog1.FileName
    125. FktDatei = pathinfo
    126. End Function
    127. Private Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)
    128. MsgBox("Datei wurde geändert")
    129. End Sub
    130. End Class
    Würdest du bitte GENAU sagen was dein Problem ist? Ich habe keine Lust ein ganzen Code nach "???" zu durchsuchen.
    "Programm geht aus" damit kann ich nichts anfangen.

    ---

    Bei dem kleinen Code kannst du den Debugger mit Einzelschritten durchlaufen lassen, dann weißte die Zeile des Problems.
    Beim ändern der Datei soll folgendes geschehen als eigenes Event:

    VB.NET-Quellcode

    1. Dim Reihe As Long
    2. Dim Spalte As Long
    3. Dim x As Integer
    4. Dim y As Integer
    5. Dim Test(1, 1) As String
    6. Dim tmpstream As StreamReader = File.OpenText(Datei)
    7. Dim dateireihe() As String
    8. Dim Buffer() As String
    9. dateireihe = tmpstream.ReadToEnd().Split(Environment.NewLine)
    10. ' Redimension the array.
    11. Reihe = UBound(dateireihe)
    12. Buffer = dateireihe(0).Split(",")
    13. Spalte = UBound(Buffer)
    14. ReDim Test(Reihe, Spalte)
    15. ' Copy the data into the array.
    16. For x = 0 To Reihe
    17. Buffer = dateireihe(x).Split(",")
    18. For y = 0 To Spalte
    19. Test(x, y) = Buffer(y)
    20. Next
    21. Next
    22. tmpstream.Close()
    23. Dim CpuTemp As Integer
    24. Dim Cputemperatur(1) As Integer
    25. ReDim Cputemperatur(CpuTemp)
    26. For x = 8 To Reihe - 1
    27. For y = 0 To Spalte
    28. CpuTemp = Test(x, y)
    29. Next
    30. Next
    31. TextBox1.Text = TextBox1.Text & "Ihre derzeitige Cpu Temperatur beträgt: "
    32. TextBox1.Text = TextBox1.Text & CpuTemp & "°C"
    33. TextBox1.Text = TextBox1.Text & Environment.NewLine



    Wie kann ich das machen? Wenn ich das GENAU SO in ein eigenes SUB schreibe und es dann aufrufe geht das Programm aus. Sind Fehler in dem Code? Oder ist es nicht möglich mit einem Event?