Boolean Frage

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von haiyyu.

    Boolean Frage

    Hallo
    Ich wundere mich gerade über etwas.
    Denn im öffnen Sub setzte ich die Boolean Variable auf True.
    Wenn ich sie aber beim Speichern wieder abfrage ist sie aufeinmal wieder False.
    Ist das Verhalten normal?
    Und wie geht es dass die die Variable true bleibt?



    VB.NET-Quellcode

    1. Public Class Writer
    2. Public Path As String
    3. Public saved As Boolean
    4. Public Sub Öffnen()
    5. Form1.OpenFileDialog1.ShowDialog()
    6. Path = Form1.OpenFileDialog1.FileName
    7. If Path = "" Then
    8. MsgBox("Sie haben keine Datei angegeben")
    9. Else
    10. Try
    11. Form1.Text = "TB-Trainee Editor" + " " + Path
    12. Form1.TextBox1.Text = My.Computer.FileSystem.ReadAllText(Path)
    13. saved = True
    14. MsgBox(saved)
    15. Catch ex As Exception
    16. MsgBox(ex.Message)
    17. End Try
    18. End If
    19. End Sub
    20. Public Sub Speichern()
    21. MsgBox(saved)
    22. If saved = True Then
    23. My.Computer.FileSystem.WriteAllText(Path, Form1.TextBox1.Text, False)
    24. Else
    25. MsgBox("lol")
    26. End If
    27. End Sub
    28. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rykoJLL“ ()

    Naja könnte sein aber im ersten Sub wird die Variable True gesetzt und danach eine Msgbox gezeigt die den wert von saved anzeigt .
    Und das passiert auch daran kanns nicht liegen.
    Ja sie wird erreicht.
    Das Trycatch habe ich nur für den Fall reingetan falls die Datei nicht existiert dass das Programm nicht abschmiert.
    Also die Zeile wird erreicht den

    VB.NET-Quellcode

    1. saved=true
    2. Msgbox(saved)

    Und wenn ich dass programm starte.
    Bekomme ich die Msgbox mit folgendem Ergebnis
    True

    rykoJLL schrieb:

    Das Trycatch habe ich nur für den Fall reingetan falls die Datei nicht existiert dass das Programm nicht abschmiert.

    VB.NET-Quellcode

    1. If File.Exists(...) Then
    ?
    Werden beide mit

    VB.NET-Quellcode

    1. Dim wr as New Writer
    2. wr.öffnen


    VB.NET-Quellcode

    1. Dim wr as New Writer
    2. wr.speichern

    aufgerufen
    Mit "New" erstellst du jedes Mal ein neues Objekt.
    Du musst das Ganze natürlich aufs Gleiche anwenden.

    VB.NET-Quellcode

    1. Dim wr As New Writer
    2. wr.öffnen()
    3. ' ...
    4. wr.speichern()
    Das Problem dabei ist ich habe die Objekte in zwei verschiedenen Subs.

    VB.NET-Quellcode

    1. Private Sub SpeichernToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SpeichernToolStripMenuItem.Click
    2. Dim wr As New Writer
    3. wr.Speichern()
    4. End Sub
    5. Private Sub ÖffnenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÖffnenToolStripMenuItem.Click
    6. Dim wr As New Writer
    7. wr.Öffnen()
    8. End Sub


    Und wenn ich jetzt z.b. beim speichern nur

    VB.NET-Quellcode

    1. dim wr as Writer
    2. wr.speicher

    Dann ist wr ja eine Nullreferenz und es wird ein fehler ausgeworfen
    Natürlich, dein zweiter Code erstellt auch nur eine leere Referenz. Damit kannst du nichts machen.
    Probier's so:

    VB.NET-Quellcode

    1. Class Form1
    2. Dim wr As New Writer
    3. Private Sub SpeichernToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SpeichernToolStripMenuItem.Click
    4. wr.Speichern()
    5. End Sub
    6. Private Sub ÖffnenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÖffnenToolStripMenuItem.Click
    7. wr.Öffnen()
    8. End Sub
    9. End Class


    @FlashTek: Wenn das Objekt nur in derselben Klasse verwendet wird, dann muss es gar nicht Public sein. Private reicht vollkommen aus.
    Edit: Bin etwas spät dran.

    Da liegt vermutlich das Problem:

    VB.NET-Quellcode

    1. Dim wr As New Writer

    erstellt eine neue Instanz von Writer. Und dann ist saved natürlich wieder False.

    Erstelle beim Starten der Anwendung ein einzelnes Objekt von Writer und verwende nur dieses zum Speichern und Laden.


    Alternativ:
    Wenn Du den Writer nur einmal benötigst, dann kannst Du es umschreiben:

    VB.NET-Quellcode

    1. Public Class Writer
    2. Public Shared Path As String
    3. Public Shared saved As Boolean
    4. Public Shared Function Öffnen() As String
    5. Using OFD As New OpenFileDialog 'Der OpenFileDialog wird nur hier benötigt. Nimm den aus Form1 raus.
    6. If OFD.ShowDialog = DialogResult.OK Then 'Wenn der Benutzer auf Abbrechen klickt wird gar nicht erst versucht was auszulesen.
    7. Path = OFD.FileName
    8. 'Form1.Text = "TB-Trainee Editor" + " " + Path '<---- das sollte nicht gemacht werden. Stattdessen sollte der Aufrufer (wird wohl !!!eine Instanz von Form1!!! sein) seinen Text selbst setzen.
    9. saved = True
    10. 'MsgBox(saved)
    11. Return System.IO.File.ReadAllText(Path) 'Vermeide das My-Namespace!
    12. End If
    13. End Using
    14. Return String.Empty 'Wenn keine Datei geöffnet wurde, dann gibt es auch keinen Inhalt, der zurückgegeben werden soll.
    15. End Function
    16. Public Shared Sub Speichern(ByVal Inhalt As String) 'Der Aufrufer gibt als Inhalt das an, was vorher Form1.TextBox1.Text war.
    17. 'MsgBox(saved)
    18. If saved Then 'Doppelte Abfragen sind unnötig.
    19. System.IO.File.WriteAllText(Path, Inhalt)
    20. Else
    21. MsgBox("lol") 'Was immer das bringt.
    22. End If
    23. End Sub
    24. End Class


    Beachte das "Shared"
    Dadurch benötigst Du keine Instanz von Writer mehr, sondern kannst

    VB.NET-Quellcode

    1. Writer.Speichern(Bla)

    aufrufen.

    (Wie gesagt: Nur verwenden, wenn nicht mehrere Instanzen benötigt werden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Du könntest auch einen Singleton verwenden, das hätte dann einige Vorteile (z.B. könntest du das Ganze als Parameter übergeben, und Vererbung ist möglich).

    VB.NET-Quellcode

    1. Class Writer
    2. Private _instance As Writer
    3. Public Property Instance As Writer
    4. Get
    5. If _instance Is Nothing Then
    6. _instance = New Writer()
    7. End If
    8. Return _instance
    9. End Get
    10. End Property
    11. Private Sub New() ' privater Konstruktor
    12. ' ...
    13. End Sub
    14. End Class