Page 1 sur 2
[R] Problème avec _GUICtrlListView_InsertGroup()
Posté : mer. 27 août 2014 14:21
par Hugues
Bonjour,
J'ai un fichier toto.dat avec comme données:
► Afficher le texte
Code : Tout sélectionner
[RIRI];
1; (* Mon Texte RIRI 1 *)
ArgentDePoche-; (* Mon Texte RIRI 2*)
Euros; (* Mon Texte RIRI 3*)
80; (* Mon Texte RIRI 4*)
[FIFI];
\\mondossier\sousdossier\; (* Mon Texte FIFI 1*)
[LOULOU];
FALSE; (* Mon Texte LOULOU 1*)
FALSE; (* Mon Texte LOULOU 2*)
2; (* Mon Texte LOULOU 3*)
Je voudrais insérer le données dans une ListView avec des groupes (correspondant au nom des sections)
C'est à dire:
Dans la colonne de gauche ce qu'il y a à gauche des ";" et dans le colonne de droite ce qui est à droite des ";"
► Afficher le texte
Code : Tout sélectionner
RIRI-----------------------------------------------------------------------------
1 | (* Mon Texte RIRI 1*)
ArgentDePoche- | (* Mon Texte RIRI 2*)
Euros | (* Mon Texte RIRI 3*)
80 | (* Mon Texte RIRI 4*)
FIFI-----------------------------------------------------------------------------
\\mondossier\sousdossier\ | (* Mon Texte FIFI 1*)
LOULOU-----------------------------------------------------------------------------
FALSE | (* Mon Texte LOULOU 1*)
FALSE | (* Mon Texte LOULOU 2*)
2 | (* Mon Texte LOULOU 3*)
Merci par avance...
Ci joint mon code....
► Afficher le texte
Code : Tout sélectionner
_GUICtrlListView_DeleteAllItems($Listview1)
$aIniSectionNames = IniReadSectionNames(@ScriptDir & "\txt\machine.dat")
_GUICtrlListView_EnableGroupView($Listview1, True)
For $i = 1 To $aIniSectionNames[0]
ConsoleWrite($aIniSectionNames[$i] & @CRLF)
_GUICtrlListView_InsertGroup($Listview1, -1, $i, $aIniSectionNames[$i])
_GUICtrlListView_SetItemGroupID($Listview1, $i, $i)
Next
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : mer. 27 août 2014 15:25
par Hugues
Bon j'ai reussi à 90% lol
► Afficher le texte
Code : Tout sélectionner
_GUICtrlListView_DeleteAllItems($Listview1)
$aIniSectionNames = IniReadSectionNames(@ScriptDir & "\txt\machine.dat")
_GUICtrlListView_EnableGroupView($Listview1)
For $i = 0 To $aIniSectionNames[0]
ConsoleWrite($aIniSectionNames[$i] & @CRLF)
_GUICtrlListView_InsertGroup($Listview1, -1, $i, "[" & $aIniSectionNames[$i] & "]")
GUICtrlCreateListViewItem("[" & $aIniSectionNames[$i] & "]" & "|" & $aIniSectionNames[$i], $Listview1)
_GUICtrlListView_SetItemGroupID($Listview1, $i, $i)
Next
Par contre chose étrange, si je met:
Code : Tout sélectionner
_GUICtrlListView_InsertGroup($Listview1, -1, $i, $aIniSectionNames[$i])
au lieu de:
Code : Tout sélectionner
_GUICtrlListView_InsertGroup($Listview1, -1, $i, "[" & $aIniSectionNames[$i] & "]")
Lorsque je lance ma fonction, ça me plante AutoIt... Message d'erreur: AutoIt à cesser de fonctionner...
Quelqu'un aurait une idée?
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 28 août 2014 12:20
par Alaghir
Tu as essayé de stocker ta valeur dans une variable intermédiaire et de remplacer $aIniSectionNames[$i] par celle-ci dans la fonction ? Quel résultat te renvoie ton ConsoleWrite ?
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 28 août 2014 22:43
par Hugues
Salut,
Quand je fais un
, il me retourne bien la valeur de mon SectionName, mais je suis obligé de mettre
ou autre chose dans la fonction pour qu'il me retourne la valeur... Bizarre...
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : ven. 29 août 2014 02:29
par orax
Le problème venait du $i. Le premier groupe qui est inséré avec
For $i = 0... ce n'est pas RIRI mais le chiffre 3. Parce que $aIniSectionNames[0] = 3.
Code : Tout sélectionner
For $i = 1 To $aIniSectionNames[0]
ConsoleWrite($aIniSectionNames[$i] & @CRLF)
_GUICtrlListView_InsertGroup($Listview1, -1, $i, $aIniSectionNames[$i])
GUICtrlCreateListViewItem("[" & $aIniSectionNames[$i] & "]" & "|" & $aIniSectionNames[$i], $Listview1)
_GUICtrlListView_SetItemGroupID($Listview1, $i - 1, $i)
Next
Ce qui faisait planter, c'était _WinAPI_MultiByteToWideChar qui est utilisé plus loin dans la fonction _GUICtrlListView_InsertGroup. Une chaîne (type string) est attendue en argument. Au lieu de ça, avec $i = 0, on a $aIniSectionNames[$i] = 3.
3 est un integer. Par contre
"3" est de type string. Subtile différence. En réalité, il n'y a qu'un type en apparence : le type variant.
Code : Tout sélectionner
_WinAPI_MultiByteToWideChar(3) ; là ça plante !
_WinAPI_MultiByteToWideChar("3")
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : ven. 29 août 2014 13:50
par Hugues
Oki je regarde ça... Maintenant il faut que je recuperer les items de chaque Section lol
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : lun. 01 sept. 2014 15:11
par Hugues
Bon je reviens à la charge...
Yé un pitit soucis avec la récupération de données de mon fichier .dat. Je m'explique j'ai un fichier *.dat qui ressemble presque à un fichier ini, sauf que le séparateur est un ";" au lieu de "=".
Donc vous voyez mon soucis quand je veux récupérer les cléfs et les valeurs associées à chaque Section... car le IniReadSection() ne fonctionne pas...
Je récupère bien le nombre et nom des Sections de mon fichier mais je ne sais pas comment faire...
Si quelqu'un à une idée? Je suis bien preneur... Sachant qu'en plus je voudrais que les clefs soient dans la colonne gauche et les valeurs dans la colonne droite de ma ListView.
Merci par avance.
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : lun. 01 sept. 2014 17:14
par mikell
J'ai pas vraiment suivi les messages précédents, mais en se basant sur le "toto.dat" de ton 1er message voilà un petit outil d'analyse qui pourrait te servir
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
$txt = FileRead(@ScriptDir & "\toto.dat")
$txt = StringReplace($txt, "];", "]")
$keys = StringRegExp($txt, '([\S|\h]+);', 3)
Dim $array[UBound($keys)][3] ; nb lignes = nb total de keys
$k = 0
$contenu_sections = StringRegExp($txt, '(\[[^\[]+)', 3) ; sépare les sections
For $i = 0 to UBound($contenu_sections) - 1 ; pour chaque section
$section = StringRegExp($contenu_sections[$i], '\[([^\]]+)', 3)
$array[$k][0] = $section[0] ; nom section
$keys = StringRegExp($contenu_sections[$i], '([\S|\h]+)\s*;', 3)
$values = StringRegExp($contenu_sections[$i], ';\s*([\S|\h]+)', 3)
For $j = 0 to UBound($keys) - 1 ; pour chaque key
$array[$k+$j][1] = $keys[$j] ; nom key
$array[$k+$j][2] = $values[$j] ; nom value
Next
$k += $j
Next
_ArrayDisplay($array)
Sinon ya la méthode bourrin : tu transformes ton .dat en .ini temporaire pour pouvoir utiliser les fonctions Ini*
Code : Tout sélectionner
$txt = FileRead(@ScriptDir & "\toto.dat")
$txt = StringReplace($txt, "];", "]")
$txt = StringReplace($txt, ";", "=")
FileWrite("temp.ini", $txt)

Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : lun. 01 sept. 2014 20:32
par Hugues
Je préfère rester sur la méthode de lecture seule du fichier ^^.
Par contre j'ai un souci ça plante à ce niveau...
De plus ça me compte pas le nombre de lignes totales de mes fichiers, il m'en manque ^^
Ça doit surement venir des expressions régulières et on est un peu faché
J’essaie de regarder quand même...
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : lun. 01 sept. 2014 23:49
par orax
Il faut qu'il y ait une valeur pour chaque clé. C'est toujours le cas ?
Code : Tout sélectionner
[FIFI];
1; (* Mon Texte LOULOU 3*)
2; <== pas de valeur ici donc ça plante
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : lun. 01 sept. 2014 23:55
par mikell
ça dépend de la construction
réelle de ton fichier
C'est bourrin, une expression régulière, ça réfléchit pas
S'il y a une différence même minime entre la structure du fichier et celle de l'exemple que tu as donné, ça plante
D'où l'intérêt d'avoir le *vrai* contenu pour faire du boulot correct ^^
Edit
par exemple, ce que vient de dire orax

Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : mar. 02 sept. 2014 09:39
par Hugues
Voici un exemple plus concret de mon fichier:
► Afficher le texte
Code : Tout sélectionner
[Section1];
2; (* No [2] *)
Paris; (* Prefix [8] *)
Lyon; (* IPAdress [15] *)
80; (* Virtual, each [2], separated by ","; MAX: 10 v. c. *)
[Section2];
\\Metropole\txt\; (* Path for txt file on Data Server [254] *)
\\Island\csv\pictures\; (* Move Path for Pictures [254] *)
\\Source\data\toto.ini; (* Path for configuration file toto.ini [254] *)
[Section3];
FALSE; (* Miles (FALSE) or KMS (TRUE): FALSE=No, TRUE=Yes *)
FALSE; (* SafetyMode: FALSE=No, TRUE=Yes *)
;
2; (* Offset *)
Désolé de ne pas avoir était plus précis dès le départ...

Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : mar. 02 sept. 2014 15:54
par jguinch
Aussi, ça aurait été bien de créer un topic pour la question du fichier .dat...

Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 04 sept. 2014 11:01
par Hugues
Bien chef!
Je passe donc se sujet en résolu et ouvre un autre post pour la décorticztion de mon fichier dat

Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 04 sept. 2014 11:08
par Hugues
Bon je ré-ouvre ce post car j'ai un soucis au niveau de l'alimentation de ma ListView...
Je ne m'y retrouve pas entre les $iIndex, $iGroupID de mon _GUICtrlListView_InsertGroup() et _GUICtrlListView_SetItemGroupID()...
J'arrive à afficher tout les groupes mais qu'une seule ligne de leur contenu... je pense que cela doit être au niveau des $iIndex, $iGroupID, mais j'ai beau tourner ça dans tout les sens ca m'affiche n'importe quoi?
J'arrive bien à récupérer le nombre de clefs et valeurs contenu dans chaque section, mais je ne comprend pas comment il faut proceder...
Merci par avance pour votre aide.
► Afficher le texte
Code : Tout sélectionner
Func TestLocal()
Local $hFile = FileOpen($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier " & $sFile)
Local $sContent = FileRead($hFile)
FileClose($sContent)
Local $aKeys[1][2], $aExtract, $aSection, $sSectionContent
;Récupération des sections
Local $aSections = StringRegExp($sContent, "(?m)^\[([^\]]+)\][;\h]*", 3)
;_ArrayDisplay($aSections) ;Je récupère bien les valeurs...
_GUICtrlListView_EnableGroupView($Listview1)
For $i = 0 To UBound($aSections) - 1
; Récupération du contenu de chaque section
$aSection = StringRegExp($sContent, "(?s)(?:\R|\A)\[\Q" & $aSections[$i] & "\E\]\N*\R(.*?)(?:\R\[[^\]]+\]|\Z)", 1)
If @error Then ContinueLoop
; Suppression des lignes vides ou qui contiennent uniquement ";"
$sSectionContent = StringRegExpReplace($aSection[0], "(\R;?){2,}", @CRLF)
; Récupération des clés et valeurs
$aExtract = StringRegExp($sSectionContent, "(?m)^([^;]+);\h*(.*)$", 3)
Redim $aKeys[UBound($aExtract) / 2][2]
For $j = 0 To UBound($aExtract) - 1 Step 2
_GUICtrlListView_InsertGroup($Listview1, -1, $i, $aSections[$i])
$aKeys[$j / 2][0] = $aExtract[$j]
$aKeys[$j / 2][1] = $aExtract[$j + 1]
GUICtrlCreateListViewItem($aKeys[$j / 2][0] & "|" & $aKeys[$j / 2][1], $Listview1)
_GUICtrlListView_SetItemGroupID($Listview1, $j, $i)
Next
Next
EndFunc
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 04 sept. 2014 13:43
par jguinch
Et un truc comme ça ?
► Afficher le texte
Code : Tout sélectionner
Func TestLocal()
Local $hFile = FileOpen($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier " & $sFile)
Local $sContent = FileRead($hFile)
FileClose($sContent)
Local $aKeys[1][2], $aExtract, $aSection, $sSectionContent
Local $aGroups[1], $iIndex = 0
;Récupération des sections
Local $aSections = StringRegExp($sContent, "(?m)^\[([^\]]+)\][;\h]*", 3)
;_ArrayDisplay($aSections) ;Je récupère bien les valeurs...
_GUICtrlListView_EnableGroupView($Listview1)
For $i = 0 To UBound($aSections) - 1
_GUICtrlListView_InsertGroup($Listview1, -1, $i, $aSections[$i])
; Récupération du contenu de chaque section
$aSection = StringRegExp($sContent, "(?s)(?:\R|\A)\[\Q" & $aSections[$i] & "\E\]\N*\R(.*?)(?:\R\[[^\]]+\]|\Z)", 1)
If @error Then ContinueLoop
; Suppression des lignes vides ou qui contiennent uniquement ";"
$sSectionContent = StringRegExpReplace($aSection[0], "(\R;?){2,}", @CRLF)
; Récupération des clés et valeurs
$aExtract = StringRegExp($sSectionContent, "(?m)^([^;]+);\h*(.*)$", 3)
For $j = 0 To UBound($aExtract) - 1 Step 2
GUICtrlCreateListViewItem($aExtract[$j] & "|" & $aExtract[$j + 1], $Listview1)
_GUICtrlListView_SetItemGroupID($Listview1, $iIndex, $i)
$iIndex += 1
Next
Next
EndFunc
Re: [..] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 04 sept. 2014 14:02
par Hugues
Heu oui tout à fait un truc comme ça!

Re: [R] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 04 sept. 2014 14:34
par orax

À changer en...
Re: [R] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 04 sept. 2014 15:11
par jguinch
Hugues, compare mon code et le tiens pour comprendre ce qui n'allait pas. Il n'y avait rien de compliqué..
Re: [R] Problème avec _GUICtrlListView_InsertGroup()
Posté : jeu. 04 sept. 2014 16:18
par Hugues
Oui c'est ce que je fais en ce moment
Pourtant le coup de la variable $Index +=1 je l'ai essayé mais ça ne fonctionnait pas chez moi???
Je devais surement mal la positionner au niveau de l'incrémentation...
Bref j'ai passé des heures a y tourner dans tout les sens alors que la solution était si simple...
Par contre $aGroups[1] sert à quoi? A rien je pense...