Fichier ini et variables

Signaler
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 mars 2016
-
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
-
Bonjour,

en général dans mes programmes je stock différentes variables (paramètres, valeur en cours pour recup en cas de plantage, position de fenêtres ... ) dans un fichier *.ini
Pour récupérer les variables je charge chaque variable avec une fonction getini("section","variable" ...)
Existe-t-il une astuce pour faire une boucle de récupération des variables. Sachant que le champ "variable" dans le fichier ini contient le nom de ma variable j'avais pensé a du wscript control mais ça marche pas.
La fonction ebExecuteLine semblait prometeuse mais ne marche pas en compilé...

Si vous avez des astuces?

Merci

Got

9 réponses

Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
9
Bonjour,

As-tu essayé de lire ton fichier .INI en utilisant non plus les API mais le File System Object (et traiter ton fichier comme un vulgaire fichier texte). Ceci dit ce n'est pas top car le FSO est passablement lent.

De plus les .INI sont dépassées et remplacé par la base de registre.
Où une table de paramètres dans ta base de données.


Calade
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
15 novembre 2018

perso j'utilise les API:

    'lit fichier ini (param = section clef chemin)
    Private Declare Function GetPrivateProfileString 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

    'ecrit dans fichier ini (param = section clef chemin)
    Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
            (ByVal lpApplicationName As String, _
            ByVal lpKeyName As String, _
            ByVal lpString As String, _
            ByVal lpFileName As String) As Integer

    'liste toutes les section d'un fichier ini
    Private Declare Function GetPrivateProfileSectionNames Lib "kernel32.dll" Alias "GetPrivateProfileSectionNamesA" _
            (ByVal lpszReturnBuffer As String, _
            ByVal nSize As Integer, _
            ByVal lpFileName As String) As Integer

    'liste toutes les clef d'une section
    Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" _
            (ByVal lpAppName As String, _
            ByVal lpReturnedString As String, _
            ByVal nSize As Integer, _
            ByVal lpFileName As String) As Integer

    'pour suprimer une section d'un fichier ini
    Private Declare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" ( _
                ByVal lpAppName As String, _
                ByVal lpString As String, _
                ByVal lpFileName As String) As Integer


exemple:
pour lire une valeur:
 Public Function LitDansFichierIni(ByVal Section As String, _
                                      ByVal Cle As String, _
                                      ByVal nom_fichier_ini As String) As String

        'varriable de retour pour la valeur de la clef
        Dim strReturn As String = New String(Chr(0), 20000)

        'lecture du fichier ini et remplissage de la valeur de la clef
        GetPrivateProfileString(Section, Cle, "", strReturn, Len(strReturn), nom_fichier_ini)

        'fin de fonction assignation de la valeur de la clef a litdansfichierini
        Return Left(strReturn, InStr(strReturn, Chr(0)) - 1)

    End Function


Pour ecrir une valeur:
    Public Function EcritDansFichierIni(ByVal Section As String, _
                                        ByVal Cle As String, _
                                        ByVal valeur As String, _
                                        ByVal nom_fichier_ini As String) As Boolean

            'si nothing est passe comme param a valeur alors la clef est supprimer du fichier
            'si la section la clef ou le fichier ini n'existe pas l'api se charge de les créer.
            'ecriture dans in fichier du type ini a la section et clef passer en param
            Return WritePrivateProfileString(Section, Cle, valeur, nom_fichier_ini)

    End Function


Pour lister les sections du fichier:
    Public Function ListeSectionIni(ByVal nom_fichier_ini As String) As String()


            'strReturn est une varriable qui contient tout le contenu du fichier ini
            Dim strReturn As String = New String(Chr(0), 20000)

            'liste les section dans strReturn
            GetPrivateProfileSectionNames(strReturn, Len(strReturn), nom_fichier_ini))

            'decoupe strReturn et palce les sections dans le retour de fonction
            Return Split(Left(strReturn, InStr(1, strReturn, vbNullChar & vbNullChar) - 1), vbNullChar)

   End Function
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
9
Bonjour,

Je pense que j'avais mal lu ta question. Qu'entends-tu par "faire une boucle" ?
De plus tu dis avoir essayé , as-tu été voir sur Internet l'une des discussions à ce sujet , je n'ai pas lu jusqu'au bout, mais on dirait qu'ils ont trouvé un compromis.

Bonne chance

Calade
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 mars 2016

Oui j'etait tombé sur ce thread mais pas de solutions pour le mode compilé.

en gros faire une boucle se serait :

[section]
item1=12
item2=test

une boucle capable de scanner le fichier ini et récupérer item1 et item2 directement dans le code. mais sans faire une lecture de chaque "item". C'est ce que je fait actuellement et ça marche tres bien. Mais à chaque fois que j'ai une nouvelle variable a sauvegarder je dois aussi gérer une ligne pour sa recuperation. je cherchais un moyen de gagner du temps(de codage) sur cette étape.
Mais bon j'ai l'impression que c'est pas gagné ;-)

Merci pour vos participations...
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
9
Je pense avoir compris ce que tu veux faire. Mais à ma connaissance les macros au sens DBase/Clipper du terme ne sont pas supportés par VB malheureusement.

Une idée qui me vient comme ça, je te la livres brut de décoffrage sans rien avoir teste.
Oublie les API et ouvres ton fichier .INI avec FSO, lis le ligne par ligne et essaie une boucle du style:

dim X as Integer

do while not EOF (enfin l'équivalent en FSO que je connais très peu)
   X=X+1
   Lire ligne et récupérer dans un tableau
   ex: Tableau(X)=split(maligne,"=")(1)
   Attention, la ligne ci-dessus risque de planter s'il n'y a pas de valeur après le signe =.
loop


En espérant que cela puisse t'aider.

Calade
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 mars 2016

yes ;-)
j'ai bien pensé a mettre tout ça dans uin tableau. mais toutes les variables existe et pour la lisibilité du code avoir qu'un tableau plutot que des variables avec un nom évocateur c'est pas cool...

Merci quand meme ;-)
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
9
Tout à fait d'accord d'autant plus que je ne suis pas un grand fan des tableaux. Même s'ils restent pratiques dans certains cas, leur utilisation est lourde... au point que je me suis développé mon propre système de stockage à base de recordset déconnecté.

Pour en revenir à ton problème, j'avoue que je ne vois pas d'autre solutions. Dès que j'aurais un moment, je chercherais une solution, mais cela ne sera pas aujourd'hui car j'ai un autre problème sur les bras.

De ton côté, si tu trouves une piste, dis-le moi cela m'intéresse.


Calade
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 mars 2016

ok :-)
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
9
Ton histoire m'a furieusement rappelé les macros à la mode Clipper (langage que je regrette par moment, surtout de n'avoir pas essayé la version Windows) et sa fonction Eval.

Du coup je me suis souvenu avoir vu passer brièvement une telle fonction sur ce site, mais à l'époque je n'y avais pas prêté attention.

Va voir ce lien tu y trouveras peut-être ton bonheur.

Sinon, il existe une fonction Eval() en Javascript (l'exemple du MSDN est pile poil ton problèmes. Reste plus qu'à trouver le moyen d'exécuter du Java sous VB6 !!!


Calade