Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lire un fichier .ini et le placer dans un tableau

3 réponses
Avatar
Raymond Fournier
Bonjour a tous,
Je sais lire un fichier .ini et le placer dans un tableau. Mon fichier .ini
a des clés qui posède des items séparer par des "/". le nbr items varie pour
caque clé

ex:
[Epicerie1]
sRanger1=Fruits

sRanger2=Pate a pizza/Saucisse hot dog/Bacon/creton/salade en pot/pogo

sRanger3=Croustille/Biscuit en vrack/Pain tout genre/Tortillase/Gateau en
Boite/Gateau congeler

sRanger4=Viande/Poisson congelé/Sausice B.F./Lait/oeufs

sRanger5=Fruit en conserve/Barre tendre/Confiture/Nutella/Beurre de
peanotte/Thé - tisane - café/Gruau/céréalesItem8=Beurre

etc....

J'utilise se code pour lire le fichier:
Private Sub AfficherFlexRangerEpicerie(iNoEpicerie As Integer)

Dim sTabNbrRangerEpicerie() As String
Dim iNoRangerEpicerie As Integer
Dim sTabItemRanger() As String
Dim iNbrItem As Integer
Dim i As Integer
Dim j As Integer

'Lie le nbr de clé pour cette épicerie.
sTabNbrRangerEpicerie = Split(modFichierINI.GetIniKeys(App.Path &
"\RangerEpicerie.ini", _
"Epicerie" & iNoEpicerie - 1), vbNullChar)

'Redimentionne le tableau qui aura les itemes des ranges.
ReDim sTabRangerEpicerie(UBound(sTabNbrRangerEpicerie) + 1, 0)


For iNoRangerEpicerie = LBound(sTabNbrRangerEpicerie) + 1 To
UBound(sTabNbrRangerEpicerie) + 1
'Lie les items d'une ranger.
sTabItemRanger = Split(modFichierINI.GetIniEntry(App.Path &
"\RangerEpicerie.ini", _
"Epicerie" &
iNoEpicerie - 1, _
"sRanger" &
iNoRangerEpicerie, ""), _
"/")

'Place les items dans le tableau sTabRangerEpicerie visa-vi cette
ranger.
For iNbrItem = LBound(sTabItemRanger) To UBound(sTabItemRanger)
sTabRangerEpicerie(iNoRangerEpicerie, iNbrItem) =
sTabItemRanger(iNbrItem)
'Si la ranger a plus d'items que le tableau peu contenir,
ajuster le sTabRangerEpicerie.
If UBound(sTabItemRanger) > UBound(sTabRangerEpicerie, 2) Then
ReDim Preserve
sTabRangerEpicerie(UBound(sTabRangerEpicerie), UBound(sTabItemRanger) + 1)
End If
Next iNbrItem
Next iNoRangerEpicerie


'Lire le tableau et l'afficher.
For i = LBound(sTabRangerEpicerie, 1) + 1 To UBound(sTabRangerEpicerie, 1)
j = 0
Do Until sTabRangerEpicerie(i, j) = ""
Debug.Print sTabRangerEpicerie(i, j)
j = j + 1
Loop
Debug.Print
Next i

End Sub

Mon problème est que lorsque je redimensionner mon tableau je me ramasse
avec des espaces non utiliser sur les lignes qui on moins d'items que la plus
grande ligne du tableau. Est correct ou on peu faire mieux. Si quelqu'un
pourrait me mettre sur une piste.

Merci. Raymond Fournier.

3 réponses

Avatar
Picalausa François
Hello,

En fonction de l'espace mémoire que tu t'autorise à occuper, ce peut ou non
être une bonne solution. Ce qui est certain c'est que dans ce genre de
tableaux, l'accès aux éléments est très rapide (par contre les
redimensionnements successifs le sont moins).

Pour accélérer, tu peux déjà sortir:
If UBound(sTabItemRanger) > UBound(sTabRangerEpicerie, 2) Then
ReDim Preserve
sTabRangerEpicerie(UBound(sTabRangerEpicerie), UBound(sTabItemRanger) + 1)
End If
De ta boucle (le mettre devant), puisqu'il ne dépend pas de iNbrItem

