Variable in .ini speichern

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Blay09.

    Variable in .ini speichern

    Moin,
    nach mindestens 30 Minuten googeln, hab ich mir gedacht schreibste jetzt nen Thread hier rein.
    Ich suche eine Möglichkeit in VB2005 den Inhalt einer Textbox (bzw. mehrerer) in eine .ini Datei zu speichern.
    Beim googeln hab ich aber nur mehrfach die Hinweise: XML ist besser, flexibler usw. gefunden - mit einem MSDN-Link.
    Da ich mit diesem XML-Krams nicht klar komme (zumindest bis jetzt ;)) wollte ich fragen ob es eine Möglichkeit gibt, das mit VB2005 mit einer .ini Datei zu lösen.
    Den iniSource für VB6 hab ich da, und der erscheint mir um einiges einfacher als das XML Zeugs.
    Naja gut, nach dem speichern müsste er die ini beim Programmstart dann laden und die Inhalte der Textfelder dann an die der ini anpassen.

    Also: Inhalt einer Textbox --> Variable --> ini
    danach
    Beim Programmstart: Ini -> Variable -> Textbox


    Hoffe ihr wisst, was ich meine ;)
    ich weiß nicht ob das auch bei 2005 geht aber bei 2008 sieht das so aus ;)

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Variable = IO.File.ReadAllLines("C:\inidatei.ini")
    3. TextBox1.Text = Variable
    4. End Sub
    5. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    6. Variable = TextBox1.Text
    7. IO.File.WriteAllText("C:\inidatei.ini", Variable)
    8. End Sub

    Bluespide schrieb:

    ich weiß nicht ob das auch bei 2005 geht aber bei 2008 sieht das so aus ;)

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Variable = IO.File.ReadAllLines("C:\inidatei.ini")
    3. TextBox1.Text = Variable
    4. End Sub
    5. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    6. Variable = TextBox1.Text
    7. IO.File.WriteAllText("C:\inidatei.ini", Variable)
    8. End Sub
    Wenn ich das so mache, sagt er mir:
    Der Wert vom Typ "1-dimensionales Array von String" kann nicht zu "String" konvertiert werden.
    Hier mein Sourcecode:

    VB.NET-Quellcode

    1. Private Sub settings_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim wow As String = txt_wow.Text
    3. wow = IO.File.ReadAllLines("C:\initdatei.ini")
    4. txt_wow.Text = wow
    5. End Sub
    6. Private Sub cmd_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_save.Click
    7. Dim wow As String = txt_wow.Text
    8. IO.File.WriteAllText("C:\inidatei.ini", wow)
    9. Me.Hide()
    10. End Sub


    Achja, und selbst wenn das funktionieren würde: Das Programm würde die komplette .ini Datei auslesen. Bei 20 Variablen bräuchte ich dann 20 ini Dateien. Das wäre Schwachsinn ;)

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

    Hi
    Dafür könntest du eigentlich den IO.StreamWriter bzw. IO.StreamReader verwenden!

    VB.NET-Quellcode

    1. Using sw As New StreamWriter("Pfad",False)
    2. sw.WriteLine("Text = " & TextBox1.Text)
    3. sw.close
    4. End Using

    das ganze geht auch fast genauso im StreamReader. Nur dass es statt WriteLine ReadLine heißt und das False bei der Erstellung wegfällt.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Hi
    Dafür könntest du eigentlich den IO.StreamWriter bzw. IO.StreamReader verwenden!

    VB.NET-Quellcode

    1. Using sw As New StreamWriter("Pfad",False)
    2. sw.WriteLine("Text = " & TextBox1.Text)
    3. sw.close
    4. End Using

    das ganze geht auch fast genauso im StreamReader. Nur dass es statt WriteLine ReadLine heißt und das False bei der Erstellung wegfällt.

    Gruß
    ~blaze~
    Du hast im Code das IO. vergessen ;)
    Das mit dem Writer funzt soweit, nur wie bekomme ich den Reader dazu, die entsprechende Zeile auszulesen und das dann in die Textbox zu schreiben?
    einfach ne schleife, in der erstma alle Zeilen vorher sozusagen ins Nichts eingelesen werden, und dann deine Variable zuweisen.
    Du musst übrigens nicht den ganzen Beitrag zitieren, wenn er direkt drüber steht ^^
    Wie lass ich jetzt beispielsweise die erste Zeile einlesen? Bzw. Die Zeile, die mit "xyz = " anfängt?
    Und: Wo finde ich den eingelesenen Wert dann? Wie ich dann dann einer Variable zuweise ist klar.

    Im Moment sieht das ganze so aus:

    VB.NET-Quellcode

    1. Using sw As New IO.StreamReader("C:\settings.ini")
    2. sw.ReadLine()
    3. sw.Close()
    4. End Using
    Hi
    Das is ein typischer Fehler bei mir das mit dem IO... (passiert mir immer :D)
    ich hab mir noch ne andere Möglichkeit statt dem StreamReader überlegt:

    VB.NET-Quellcode

    1. Private Const COMMENT As String = "//"
    2. Private Sub LoadIniFile(Byval Path as string)
    3. Dim Lines() As String = IO.File.ReadAllLines(Path)
    4. Dim Section As String = ""
    5. For Each line As String In lines
    6. If line.StartsWith(COMMENT) OrElse line.Trim = "" Then
    7. Continue For
    8. End If
    9. If line.StartsWith("[") Then
    10. If line.EndsWith("]") Andalso line.Length > 2 Then
    11. Section = line.Substring(1, line.Length - 2)
    12. Else
    13. Throw New Exception("Corrupt ini-file.")
    14. End If
    15. ElseIf Section = "" Then
    16. Throw New Exception("Corrupt ini-file.")
    17. Else
    18. InterpretIniFile(Section, GetKey(line), GetValue(line))
    19. End If
    20. Next
    21. End Sub
    22. Private Sub InterpretIniFile(Byval section As String, Byval key As String, Byval Value As String)
    23. Select Case section
    24. Case "me"
    25. Select Case key.ToLower
    26. Case "text"
    27. Me.Text = Value
    28. End Select
    29. End Select
    30. End Sub
    31. Private Function GetValue(Byval Value As String) As String
    32. If Not Value = "" AndAlso Value.Contains("=") Then
    33. Return Split(Value.Split("=")(1), COMMENT, -1, CompareMethod.Text)(0).Trim
    34. Else
    35. Return Split(Value, COMMENT, -1, CompareMethod.Text)(0)
    36. End If
    37. End Function
    38. Private Function GetKey(Byval Value As String) As String
    39. If Not Value = "" AndAlso value.Contains("=") Then
    40. Return Split(Value.Split("=")(0), COMMENT, -1, CompareMethod.Text)(0).Trim
    41. Else
    42. Return Split(Value, COMMENT, -1, CompareMethod.Text)(0)
    43. End If
    44. End Function


    ist nicht getestet (im Forum geschrieben)

    Edit: Pfad aus "Settings.ini" zu Path geändert ;)
    Edit: Section-Übergabe eingefügt
    Edit: Fehler bei GetKey und GetValue behoben
    Edit by Agent: "=" getestet

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Agent“ ()

    letztes Wochenende hatte ich das selbe Problem, hab mir dann nen eigenen Loader geproggt und sofort zum OCX kompiliert, habs mit VB6 gemacht, aber ich denke mal funzt auch unter VB2005.

    hatte es nur mal eben geproggt, is daher nich perfekt, aber seh selbst

    so funzt es in etwa:

    VB.NET-Quellcode

    1. 'zu beginn mal ne ini laden
    2. INI_Parser1.LoadINI("/xyz/abc.ini") 'liefert true wenn's geklappt hat und false wenn was schief lief
    3. 'bestimmten wert aus lesen
    4. xyz=INI_Parser1.GetValue("KeyWord", "SectionXYZ")
    5. 'Wert schreiben
    6. INI_Parser1.SetValue "KeyWord", "SectionXYZ", "irgendein Wert"
    7. 'da die INI komplett in den arbeitsspeicher gelesen wird, und auch nur dort verändert wird, sollte man spätestens beim beenden das aufrufen
    8. INI_Parser1.SaveINI "xyz/abc.ini"



    p.s. ich garantiere für nix!

    EDIT:
    achja, das ding findet man unter Komponenten: FireSoftware INI Parser
    Dateien
    • INI_Parser.rar

      (12,34 kB, 233 mal heruntergeladen, zuletzt: )
    @~blaze~: Ist das wirklich die einfachste Lösung dafür? 8|
    In deinem Code versteh' ich nur ca. 50% :(
    Vielleicht kannste mir das doch mit dem StreamReader erklären.
    Aber allemal danke für deine Mühe.
    @Fire: Wie kann ich die OCX importieren?
    bin mir nich mehr so ganz sicher, aber ich glaub das ging so:
    oben im menü auf 'Projekt' dann auf 'Komponenten', in dem Komponentenfenster auf 'Durchsuchen'. dann die INI_Parser.ocx suchen und auswählen.

    bin mir aber nich mehr so ganz sicher, korrigiert mich wenn ich falsch liege