Atelier : Fichiers de configuration
Correction simple.


1
Correction simplifiée :
ce que vous auriez du faire lors de l'Atelier .
Option Explicit

Dim Configuration As String ' La variable principale dans laquelle tout s'effectue

Sub main()
    ' Programme de test
    ChargeConfig
    MsgBox GetValeur("MainFrmBarSettings-Summary", "ScreenCX")
    SetValeur "Autre Rubrique", "ScreenCX", "2560"
    MsgBox GetValeur("MainFrmBarSettings-Summary", "ScreenCX")
    SauveConfig
End Sub

Sub ChargeConfig()
    ' Transfère le contenu du fichier "Chemin"
    ' dans la variable de type string "Configuration"
    Dim f As Integer
    Dim ligne As String
    f = FreeFile
    Open "c:\cdex.ini" For Input As f
    Do Until EOF(f)
        Line Input #f, ligne
        Configuration = Configuration & ligne & vbCrLf
    Loop
    Close f
End Sub

Public Sub SauveConfig()
    ' Sauvegarde la nouvelle configuration
    ' sur le fichier qui a été utilisé dans ChargeConfig
    Dim f As String
    f = FreeFile
    Open "c:\cdex.ini" For Output As f
    Print #f, Configuration
    Close f
End Sub

Function GetValeur(Rubrique As String, MotClé As String) As String
    ' Renvoie la valeur correspondant à la rubrique et au mot-clé passés en paramètre
    Dim PosRubrique As Integer, PosMotClé As Integer
    Dim PosRubriqueSuivante As Integer, PosEgal As Integer, PosCrLf As Integer
    PosRubrique = InStr(1, Configuration, "[" & Rubrique & "]", vbTextCompare)
    If PosRubrique = 0 Then
        GetValeur = "###ERREUR###"
    Else
        PosMotClé = InStr(PosRubrique, Configuration, MotClé & "=", vbTextCompare)
        PosRubriqueSuivante = InStr(PosRubrique, Configuration, vbCrLf & "[")
        If (PosRubriqueSuivante > 0 And PosMotClé > PosRubriqueSuivante) 
           Or PosMotClé = 0 Then
            GetValeur = "###ERREUR###"
        Else
            PosEgal = InStr(PosMotClé, Configuration, "=")
            PosCrLf = InStr(PosMotClé, Configuration, vbCrLf)
            GetValeur = Mid$(Configuration, PosEgal + 1, PosCrLf - PosEgal - 1)
        End If
    End If
End Function

Public Sub SetValeur(Rubrique As String, MotClé As String, Valeur As String)
    ' Modifie la valeur correspondant à la rubrique et au mot-clé passés en paramètre
    Dim PosRubrique As Integer, PosMotClé As Integer
    Dim PosRubriqueSuivante As Integer, PosEgal As Integer, PosCrLf As Integer
    PosRubrique = InStr(1, Configuration, "[" & Rubrique & "]", vbTextCompare)
    If PosRubrique = 0 Then
        ' La rubrique n'existe pas : on l'ajoute à la fin
        Configuration = Configuration & vbCrLf & "[" & Rubrique & "]" & vbCrLf
        Configuration = Configuration & MotClé & "=" & Valeur & vbCrLf
    Else
        PosMotClé = InStr(PosRubrique, Configuration, MotClé & "=", vbTextCompare)
        PosRubriqueSuivante = InStr(PosRubrique, Configuration, vbCrLf & "[")
        If (PosRubriqueSuivante > 0 And PosMotClé > PosRubriqueSuivante) Or PosMotClé = 0 Then
            ' Le mot-clé n'existe pas dans cette rubrique : on l'ajoute à la fin de cette rubrique
            Configuration = Left(Configuration, PosRubriqueSuivante - 1) & vbCrLf & MotClé & "=" 
                            & Valeur & Right(Configuration, Len(Configuration) - PosRubriqueSuivante + 1)
        Else
            PosEgal = InStr(PosMotClé, Configuration, "=")
            PosCrLf = InStr(PosMotClé, Configuration, vbCrLf)
            Configuration = Left(Configuration, PosEgal) & Valeur 
                            & Right(Configuration, Len(Configuration) - PosCrLf + 1)
        End If
    End If
End Sub

Sébastien PASTORE.