Page 1 sur 1

[R] Base de donnée texte report Liste

Posté : ven. 08 févr. 2013 12:21
par Ks10
Bonjour à tous !

A l'heure actuel j'aimerais pouvoir lire un fichier texte (qui servira de base de stockage) et reporter la totalité du contenue dans un "GuiCtrlCreateList".

Mon fichier est a la racine du dossier et voici les lignes de codes que j'ai utilisé :

Code : Tout sélectionner

Global $file = FileOpen("exadtb.ini", 1)
Global $Form1 = GUICreate("Mon programme", 634, 470, 192, 124)
Global $MenuItem2 = GUICtrlCreateMenu("Fichier")
Global $MenuItem4 = GUICtrlCreateMenuItem("Quitter", $MenuItem2)
Global $MenuItem1 = GUICtrlCreateMenu("Options")
Global $MenuItem3 = GUICtrlCreateMenu("?")
Global $List1 = GUICtrlCreateList("", 0, 0, 633, 409)

Global $Button1 = GUICtrlCreateButton("Mise à jour DataBase", 192, 416, 275, 25)
GUICtrlSetLimit(-1, 200)
GUISetState(@SW_SHOW)
GUICtrlSetData($List1, FileRead($file, 1))
Le but rechercher c'est que à l'ouverture du programme il lit et affiche toutes les lignes qui se trouve dans le fichier "exadtb.ini".
Je précise que quand je lance mon programme avec ce code rien ne s'affiche mais je n'est aucune erreur également.

Je ne trouve pas mon soucis x)
Merci d'avance

Re: [..] Base de donnée texte report Liste

Posté : ven. 08 févr. 2013 13:10
par ani
on ouvre le fichier, on le li et on ferme le fichier.

$file = fileopen("monfichier") ; pourquoi 1 = ecrit a la fin du fichier ?
$hFile = fileread($file) ; idem pourquoi 1 = nbre de caractére lu ici 1, on va pas loin avec çà
fileclose($file)

guictrlsetdata($list1,$hfile)

normalement c'est bon ;)
bonne continuation
ps: le ini est limité attention quand même ;)

Re: [..] Base de donnée texte report Liste

Posté : ven. 08 févr. 2013 13:16
par Ks10
Excellent ça fonctionne :P
Merci ani.

Ps : Quand je tomberais sur les limites du fichier ini j'envisagerais une autre solution :p
Merci du conseil

Re: [..] Base de donnée texte report Liste

Posté : ven. 08 févr. 2013 13:40
par Ks10
Un autre petit soucis :

Mon programme lit bien le fichier mais il ne comprend pas d'aller à la ligne.
Du coup mon fichier est composé comme sa :
- BLABLABLABLABLABLA
- BLABLABLABLABLABLA

Et dans la liste il affiche :
BLABLABLABLABLABLABLABLABLABLA

Que faut-il faire pour qu'il passe à la ligne ?

J'ai essayer FileReadLine a la place de FileRead cela ne change rien & j'ai essayer aussi @crlf.

Re: [..] Base de donnée texte report Liste

Posté : ven. 08 févr. 2013 14:19
par ani
c simple

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <ListboxConstants.au3>

Global $file = FileOpen("exadtb.ini", 1), $ligne
Global $Form1 = GUICreate("Mon programme", 634, 470, 192, 124)
Global $MenuItem2 = GUICtrlCreateMenu("Fichier")
Global $MenuItem4 = GUICtrlCreateMenuItem("Quitter", $MenuItem2)
Global $MenuItem1 = GUICtrlCreateMenu("Options")
Global $MenuItem3 = GUICtrlCreateMenu("?")
Global $List1 = GUICtrlCreateList("", 0, 0, 633, 409, Not $LBS_SORT) ; IMPORTANT le NOT ;)

While 1
    $ligne = FileReadLine($file)
    If @error = -1 Then ExitLoop
    GUICtrlSetData($List1, $ligne & "|")
Wend
FileClose($file)
....;suite  du script
bonne continuation ;)

Re: [..] Base de donnée texte report Liste

Posté : ven. 08 févr. 2013 14:25
par Ks10
Il referme automatiquement mon programme.
Voici le code :

Code : Tout sélectionner

Global $file = FileOpen("exadtb.ini"), $ligne


