INI-Dateien / VB findest Klasse nicht

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    INI-Dateien / VB findest Klasse nicht

    Hallo,

    ich versuche mich an dem Ein- bzw Auslesen von Einstellungen. Als erstes habe ich XML-Dateien versucht, wurde aber wahnsinnig an dem Format. Ich habe es nicht hinbekommen eine XML-Datei nach meinem gewünschten Format hin zu bekommen. Nun gut, danach .ini-Dateien. Das erscheint mir einfacher.

    Meine Erkenntnisse:

    Quellcode

    1. Imports System.IO
    2. Imports System.Runtime.InteropServices
    3. Imports System.Text
    4. Protected Declare Ansi Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, _ByVal lpFileName As String) As Integer


    brauche ich wohl um INI-Dateien schreiben zu können.

    Imports System.Runtime.InteropServices
    Imports System.Text

    Public Class INI
    <DllImport("kernel32", EntryPoint:="GetPrivateProfileString")> _
    Shared Function Lesen( _
    ByVal Sektion As String, ByVal Key As String, ByVal StandartVal As String, _
    ByVal Result As StringBuilder, ByVal Size As Int32, ByVal Dateiname As String) As Int32

    End Function
    End Class


    um die ini-Datei wieder lesen zu können. Es gibt auch noch ein paar andere Anweisungen. Ich habe dieses Anweisungen überall hin geschrieben, aber nichts hat funktioniert.

    Mittlerweile habe ich alles in eine Klasse geschrieben:

    Imports System.Text
    Imports System
    Imports System.Runtime.InteropServices

    Public Class INI

    <DllImport("kernel32", EntryPoint:="WritePrivateProfileString")> _
    Shared Function Schreiben( _
    ByVal Sektion As String, ByVal Key As String, ByVal Value As String, _
    ByVal Dateiname As String) As Int32

    End Function

    <DllImport("kernel32", EntryPoint:="GetPrivateProfileString")> _
    Shared Function Lesen( _
    ByVal Sektion As String, ByVal Key As String, ByVal StandartVal As String, _
    ByVal Result As StringBuilder, ByVal Size As Int32, ByVal Dateiname As String) As Int32

    End Function
    End Class


    Aber jetzt findet VB diese Klasse nicht. Wenn ich in "Form1" einen Verweis auf "INI" setze passiert nichts (Es wird nichts vervollständigt).

    Imports System.Text
    Imports System
    Imports System.Runtime.InteropServices

    Public Class Form1
    Dim INItest As New INI

    INI. 'Hier passiert nichts, wenn ich was eingebe

    End Class


    Brauche ich einen Verweis? Was mache ich falsch? Muß ich an meinen Einstellungen was ändern? Programmierumgebung ist 2013 Professional.

    Gruß Nichtheilig

    Nichtheilig schrieb:

    Aber jetzt findet VB diese Klasse nicht
    Gehört die Datei, in der das drinsteht, zu Deinem Projekt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Nichtheilig schrieb:

    ch habe es nicht hinbekommen eine XML-Datei nach meinem gewünschten Format hin zu bekommen.


    Wie sieht denn das "gewünschte Format" aus?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Nichtheilig schrieb:

    in einer Methode
    Dies:

    VB.NET-Quellcode

    1. ' außerhalb einer Methode
    2. Dim res = Lesen()
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. ' innerhalb einer Methode
    5. Dim res = Lesen()
    6. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erstelle eine neue Klasse mit einem beliebigen Namen (Projekt → Klasse hinzufügen...), in meinem Fall heißt sie "winAPI.vb".
    Füge folgendes in die Klasse ein:

    VB.NET-Quellcode

    1. Public Class winAPI
    2. Public Function ReadFile(ByVal Section As String, ByVal Key As String, ByVal _Default As String, ByVal File As String) As String
    3. Dim Temp As String = Space(1024), Length As Integer
    4. Length = GetPrivateProfileString(Section, Key, _Default, Temp, Temp.Length, File)
    5. Return (Temp.Substring(0, Length))
    6. End Function
    7. Public Function WriteFile(ByVal Section As String, ByVal Key As String, ByVal Value As String, ByVal File As String) As Boolean
    8. Return (Not (WritePrivateProfileString(Section, Key, Value, File) = 0))
    9. End Function
    10. Friend Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal dwMinimumWorkingSetSize As Int32, ByVal dwMaximumWorkingSetSize As Int32) As Int32
    11. Friend Declare Ansi Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _
    12. (ByVal ApplicationName As String, ByVal KeyName As String, ByVal _Default As String, ByVal ReturnedString As String, ByVal Size As Int32, ByVal FileName As String) As Int32
    13. Friend Declare Ansi Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
    14. (ByVal ApplicationName As String, ByVal KeyName As String, ByVal _String As String, ByVal FileName As String) As Int32
    15. End Class


    So kannst du in deine ini-Datei schreiben und einen Wert (Value) auslesen:

    VB.NET-Quellcode

    1. Public Class Form1 'Form1 = Der Name deiner Form
    2. 'Füge dies jeder Form hinzu, über die du auf die WriteFile/ReadFile-Funktion zugreifen möchtest
    3. Private ini As New winAPI
    4. 'Environment.CurrentDirectory = Das Verzeichnis wo deine Anwendung gestartet wurde
    5. '+ "\Settings.ini" = Erstellt im Ausgabeverzeichnis die Datei mit dem Namen "Settings" + Dateiendung (.ini = Konfigurationseinstellungen)
    6. 'In meinem Fall wäre es: C:\Users\Username\Documents\Visual Studio 2015\Projects\WindowsApplication1\WindowsApplication1\bin\Debug\Settings.ini
    7. Private Path As String = Environment.CurrentDirectory + "\Settings.ini"
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. 'ini.WriteFile(Section, Key, Value, Path)
    10. 'Sieht dann in der ini-Datei so aus:
    11. '[Settings]
    12. 'ApplicationStartup=True
    13. ini.WriteFile("Settings", "ApplicationStartup", "True", Path)
    14. 'ini.ReadFile(Section, Key, Value, Path)
    15. 'Beim auslesen muss Value immer "" sein
    16. ini.ReadFile("Settings", "ApplicationStartup", "", Path)
    17. End Sub
    18. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ISD“ ()

    ISD schrieb:

    Füge folgendes in die Klasse ein
    Suboptimal.
    @Nichtheilig Wenn, dann mach Dir gleich eine INI-Klasse, die Du dann in jedes erfordernde Projekt übernehmen kannst.
    Member wäre der Dateipfad, mehrere INI-Dateien => mehrere Instanzen dieser Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    Nichtheilig schrieb:

    Imports System.Text
    Imports System
    Imports System.Runtime.InteropServices

    Public Class Form1
    Dim INItest As New INI

    INI. 'Hier passiert nichts, wenn ich was eingebe

    End Class
    Das ist auch der falsche Ort, etwas einzugeben.
    Methodenaufrufe musst du in einer Methode plazieren.


    hat es genau getroffen! Ich war so durcheinander und hatte mich in diverse Tutorials verbissen, zig Seiten geöffnet, gelesen, verglichen, das ich nachher schon vollkommen von der Rolle war. In einer Methode funktioniert es... Manchmal braucht man einfach einen Blick über die Schulter um wieder zurück zum Weg zu finden.

    Danke an alle, die geholfen haben, besonders RodfromGermany und ErfinderdesRades.

    Ich schäme mich...

    Nichtheilig

    @Rod: Ja, ich werde mir eine eigene Klasse erstellen. Und wenn .ini geht gucke ich mir noch einmal xml an.

    Nichtheilig schrieb:

    gucke ich mir noch einmal xml an.
    Hier ist ein Beispiel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!