Forum: PC-Programmierung VB.net INI-Datei auslesen


von Dex D. (dexter)


Lesenswert?

Hallo zusammen

Ich möchte bei einem VB.net projekt die Daten aus einer INI-Datei 
auslesen (Ich weiss, dass diese Variante veraltet ist...!). Wie ich sie 
schreibe, weiss ich, doch habe ich noch nirgends gefunden, wie ich 
geziehlt auslesen kann...

Hoffe ihr könnt mir helfen!

von 900ss (900ss)


Lesenswert?

Wenn Du bis Samstag warten kannst, dann kann ich dir ein Modul geben. 
Komme gerade nicht daran.

Gruß 900ss

von Dex D. (dexter)


Lesenswert?

Das wäre sehr nett. Kann ohne Problem bis Samstag warten.
Vielen Dank schon im voraus!

Gruss Dexter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn Du in VB.Net auch Systemfunktionen aus der Win32-API aufrufen 
kannst, dann kannst Du mit den Win32-API-Funktionen

  ReadPrivateProfileString

und

  ReadPrivateProfileInt

lesend auf *.INI-Dateien zugreifen.

von Stahl Johannes (Gast)


Lesenswert?

Hi,

versucht mal:
Public Declare Function FUN_lngGetPrivateProfileString Lib "kernel32" 
Alias "GetPrivateProfileStringA"(ByVal lpApplicationName As String, 
ByVal lpKeyName As String, ByVal lpDefault As String, ByVal 
lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As 
String) As Integer

Public Function FUN_strReadIniStr(ByVal i_strSection As String, ByVal 
i_strKeyName As String, ByVal i_strDefault As String, ByVal i_strFile As 
String) As String
  Dim lngSize As Integer
        Dim strValue As String = ""

        Try
            If Len(i_strSection) = 0 Then
                'SUB_AddLog("ModSetup.FUN_ReadIniStr() i_strSection is 
empty")
            End If
            If Len(i_strKeyName) = 0 Then
                'SUB_AddLog("ModSetup.FUN_ReadIniStr() i_strKeyName is 
empty")
            End If
            If Len(i_strFile) = 0 Then
                'SUB_AddLog("ModSetup.FUN_ReadIniStr() i_strFile is 
empty")
            End If

            strValue = 
"----------------------------------------------------------------------- 
----"
            lngSize = FUN_lngGetPrivateProfileString(i_strSection, 
i_strKeyName, "", strValue, Len(strValue), i_strFile)

            If lngSize > 0 Then
                strValue = Left(strValue, lngSize)
            Else
                strValue = i_strDefault
                If Len(i_strDefault) > 0 Then
                    'FUN_lngWritePrivateProfileString(i_strSection, 
i_strKeyName, i_strDefault, i_strFile)
                End If

            End If

            FUN_strReadIniStr = strValue

        Catch ex As System.Exception
            'SUB_Fehler(ex)
            Return strValue
        End Try

    End Function

von Dex D. (dexter)


Lesenswert?

Das funktioniert schon sehr gut :D
vielen dank!

Ich habe nur noch eine Frage...:
Ich möchte bei einer ListBox der Index auswählen, welcher als letztes 
ausgewählt wurde. Somit speichere ich den Zahlenwert in einer INI-Datei. 
Beim nächsten start wird die Zahl ausgelesen und der ListBox als 
Selected.Index zugewiesen. Ich habe es so gemacht aber es geht nicht:

        ListBox.SelectedIndex = 
CInt(FUN_lngGetPrivateProfileString(...))

von Severino R. (severino)


Lesenswert?

Dex Dexter wrote:
> ...der ListBox als Selected.Index zugewiesen.
>    ListBox.SelectedIndex = CInt(FUN_lngGetPrivateProfileString(...))

Was jetzt: Selected.Index oder .SelectedIndex ?