Global $Form1 = GUICreate("Mon programme", 634, 470, 192, 124)
Global $MenuItem2 = GUICtrlCreateMenu("Fichier")
Global $MenuItem4 = GUICtrlCreateMenuItem("Quitter", $MenuItem2)
Global $MenuItem1 = GUICtrlCreateMenu("Options")
Global $MenuItem3 = GUICtrlCreateMenu("?")
Global $List1 = GUICtrlCreateList("", 0, 0, 633, 409)
Global $Button1 = GUICtrlCreateButton("Mise à jour Base De Données de vos interventions", 192, 416, 275, 25)
GUISetState(@SW_SHOW)
GUICtrlSetLimit(-1, 200)


#EndRegion ### END Koda GUI section ###

While 1
        $ligne = FileReadLine($file)
        If @error = -1 Then ExitLoop
        GUICtrlSetData($List1, $ligne & "|")
 $nMsg = GUIGetMsg()
 Switch $nMsg
Suite du script blablabla... Wend

Et j'ai pas mit le 1 après sa :

Code : Tout sélectionner

Global $file = FileOpen("exadtb.ini"), $ligne
Sinon mon fichier n'est pas lu et les données n'apparait pas.

Re: [..] Base de donnée texte report Liste

Posté : ven. 08 févr. 2013 15:14
par ani
j'avais oublié de retirer le 1 de fileopen.

tu dois garder la boucle while pour la lecture du fichier ligne par ligne comme precedement.

Code : Tout sélectionner

Opt('MustDeclareVars', 1)
#include <GUIConstantsEx.au3>
#include <ListboxConstants.au3>