Pour éviter le gaspillage mémoire, puisque tes données sont de toutes façons
tassées à gauche, tu peux employer des tableaux de tableaux:
Option Explicit

Private Type Vector
Data() As String
End Type

Private Sub Form_Load()
Dim Vectors() As Vector
Dim i As Long
Dim j As Long

'Remplissage manuel du tableau
ReDim Vectors(2)

'Des données de bases
ReDim Vectors(0).Data(2)
Vectors(0).Data(0) = "a"
Vectors(0).Data(1) = "b"
Vectors(0).Data(2) = "c"

'Dimension différente
ReDim Vectors(1).Data(1)
Vectors(1).Data(0) = "d"
Vectors(1).Data(1) = "e"

'usage de with et taille différente
ReDim Vectors(2).Data(3)
With Vectors(2)
.Data(0) = "f"
.Data(1) = "g"
.Data(2) = "h"
.Data(3) = "i"
End With

'Affiche les données
For i = LBound(Vectors) To UBound(Vectors)
For j = LBound(Vectors(i).Data) To UBound(Vectors(i).Data)
Debug.Print Vectors(i).Data(j);
Next
Debug.Print
Next i
End Sub

Le temps d'accès sera un peu plus long que dans le cas précédent, mais en
stoquant les références au vecteur (ou en employant with, ce qui revient au
même), on n'a plus qu'un coût fixe assez faible.

--
Picalausa François

"Raymond Fournier" <Raymond a écrit dans
le message de news:
Bonjour a tous,
J'utilise se code pour lire le fichier:
Private Sub AfficherFlexRangerEpicerie(iNoEpicerie As Integer)


...
Mon problème est que lorsque je redimensionner mon tableau je me ramasse
avec des espaces non utiliser sur les lignes qui on moins d'items que la
plus
grande ligne du tableau. Est correct ou on peu faire mieux. Si quelqu'un
pourrait me mettre sur une piste.


Avatar
Raymond Fournier
Merci François,
Je ne savais pas con pouvais faire un tableau dans un tableau. Je vais
utiliser cette façon de prodèder.

Merci Raymond Fournier

"Picalausa François" wrote:

Hello,

En fonction de l'espace mémoire que tu t'autorise à occuper, ce peut ou non
être une bonne solution. Ce qui est certain c'est que dans ce genre de
tableaux, l'accès aux éléments est très rapide (par contre les
redimensionnements successifs le sont moins).

Pour accélérer, tu peux déjà sortir:
If UBound(sTabItemRanger) > UBound(sTabRangerEpicerie, 2) Then
ReDim Preserve
sTabRangerEpicerie(UBound(sTabRangerEpicerie), UBound(sTabItemRanger) + 1)
End If
De ta boucle (le mettre devant), puisqu'il ne dépend pas de iNbrItem

Pour éviter le gaspillage mémoire, puisque tes données sont de toutes façons
tassées à gauche, tu peux employer des tableaux de tableaux:
Option Explicit

Private Type Vector
Data() As String
End Type

Private Sub Form_Load()
Dim Vectors() As Vector
Dim i As Long
Dim j As Long

'Remplissage manuel du tableau
ReDim Vectors(2)

'Des données de bases
ReDim Vectors(0).Data(2)
Vectors(0).Data(0) = "a"
Vectors(0).Data(1) = "b"
Vectors(0).Data(2) = "c"

'Dimension différente
ReDim Vectors(1).Data(1)
Vectors(1).Data(0) = "d"
Vectors(1).Data(1) = "e"

'usage de with et taille différente
ReDim Vectors(2).Data(3)
With Vectors(2)
.Data(0) = "f"
.Data(1) = "g"
.Data(2) = "h"
.Data(3) = "i"
End With

'Affiche les données
For i = LBound(Vectors) To UBound(Vectors)
For j = LBound(Vectors(i).Data) To UBound(Vectors(i).Data)
Debug.Print Vectors(i).Data(j);
Next
Debug.Print
Next i
End Sub

Le temps d'accès sera un peu plus long que dans le cas précédent, mais en
stoquant les références au vecteur (ou en employant with, ce qui revient au
même), on n'a plus qu'un coût fixe assez faible.