Schau doch mal, was FUN_lngGetPrivateProfileString(...) liefert, und was 
CInt() daraus macht.
Und auch was passiert, wenn Du ListBox.SelectedIndex (oder 
Selected.Index ?) direkt eine Zahl zuweist.

von Dex D. (dexter)


Lesenswert?

> Was jetzt: Selected.Index oder .SelectedIndex ?
Macht das einen Unterschied? (bin ziemlich Anfänger...)

> Schau doch mal, was FUN_lngGetPrivateProfileString(...) liefert, und was
> CInt() daraus macht.
Beides liefert den Wert 1, obwohl in der INI eine 0 steht...

> Und auch was passiert, wenn Du ListBox.SelectedIndex (oder
> Selected.Index ?) direkt eine Zahl zuweist.

es ist ListBox.SelectedIndex. Wenn ich 0 zuweise erscheint in der 
Auswahl 3, obwohl die Liste mit "New" geladen wurde.



Noch kurz erklärt wie ich die Liste lade:
Ich habe eine Liste, welche an der Anzahl der Einträge ändern kann. Die 
anzahl der Items habe ich ind die INI-Datei geschrieben. Dabei habe ich 
auch in der INI-Datei unter den Key 1 bis Anzahl Items die Namen der 
Items. So lade ich die Items mit einer For-Schlaufe:

1
        nVersion = CInt(FUN_lngGetPrivateProfileString("operating", "versions", "1", sValue, Len(sValue), Application.StartupPath & "\Settings.ini"))
2
3
        For i As Integer = 1 To nVersion
4
            ListBox.Items.Add(FUN_lngGetPrivateProfileString("operating", i, "", sValue, Len(sValue), Application.StartupPath & "\Settings.ini"))
5
        Next



Beispiel der INI-Datei:
1
[operating]
2
versions=2
3
1=New
4
2=Versuch
5
[select]
6
select=0

von Severino R. (severino)


Lesenswert?

Du hast wohl etwas falsch verstanden.

FUN_lngGetPrivateProfileString() liefert Dir die Länge des gefundenen 
Wertes.
also so verwenden:
nLen = FUN_lngGetPrivateProfileString(...

Der Wert selber steht in sValue, wobei sValue immer maximal lang ist.
Davon musst Du nur die gültigen Zeichen herauslesen:
sValue.Substring(0, nLen)

Ausserdem muss der Schlüssel immer ein String sein, also i.ToString 
statt nur i angeben.

Also:
nLen = CInt(FUN_lngGetPrivateProfileString("operating", "versions", "1", 
_
sValue, Len(sValue), Application.StartupPath & "\Settings.ini"))
nVersion = CInt(sValue.Substring(0, nLen))

Im Loop:
nLen = FUN_lngGetPrivateProfileString("operating", i.ToString, "", _
sValue, Len(sValue), Application.StartupPath & "\Settings.ini")
ListBox.Items.Add(sValue.Substring(0, nLen))

sValue muss so definiert werden:
Dim sValue As String = "                       " 'genügend Platz

von Dex D. (dexter)


Lesenswert?

Jetzt macht das ganze langsam Sinn :D
Vielen Dank für eure Hilfe. Momentan habe ich den Durchblick.
Melde mich wieder wenn ich anstehe...

@900ss D.
Wenn es möglich ist, wäre ich trotzdem froh um dein Modul.

von 900ss (900ss)


Lesenswert?

Dex Dexter wrote:

> @900ss D.
> Wenn es möglich ist, wäre ich trotzdem froh um dein Modul.

So ein Mist, es war wohl etwas früh en morgen. Ich habe solch ein Modul 
für C# und nicht für VB.NET. Sorry, dass ich dir da Hoffnung gemacht 
habe.
grummel

Gruß 900ss

von Dex D. (dexter)


Lesenswert?

> Sorry, dass ich dir da Hoffnung gemacht
> habe.
Halb so schlimm! Habe ja jetzt eine Möglichkeit, die funktioniert! ;)
nochmals vielen Dank an alle!

Gruss Dexter

von Gast (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.