Effacer ligne dans un .ini

Résolu
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010 - 6 août 2006 à 10:27
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 6 août 2006 à 22:47
Bonjour,

J'ai une list que je rempli avec une partie d'un fichier .ini dont voici le code :
i = 0
Open App.Path & "\config.ini" For Input As #1
     Do While Not EOF(1)
          i = i + 1
          Line Input #1, lig
          If i > 8 Then
            List1.AddItem lig
          End If
     Loop
Close #1

Comment effacer une ligne qui est intercalée entre deux, et que la ligne qui la suivait prenne sa place. (donc ne pas avoir de trous dans le fichier.

Merci d'avance
@+++
marcod59

18 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 22:23
Arf, j'ai du mal !!

ReDim MesHuitDonnees(1 To 8) As String

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 10:36
Salut,

Je pense que l'ideal serait de lire l'ensemble des lignes et de les placer dans une Collection.

Depuis la collection, fait un Remove de l'Item (Ligne) voulu et replace toutes tes données de la collection dans ton *.ini

++
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
6 août 2006 à 11:32
Salut,


Excuse-moi, mais qu'entends-tu par collection. Je débute en programmation et ne connais pas tout. Merci

@+++
marcod59
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 11:59
8Une collection c'est pour y placer des Items (donc ici, par exemple, tes lignes du fichier ini).

Cela se déclare comme ceci :

Dim MesDonnees As New Collection
Dim i As Long
Dim lig As String

i = 0
Open App.Path &"\config.ini" For Input As #1
Do While Not EOF(1)
i = i + 1
Line Input #1, lig
MesDonnees.Add lig 'rajoute cette ligne
If i > 8 Then
List1.AddItem lig
End If
Loop
Close #1

Puis,

Sub Reecriture_Ini()
Dim i As Long

MesDonnees.Remove NomDeTaForm.List1.ListIndex + 1

Open App.Path &"\config.ini" For Output As #ff
For i = 1 To MesDonnees.Count
Print #ff, MesDonnees(i)
Next i
Close #ff

End Sub

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 12:44
Dans la procédure, j'ai omis de mettre Item :

remplace
Print #ff, MesDonnees(i)
par
Print #ff, MesDonnees.Item(i)

++
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
6 août 2006 à 21:10
Lorsque je lance la fonction Reecriture_Ini ça se plante sur la ligne Open, et le message d'erreur et le suivant :  Erreur d'exécution '52'.  Nom de fichier ou numéro de fichier incorrect.
Le nom etant correct, cela doit être le numéro, et lorsque je fait un débogage i a la valeur 0 et ListIndex la valeur de 1. Par contre, #ff n'a aucun numéro, est-ce que ça vient de lui ?

@+++
marcod59
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 21:22
Alors essaie comme ceci :

<small>
Coloration syntaxique automatique </small>
Sub Reecriture_Ini() 
    Dim Item 

MesDonnees.Remove NomDeTaForm.List1.ListIndex + 1 
' *** pense ici à remplacer NomDeTaForm

Open App.Path &"\config.ini" For Output As #1 
    For Each Item In MesDonnees 
      Print #1, Item 
    Next Item 
Close #1 

Set MesDonnees = Nothing 

End Sub

<small>
Coloration syntaxique automatique </small>

Ps : ce n'est pas une fonction mais une procédure.

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 21:25
Ah, et je précise qu'il faut déclarer 'Dim MesDonnees As New Collection' dans les déclarations (tout en haut, au dessus de toutes tes procédures)

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
6 août 2006 à 21:32
Entre temps j'ai essayé ta 1ère procédure avec #1, et j'ai eu le même résultat qu'avec la nouvelle. Cela m'efface la deuxième ligne, alors que j'aimerais effacer la ligne que je selectionne dans la List1 qui sera toujours une ligne supérieure à 8 d'où le If i > 8 Then.
A oui, ta procédure je l'ai mise dans Private Sub List1_Click(). J'ai supposé que c'était là ou il était le mieux.

@+++
marcod59
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 21:39
je t'ai fait une modif (la première ligne) :

<small> Coloration syntaxique automatique </small>
Sub Reecriture_Ini()
' *** rajoute cette ligne
If List1.ListCount < 9 Then MsgBox "Pas assez de données": Exit Sub

    Dim Item 

MesDonnees.Remove NomDeTaForm.List1.ListIndex + 1 
' *** pense ici à remplacer NomDeTaForm

Open App.Path &"\config.ini" For Output As #1 
    For Each Item In MesDonnees 
      Print #1, Item 
    Next Item 
Close #1 

Set MesDonnees = Nothing 

End Sub

<small> Coloration syntaxique automatique </small>

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
6 août 2006 à 21:44
Idem, il m'efface toujours la 2ème ligne du fichier. Comme je ne met pas tout le fichier dans le List1, n'est-ce pas la raison ?

@+++
marcod59
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 21:49
Mais en fait je visualise pas trop
Peux tu me donner plus de precisions, comme
* Combien doit il y avoir de données au minimum dans la List1 pour lancer l'éffacement ;
* Le premier élément de la List1, correspond à quelle ligne du fichier .ini ;
* Tu dis "il m'efface toujours la 2ème ligne du fichier", qu'aurais tu aimé qu'il fasse ?

Merci

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
6 août 2006 à 22:00
Les 8 premières lignes servent à autre chose, et je ne les affiche pas. Donc, j'affiche dans la List1 à partir de la ligne 9, et je voudrais mettre ou enlever les données comme je le souhaite.


Par contre en écrivant ce message, je viens de me dire que pour simplifier la chose je n'avais qu'à créer un autre fichier où il n'y aurait que ces données. Qu'en penses-tu ? Ou as-tu la solution avec un seul fichier ?


@+++
marcod59
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 22:20
Alors essaie ceci (cette fois, ça devrait être bon, ou pas loin, ) :

<small> Coloration syntaxique automatique </small>
Dim MesDonnees         As New Collection
Dim MesHuitDonnees   As String()
' *** ^^ ces 2 variables sont à placer dans les déclarations

Dim i          As Long
Dim lig        As String

i = 0
Open App.Path &"\config.ini" For Input As #1
     Do While Not EOF(1)
          i = i + 1
          Line Input #1, lig
          If i > 8 Then
              MesDonnees.Add lig
              List1.AddItem lig
          Else
              MesHuitDonnees(i) = lig
          End If
     Loop
Close #1

Sub Reecriture_Ini() 
    Dim Item 
    Dim i         As Byte

MesDonnees.Remove NomDeTaForm.List1.ListIndex + 1 
' *** pense ici à remplacer NomDeTaForm

Open App.Path &"\config.ini" For Output As #1

    For i = 1 To 8
        Print #1, MesHuitDonnees(i)
    Next i

   For Each Item In MesDonnees 
      Print #1, Item 
    Next Item 
Close #1 

Set MesDonnees = Nothing 

End Sub

<small> Coloration syntaxique automatique </small>

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 22:22
Oups, vite vite, une petite correction (au début :

Dim MesDonnees         As New Collection
Dim MesHuitDonnees   As String()
' *** ^^ ces 2 variables sont à placer dans les déclarations
Dim i                                 As Long
Dim lig                              As String
ReDim MesHuitDonnees   As String(1 To 8) ' *** j'ai omis cette ligne

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
6 août 2006 à 22:30
J'ai une erreur  Indice en dehors de la plage sur la ligne MesHuitDonnees(i) = lig et la valeur de i et  1

@+++
marcod59
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
6 août 2006 à 22:43
Ne tiens pas compte de mon dernier message, je n'avais pas encore eu tes 2 autres modifs. Maintenant ça fonctionne très bien.
Je te remercie pour ta patience et tes compétences et te souhaite une bonne nuit et de bonnes vacances si tu y es.

@+++
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 22:47
Pas de problème et merci !

Bonne soirée et bonnes vacances (moi non ) !

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
Rejoignez-nous