Page 1 sur 1
[R] Lecture fichier txt dans GUICtrlCreateList + sauvegarde
Posté : sam. 19 févr. 2011 10:15
par pierrotm777
Bonjour,
J'essaie de lire un fichier texte dans une 'GUICtrlCreateList'.
J'ai trouvé sur le forum un petit script qui me semble sympa , que j'ai essayé d'adapter à mon besoin.
Mon problème est qu'il semble que seul la première ligne est lue et répétée.
Je souhaite une mise à jour régulière de la liste ligne par ligne .
Voici donc mon code:
► Afficher le texte
Code : Tout sélectionner
#include <File.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <ListboxConstants.au3>
Dim $ReadDSLog
Dim $DebugGUIStatus
;GUI de debug
$DebugGUI = GUICreate("IcarDS Skinner Tool7", 500, 603, -1, -1)
$LiveDebugLog = GUICtrlCreateButton("Live Debug Log", 105, 5, 100, 25)
$DebugWindow = GUICtrlCreateList("",8, 60, 482, 478, BitOR($LBS_SORT,$LBS_DISABLENOSCROLL,$LBS_STANDARD,$WS_HSCROLL,$WS_VSCROLL,$WS_BORDER))
$SaveDebugWindow = GUICtrlCreateButton("Save", 430, 535, 60, 30)
$DebugGUIStatus = False
GUISetState()
AdlibRegister("dslogupdate")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $LiveDebugLog
$DebugGUIStatus = true
Case $SaveDebugWindow
FileSaveDialog( "Save DS Skin Tool Log", @MyDocumentsDir, "Text files (*.txt)", 16,"DSSkin Tool Log")
GUICtrlRead($DebugWindow)
EndSwitch
Wend
Func DsLogUpdate()
If $DebugGUIStatus = True Then
local $line
$file = FileOpen("c:\dslog2.txt", 0)
$line &= FileReadLine($file) & '|'
FileClose($file)
GUICtrlSetData($DebugWindow, $line)
EndIf
EndFunc
Merci de votre aide par avance
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : sam. 19 févr. 2011 10:32
par pierrotm777
Oops,
j'ai trouvé mon premier problème:
Code : Tout sélectionner
Func DsLogUpdate()
If $DebugGUIStatus = True Then
local $line
$file = FileOpen("c:\dslog2.txt", 0)
[color=#FF0000] While 1
$line &= FileReadLine($file) & '|'
If @error = -1 Then ExitLoop
WEnd[/color]
FileClose($file)
GUICtrlSetData($DebugWindow, $line)
EndIf
EndFunc
Résolu en ajoutant la boucle while
Mais la lecture est trés longue, de plus j'aimerais voir toujours la fin du fichier , non le début !
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : sam. 19 févr. 2011 10:34
par Laddy
Bonjour
je pense que tu dois mettre ton résultat dans un tableau.
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : sam. 19 févr. 2011 11:10
par pierrotm777
Alors , j'ai essayé ça:
Code : Tout sélectionner
Func DsLogUpdate()
If $DebugGUIStatus = True Then
Local $x, $aRecords
If Not _FileReadToArray("c:\dslog2.txt",$aRecords) Then
MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
Exit
EndIf
For $x = 1 to $aRecords[0]
GUICtrlSetData($DebugWindow, $aRecords[$x])
If $DebugGUIStatus = False Then ExitLoop
Next
EndIf
EndFunc
mais on dirait qu'il relit toujours la même chose, et trop vite
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 11:26
par Laddy
Bonjour
j'ai tenté de relire ce que tu voulais, et je pense que j'ai pas compris tu veux lister toutes les lignes dans ta listbox en commençant par la fin ?
Si oui
voici un code qui le permet
► Afficher le texteLister fichier dans une listeview
Code : Tout sélectionner
;Code ZeShrek , l'orgre vert, adapté par Laddy
#include <GUIConstantsEx.au3>
#include <ListBoxConstants.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListboxConstants.au3>
Opt("GUIDataSeparatorChar", Chr(0))
Dim $ReadDSLog
Dim $DebugGUIStatus
Global $LineNb, $LineTab, $line
;GUI de debug
$DebugGUI = GUICreate("IcarDS Skinner Tool7", 500, 603, -1, -1)
$LiveDebugLog = GUICtrlCreateButton("Live Debug Log", 105, 5, 100, 25)
$DebugWindow = GUICtrlCreateListView("Line", 8, 60, 482, 478, $LVS_SORTDESCENDING)
GUICtrlSendMsg($DebugWindow, $LVM_SETCOLUMNWIDTH, 0, 768)
$SaveDebugWindow = GUICtrlCreateButton("Save", 430, 535, 60, 30)
GUISetState()
DsLogUpdate()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $LiveDebugLog
$DebugGUIStatus = True
Case $SaveDebugWindow
FileSaveDialog("Save DS Skin Tool Log", @MyDocumentsDir, "Text files (*.txt)", 16, "DSSkin Tool Log")
GUICtrlRead($DebugWindow)
EndSwitch
WEnd
Func DsLogUpdate()
$file = FileOpen("c:\dslog2.txt", 0)
Dim $LineTab[1] ; on crée un tableau pour stocker les lignes
$LineNb = 0
While 1 ; donc on fait une boucle
$line = FileReadLine($file) ; ou on lit une ligne
If @error = -1 Then ExitLoop ; si y a une erreur c'est qu'on est a la fin du fichier
If $line <> "" Then
$LineNb = $LineNb + 1 ; on incrémente le compteur
ReDim $LineTab[$LineNb + 1] ; comme on ne sait pas combien il y a de lignes, on redimentionne le tableau ou on les stocke
$LineTab[$LineNb] = GUICtrlCreateListViewItem($line, $DebugWindow) ; et on injecte la ligne dans la liste
EndIf
WEnd
EndFunc
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 11:49
par pierrotm777
Oui , c'est bien ça, mais il semble que je me retrouve 2 fois avec la même ligne lue à chaque fois !
Est-il possible d'avoir entre chaque ligne lue , un - par exemple
Est-il possible que le curseur vertical reste toujours en bas afin de pouvoir lire non pas le début mais la fin du fichier .
Le fichier dslog.txt est mis à jour à peu prés toutes les deux secondes, est-il possible de mettre à jour la liste tout en restant donc en bas du fichier ?
Merci par avance de votre aide !
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 12:00
par Laddy
Re,
Mon exemple affiche la fin du fichier en haut de la Gui et non en bas de la gui
quelle est la structure de ton fichier exactement ? peux tu le mettre à disposition ?
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 12:07
par pierrotm777
Bien sure

Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 12:16
par Laddy
Question : y a combien de ligne qui se mette à jour toutes les x secondes ??
vu le nombre de ligne c'est normal qu'il mette du temps à indexer toutes les lignes, la première fois.
Sinon pour le reste, ce n'est pas de mon niveau, désolé
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 12:40
par pierrotm777
Merci tout de même
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 12:49
par GaRydelaMer
Bonjour
si je comprends bien, tu voudrais afficher dans une Liste, le résultat d'un fichier "log".
Je ferais comme ca moi.
1/ je récupère le nombre de ligne du fichier
Code : Tout sélectionner
#Include <File.au3>
Local $count = _FileCountLines($sFilePath)
2/ je vérifie si il y a une nouvelle ligne en comparant le nombre de ligne avec le nombre d'élément de la liste
si il y a des lignes en plus je les ajoute à la liste, et je rend visible la dernière ligne.
Voila coder vite fait, j'ai aps testé, mais ca doit être bon @ + ou - 1
suivant la gestion des index, si commence à 0 ou 1
donc teste le sur qeulques ligne et ajuste les variables
Local $countLigne = _FileCountLines($sFilePath) +-1
Local $countListe = _GUICtrlListBox_GetCount($hWnd) +-1
Local $CountNewline = $countLigne - $countListe pareil ici +- 1
► Afficher le texte
Code : Tout sélectionner
Func DsLogUpdate()
Local $countLigne = _FileCountLines($sFilePath)
Local $countListe = _GUICtrlListBox_GetCount($hWnd)
; Je compare le Nombre de ligne si j'en ai plus je les affiche
If $countLigne > $countListe Then
_GUICtrlListBox_BeginUpdate($hListBox)
; je calcule la poisition dans le fichier de la nouvelle ligne
Local $CountNewline = $countLigne - $countListe
; j'ouvre le fichier et je lis la 1ere nouvelle ligne
; donc je me positionne dans le fichier sur la 1ère nouvelle ligne
; Important pour la suite car je vais lire séquentiellemeent a partir de la.
Local $hfile = FileOpen($sFilePath, 0)
Local $line = FileReadLine($hfile, $countLigne - $CountNewline)
; j'ajoute la ligne dans la listbox
Local $iIndex = _GUICtrlListBox_AddString($hListBox, $line)
; maintenant je vais lire jusqu'a la fin du fichier et ajouté les ligne dans la liste
While 1
$line = FileReadLine($hfile)
If @error = -1 Then ExitLoop
$iIndex = _GUICtrlListBox_AddString($hListBox, $line)
Wend
; Ici je scrolle la listebox sur le dernier index créer
; Même si la 1ere ligne est la seule ajouter avant le while puisque $iIndex est créer
_GUICtrlListBox_SetCurSel($hListBox, $iIndex)
FileClose($hfile)
_GUICtrlListBox_EndUpdate($hListBox)
EndIf
EndFunc
De plus je pense que ca doit être rapide car j'ajoute que les nouvelles lignes, donc même si tu le rafraichis souvent ca doit être rapide. Sauf la 1ere fois puisque il va ajouter toutes les lignes.
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 13:15
par pierrotm777
C'est bien aussi,
je l'ai donc adapté ainsi:
► Afficher le texte
Code : Tout sélectionner
#include <ListBoxConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <GuiListBox.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
Dim $ReadDSLog = "c:\dslog.txt"
;GUI de debug
$DebugGUI = GUICreate("IcarDS Skinner Tool", 500, 603, -1, -1)
$LiveDebugLog = GUICtrlCreateButton("Live Debug Log", 105, 5, 100, 25)
$DebugWindow = GUICtrlCreateList("",8, 60, 482, 478, BitOR($LBS_SORT,$LBS_DISABLENOSCROLL,$LBS_STANDARD,$WS_HSCROLL,$WS_VSCROLL,$WS_BORDER))
$SaveDebugWindow = GUICtrlCreateButton("Save", 430, 535, 60, 30)
GUISetState()
DsLogUpdate()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $LiveDebugLog
$DebugGUIStatus = True
Case $SaveDebugWindow
FileSaveDialog("Save DS Skin Tool Log", @MyDocumentsDir, "Text files (*.txt)", 16, "DSSkin Tool Log")
GUICtrlRead($DebugWindow)
EndSwitch
WEnd
Func DsLogUpdate()
Local $countLigne = _FileCountLines($ReadDSLog)
Local $countListe = _GUICtrlListBox_GetCount($DebugGUI)
; Je compare le Nombre de ligne si j'en ai plus je les affiche
If $countLigne > $countListe Then
_GUICtrlListBox_BeginUpdate($DebugWindow)
; je calcule la poisition dans le fichier de la nouvelle ligne
Local $CountNewline = $countLigne - $countListe
; j'ouvre le fichier et je lis la 1ere nouvelle ligne
; donc je me positionne dans le fichier sur la 1ère nouvelle ligne
; Important pour la suite car je vais lire séquentiellemeent a partir de la.
Local $hfile = FileOpen($ReadDSLog, 0)
Local $line = FileReadLine($hfile, $countLigne - $CountNewline)
; j'ajoute la ligne dans la listbox
Local $iIndex = _GUICtrlListBox_AddString($DebugWindow, $line)
; maintenant je vais lire jusqu'a la fin du fichier et ajouté les ligne dans la liste
While 1
$line = FileReadLine($hfile)
If @error = -1 Then ExitLoop
$iIndex = _GUICtrlListBox_AddString($DebugWindow, $line)
Wend
; Ici je scrolle la listebox sur le dernier index créer
; Même si la 1ere ligne est la seule ajouter avant le while puisque $iIndex est créer
_GUICtrlListBox_SetCurSel($DebugWindow, $iIndex)
FileClose($hfile)
_GUICtrlListBox_EndUpdate($DebugWindow)
EndIf
EndFunc
Mais cette fois j'ai trois lignes identiques pour chaque nouvelle ligne
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 13:46
par GaRydelaMer
Re
moi je pense tu devrais prendre l'habitude de relire ton code, et surtout apprendre à nommer tes variables.
Dans le même code tu mélanges $DebugGUI et $DebugWindows.
Trouves toi une convention pour le nom des variables c'est plus simple ensuite à lire.
$GUI_Debug pour la gui
$List_Debug pour la liste
$Bt_Ok pour un bouton
Etc...
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : mar. 22 févr. 2011 13:53
par pierrotm777
OUI,

promis je vais faire des efforts !!!
Vous avez une idée pour la répétition par trois ? SVP
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : jeu. 03 mars 2011 16:29
par pierrotm777
Je n'avais pas de mise à jour regulière, j'ai alors remplacé:
par
Aprés essais, votre proposition fonctionne mais avec énormément de redondance !!!
Re: [..] Lecture fichier txt dans GUICtrlCreateList + sauveg
Posté : jeu. 03 mars 2011 20:06
par pierrotm777
Je pense avoir résolu mon problème.
En fait , la proposition de GarydelaMer est ok sauf qu'il faut tout de même lire le fichier une première fois.
Voici donc les modifications qui fonctionnent:
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <File.au3>
#include <GuiListBox.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstantsEx.au3>
Dim $ReadDSLog = "c:\dslog2.txt", $line
$file = FileOpen($ReadDSLog, 0)
While 1
$line &= FileReadLine($file) & '|'
If @error = -1 Then ExitLoop
WEnd
FileClose($file)
;GUI de debug
$DebugGUI = GUICreate("IcarDS Skinner Tool", 500, 603, -1, -1)
$LiveDebugLog = GUICtrlCreateButton("Live Debug Log", 105, 5, 100, 25)
$DebugWindow = GUICtrlCreateList("",8, 60, 482, 478, BitOR($WS_VSCROLL, $WS_BORDER))
$SaveDebugWindow = GUICtrlCreateButton("Save", 430, 535, 60, 30)
GUISetState()
DsLogUpdate()
AdlibRegister("DsLogUpdate",2000)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $LiveDebugLog
$DebugGUIStatus = True
Case $SaveDebugWindow
FileSaveDialog("Save DS Skin Tool Log", @MyDocumentsDir, "Text files (*.txt)", 16, "DSSkin Tool Log")
GUICtrlRead($DebugWindow)
EndSwitch
WEnd
Func DsLogUpdate()
Local $countLigne = _FileCountLines($ReadDSLog)
Local $countListe = _GUICtrlListBox_GetCount($DebugGUI)
; Je compare le Nombre de ligne si j'en ai plus je les affiche
If $countLigne > $countListe Then
_GUICtrlListBox_BeginUpdate($DebugWindow)
; je calcule la poisition dans le fichier de la nouvelle ligne
Local $CountNewline = $countLigne - $countListe
; j'ouvre le fichier et je lis la 1ere nouvelle ligne
; donc je me positionne dans le fichier sur la 1ère nouvelle ligne
; Important pour la suite car je vais lire séquentiellemeent a partir de la.
Local $hfile = FileOpen($ReadDSLog, 0)
Local $line = FileReadLine($hfile, $countLigne - $CountNewline)
; j'ajoute la ligne dans la listbox
Local $iIndex = _GUICtrlListBox_AddString($DebugWindow, $line)
; maintenant je vais lire jusqu'a la fin du fichier et ajouté les ligne dans la liste
While 1
$line = FileReadLine($hfile)
If @error = -1 Then ExitLoop
$iIndex = _GUICtrlListBox_AddString($DebugWindow, $line)
Wend
; Ici je scrolle la listebox sur le dernier index créer
; Même si la 1ere ligne est la seule ajouter avant le while puisque $iIndex est créer
_GUICtrlListBox_SetCurSel($DebugWindow, $iIndex)
FileClose($hfile)
_GUICtrlListBox_EndUpdate($DebugWindow)
EndIf
EndFunc
Merci à vous