--
Picalausa François

"Raymond Fournier" <Raymond a écrit dans
le message de news:
> Bonjour a tous,
> J'utilise se code pour lire le fichier:
> Private Sub AfficherFlexRangerEpicerie(iNoEpicerie As Integer)
....
> Mon problème est que lorsque je redimensionner mon tableau je me ramasse
> avec des espaces non utiliser sur les lignes qui on moins d'items que la
> plus
> grande ligne du tableau. Est correct ou on peu faire mieux. Si quelqu'un
> pourrait me mettre sur une piste.





Avatar
Utilisation de la fonction GetPrivateProfileString de l'API Windows... C'est
fait pour ;o)

-Thierry-

"Raymond Fournier" <Raymond a écrit dans
le message de news:
Bonjour a tous,
Je sais lire un fichier .ini et le placer dans un tableau. Mon fichier


.ini
a des clés qui posède des items séparer par des "/". le nbr items varie


pour
caque clé

ex:
[Epicerie1]
sRanger1=Fruits

sRanger2=Pate a pizza/Saucisse hot dog/Bacon/creton/salade en pot/pogo

sRanger3=Croustille/Biscuit en vrack/Pain tout genre/Tortillase/Gateau en
Boite/Gateau congeler

sRanger4=Viande/Poisson congelé/Sausice B.F./Lait/oeufs

sRanger5=Fruit en conserve/Barre tendre/Confiture/Nutella/Beurre de
peanotte/Thé - tisane - café/Gruau/céréalesItem8¾urre

etc....

J'utilise se code pour lire le fichier:
Private Sub AfficherFlexRangerEpicerie(iNoEpicerie As Integer)

Dim sTabNbrRangerEpicerie() As String
Dim iNoRangerEpicerie As Integer
Dim sTabItemRanger() As String
Dim iNbrItem As Integer
Dim i As Integer
Dim j As Integer

'Lie le nbr de clé pour cette épicerie.
sTabNbrRangerEpicerie = Split(modFichierINI.GetIniKeys(App.Path &
"RangerEpicerie.ini", _
"Epicerie" & iNoEpicerie - 1), vbNullChar)

'Redimentionne le tableau qui aura les itemes des ranges.
ReDim sTabRangerEpicerie(UBound(sTabNbrRangerEpicerie) + 1, 0)


For iNoRangerEpicerie = LBound(sTabNbrRangerEpicerie) + 1 To
UBound(sTabNbrRangerEpicerie) + 1
'Lie les items d'une ranger.
sTabItemRanger = Split(modFichierINI.GetIniEntry(App.Path &
"RangerEpicerie.ini", _
"Epicerie" &
iNoEpicerie - 1, _
"sRanger" &
iNoRangerEpicerie, ""), _
"/")

'Place les items dans le tableau sTabRangerEpicerie visa-vi cette
ranger.
For iNbrItem = LBound(sTabItemRanger) To UBound(sTabItemRanger)
sTabRangerEpicerie(iNoRangerEpicerie, iNbrItem) > sTabItemRanger(iNbrItem)
'Si la ranger a plus d'items que le tableau peu contenir,
ajuster le sTabRangerEpicerie.
If UBound(sTabItemRanger) > UBound(sTabRangerEpicerie, 2) Then
ReDim Preserve
sTabRangerEpicerie(UBound(sTabRangerEpicerie), UBound(sTabItemRanger) + 1)
End If
Next iNbrItem
Next iNoRangerEpicerie


'Lire le tableau et l'afficher.
For i = LBound(sTabRangerEpicerie, 1) + 1 To


UBound(sTabRangerEpicerie, 1)
j = 0
Do Until sTabRangerEpicerie(i, j) = ""
Debug.Print sTabRangerEpicerie(i, j)
j = j + 1
Loop
Debug.Print
Next i

End Sub

Mon problème est que lorsque je redimensionner mon tableau je me ramasse
avec des espaces non utiliser sur les lignes qui on moins d'items que la


plus
grande ligne du tableau. Est correct ou on peu faire mieux. Si quelqu'un
pourrait me mettre sur une piste.

Merci. Raymond Fournier.