Global $file = FileOpen("exadtb.ini"), $ligne
Global $Form1 = GUICreate("Mon programme", 634, 470, 192, 124)
Global $MenuItem2 = GUICtrlCreateMenu("Fichier")
Global $MenuItem4 = GUICtrlCreateMenuItem("Quitter", $MenuItem2)
Global $MenuItem1 = GUICtrlCreateMenu("Options")
Global $MenuItem3 = GUICtrlCreateMenu("?")
Global $List1 = GUICtrlCreateList("", 0, 0, 633, 409, [color=#0000FF]Not $LBS_SORT[/color]) ; [color=#FF0000]IMPORTANT le NOT ;)[/color]

While 1
    $ligne = FileReadLine($file)
    If @error = -1 Then ExitLoop
    GUICtrlSetData($List1, $ligne & "|")
Wend

FileClose($file) ; on ferme le fichier précedement ouvert

GuictrlsetLimit($List1,200) ; il affichera au maximum 200 ligne dans la GUICtrlCreateList, 
GuiSetState() ; on affiche la gui

Global $Msg = 0
While $Msg <> $GUI_EVENT_CLOSE
    $Msg = GuiGetMsg()
    Select
        Case $Msg  = $MenuItem1
        ;instruction Option
        Case $Msg  = $MenuItem2
        ;instruction Fichier
        Case $Msg  = $MenuItem3
        ;instruction ?/Help/Aide
        Case $Msg  = $MenuItem4
            Exit ; Ou ExitLoop
    EndSelect
Wend
Guidelete()

GuictrlsetLimit($List1,200) je ne l'aurait pas indiquer pour ma part.
Guidelete() detruit la gui après l'appuie de esc ou MenuItem4 voir aide pour de plus ample explication

Re: [..] Base de donnée texte report Liste

Posté : lun. 11 févr. 2013 06:19
par Ks10
Ah, super merci ça fonctionne :D

Une dernière question ?
GuictrlsetLimit($List1,200) je ne l'aurait pas indiquer pour ma part.
Ne pas mettre cette commande, rendra mon listing illimité au lieu de le restreindre à 200 ?

Re: [..] Base de donnée texte report Liste

Posté : lun. 11 févr. 2013 11:55
par jchd
@ani
Global $List1 = GUICtrlCreateList("", 0, 0, 633, 409, Not $LBS_SORT) ; IMPORTANT le NOT ;)
Certainement pas !
Balle pied

Edit:
Ce "Not $LBS_SORT" est un dangereux faux ami.
La constante est un entier et Not un opérateur logique (booléen) et non binaire.
Par bonheur ici, il se trouve que la constante est non nulle, ce qui fait que Not <un entier non nul> évalue à false qui est converti en 0 au moment du passage de paramètre.

Utiliser des constantes explicites au lieu de nombres magiques permet de s'affranchir de la connaissance des valeurs des ces nomberes magiques. Si $LBS_SORT valait 0, alors Not $LBS_SORT vaudrait true donc 1 au passage du paramètre, ce qui ne donnerait pas le résultat escompté.

La façon propre de construire le paramètre voulu est celle Mikell, utilisant BitOR.

Re: [..] Base de donnée texte report Liste

Posté : lun. 11 févr. 2013 12:53
par mikell
jchd a écrit :Certainement pas !
Il existe une syntaxe pour faire l'équivalent ?
Apart le traditionnel style = BitOr($LBS_NOTIFY, $WS_HSCROLL, $WS_VSCROLL, $WS_BORDER)

Re: [..] Base de donnée texte report Liste

Posté : lun. 11 févr. 2013 14:05
par ani
Ca aurait été bien que vous répondiez à la question du y a t'il une limitation pour le contrôle GUICtrlCreateList.
Je ne serait vous/te dire, mais comme tout contrôle y a une limitation. je ne vois rien dans l'aide qui peut le confirmer.
J'ai testé avec un fichier (301ko comportant 9582 lignes) pas de soucis, le code fournis n'est pas correct, car il lui a fallut + 10 seconde avant d'afficher la gui.
Et çà aurait été bien de le corriger aussi (de te dire ani tu té un peu trompé). (code corrigé plus bas)

Si votre fichier ini comporte 201 ligne vous ne verrez pas la dernière :(

code corigé

Code : Tout sélectionner

Opt('MustDeclareVars', 1)
#include <GUIConstantsEx.au3>
#include <ListboxConstants.au3>

Global $file = FileOpen("exadtb.ini"), $ligne, [color=#FF0000]$Data[/color]
While 1
    $ligne = FileReadLine($file)
    If @error = -1 Then ExitLoop
    [color=#FF0000]$Data &= $ligne & "|"[/color]
Wend
FileClose($file) ; on ferme le fichier

Global $Form1 = GUICreate("Mon programme", 634, 470, 192, 124)
Global $MenuItem2 = GUICtrlCreateMenu("Fichier")
Global $MenuItem4 = GUICtrlCreateMenuItem("Quitter", $MenuItem2)
Global $MenuItem1 = GUICtrlCreateMenu("Options")
Global $MenuItem3 = GUICtrlCreateMenu("?")
Global $List1 = GUICtrlCreateList("", 0, 0, 633, 409, BitOr($LBS_NOTIFY, $WS_HSCROLL, $WS_VSCROLL, $WS_BORDER))

[color=#FF0000]GUICtrlSetData($List1, $Data)[/color]
;~ GuictrlsetLimit($List1,200) ; il affichera au maximum 200 ligne dans la GUICtrlCreateList, 
GuiSetState() ; on affiche la gui

Global $Msg = 0
While $Msg <> $GUI_EVENT_CLOSE
    $Msg = GuiGetMsg()
    Select
        Case $Msg  = $MenuItem1
        ;instruction Option
        Case $Msg  = $MenuItem2
        ;instruction Fichier
        Case $Msg  = $MenuItem3
        ;instruction ?/Help/Aide
        Case $Msg  = $MenuItem4
            Exit ; Ou ExitLoop
    EndSelect
Wend
Guidelete()
voilàvoilà
bonne continuation

Re: [..] Base de donnée texte report Liste

Posté : lun. 11 févr. 2013 14:27
par mikell
Ok ok je réponds :mrgreen:
Contrairement à la listview qui est limitée à 65532 lignes, la listbox n'est apparemment pas limitée en nb de lignes (mais le temps d'affichage, c'est une autre histoire)

Code : Tout sélectionner

#include <ListboxConstants.au3>
#include <WindowsConstants.au3>

Global $Form1 = GUICreate("", 300, 500)
Global $List1 = GUICtrlCreateList("", 10, 10, 280, 480, BitOr($LBS_NOTIFY, $WS_HSCROLL, $WS_VSCROLL, $WS_BORDER))
GuiSetState() 
$data = ""
For $i = 1 to 10^6
    $data &= $i & "|"
Next
GUICtrlSetData($List1, $data)
While GuiGetMsg()<>-3
Wend
Dans le fichier d'aide il n'est pas fait mention d'une limite au nb de lignes d'un fichier ini (quoique s'il est trop long, le script devient une tortue mais c'est une autre histoire) :wink:

Re: [..] Base de donnée texte report Liste

Posté : lun. 11 févr. 2013 15:03
par ani
le million, mdr çà lague . on trouvera jamais un fichier de ce genre.
AU pire utilisé le contenu max de windows 256^2 = 65536 ok

le code fourni pas top, tu demande d'afficher la gui et ensuite le contenu de la liste, çà bug.
vaut mieux envoyer le contenu dans la liste et ensuite afficher la gui non? teste tu verra une net difference (sans le million ;))

bon codage

Re: [..] Base de donnée texte report Liste

Posté : lun. 11 févr. 2013 16:39
par mikell
ani a écrit :le code fourni pas top
Yes mais on s'en fout, c'est juste pour tester les limites...
le million ! le million ! Image