Page 1 sur 1

[R] Rafraichissement Automatique d'une ListView

Posté : mer. 05 août 2009 15:16
par timmalos
Bonjour a tous. Je suis sur un petit projet ou j'ai besoin de rafraichir automatiquement la fenetre (toutes les 10 secondes) en fonction d'infos contenues dans un .ini

Pour compliquer un peu le tout , l'application est en gros de la surveillance d'autres applications, dont le nombre varie. Elle est donc construite dynamiquement avec Assign() et Eval()

Vous pouvez voir qu'il y a 3 Guis, ne vous en formalisez pas, c'est pour la suite, sauf si mon problème vient de là.(Pas testé car impossible selon moi) Je viens a vous apres pas mal de tests bien sur, et si pas de reponse j'espere trouvé chez mes amis americains.


En fait, l'application se rafraichit bien, mais après le PREMIER rafraichissement, impossible de fermer, j'insiste sur le fait qu'avant le premier rafraichissement tout va bien, mais après rien ne va plus, mais on peut quand meme apercevoir que le rafraichissement s'est effectué partiellement. De plus, il n'a l'air de fonctionner qu'a moitié, quand ya 2 applications et qu'on scroll bar, il n'y a rien dessous. Je vous fournis le .zip complet ou vous pouvez tester directement. Enorme merci pour ceux qui s'attelleront a mon problème.

Donc voila, ya t'il une autre solution que

_GUICtrlListView_DeleteAllItems($hListView)
_GUICtrlListView_DeleteColumn($hListView,$i)

Présents dans le script? Parce que ca a l'air de totu faire buguer :(

Merci d'avance

Cordialement,
Tim

Re: [..] Rafraichissement Automatique d'une ListView

Posté : mer. 05 août 2009 18:37
par Tlem
Salut Tim. J'ai essayé de comprendre ton script, mais j'avoue avoir attrapé un peut mal au crâne. :P

Bon alors pour commencer, si je comprend bien, tu as une liste d'application à surveiller et ta ListeView affiche donc 'dynamiquement' en fonction du fichier .ini la liste des applications avec un carré vert pour dire qu'ellle est active et un carré rouge pour dire qu'elle ne l'est pas !
Est-ce bien cela ?

Le fichier .ini est-il mis à jour pendant le fonctionnement du script.

Sinon, certaines choses me 'choque' dans la conception du script.
1 - Le fichier .ini à vraiment une structure relativement complexe. Ne peut-tu simplifier sa structure afin d'utiliser la fonction IniReadSectionNames ?
Tu pourrait alors avoir une structure comme ceci :

Code : Tout sélectionner

[applications1]
Nom = REHUCIT
dossier_de_simulation = \rehucit\
active = 1

[applications2]
Nom = TEST
dossier_de_simulation = \2eme_appli_de_test\
active = 1

[applications3]
Nom = T
dossier_de_simulation = \3eme\
active = 1

[applications4]
Nom = REHT
dossier_de_simulation =
active = 0
qui sera sûrement bien plus 'simple' et évolutive dans le temps.
Pour le numéro de version, tu peut récupérer ça dans les propriété de l'exe.

Dans la fonction _DoListView tu re-crée systématiquement $hListView. :shock:
Dans ce cas au lieu d'utiliser _GUICtrlListView_DeleteAllItems et _GUICtrlListView_DeleteColumn, supprime directement le contrôle :

Code : Tout sélectionner

GUICtrlDelete($hListView)
Ensuite je trouve les fonctions de mise à jour plutôt complexes.
Ne serait-il pas judicieux de passer plutôt par l'utilisation d'un ou plusieurs tableau.
Genre : un tableau multidimensionnel avec le nom de l'appli, sont état de surveillance, sont état de fonctionnement, et plus si nécessaire.
Ensuite une simple boucle de lecture des éléments et tu met à jour la ListView.

Bon c'est déjà un premier jet. ;)

Re: [..] Rafraichissement Automatique d'une ListView

Posté : jeu. 06 août 2009 08:47
par timmalos
Ensuite une simple boucle de lecture des éléments et tu met à jour la ListView.
Et tu aurais fait comment?

Sinon depuis mon message j'ai reussi a trouvé pourquoi le programme plantait. L'utilisation des _ListView ne provoque pas de message d'erreur mais plante a leur execution si mal goupillées.
Aperemment ca marche plutot bien, voila ce que j'ai mis:

Code : Tout sélectionner

If $func_param = 1 Then
            
            _GUICtrlListView_DeleteallItems(GUICtrlGetHandle($hListView))
            _GUICtrlListView_RemoveAllGroups($hListView)
            ;_GUICtrlListView_InsertColumn($hListView,$i, Eval("appli"&$i&"_nom"), $width/1.3,2)
            ;_GUICtrlListView_DeleteColumn($hListView,0)
            
            
            ;$hListView2 = GUICtrlCreateListView("Application n°1", -1, -1, $width, @DesktopHeight - 100,$LVS_NOCOLUMNHEADER)
        Else
        
            $hListView = GUICtrlCreateListView("Application n°1", -1, -1, $width, @DesktopHeight - 100,$LVS_NOCOLUMNHEADER)
            _GUICtrlListView_SetExtendedListViewStyle($hListView, $exStyles)
            _GUICtrlListView_InsertColumn($hListView,$i, Eval("appli"&$i&"_nom"), $width/1.3,2)
            _GUICtrlListView_DeleteColumn($hListView,0)
        EndIf
Le func_param est activé après le premier demarrage en quelque sorte.


Merci pour l'idée de l'ini je met ca en place.
En fait, tu avais presque compris, il y a plusieurs applications qui vont aller verifier que des applications sur le net tournent bien.
Et ces memes applications contiennent plusieurs vérifications internes. Mon programme doit regrouper tout ca. Je posterai à la fin du projet le code source, et enorme merci d'avoir jeté un coup d'oeil, je sais que dans un projet comme ceci que l'on a pas créé c'est horriblement dur de comprendre (surtout que je code mal^^)


Si tu le veux je te poste le code dès que j'ai rectifié le .ini, et en privé je peux t'envoyer le vrai(là il est beaucoup tronqué), juste pour que tu vois un peu à quoi ca ressemble.

Re: [..] Rafraichissement Automatique d'une ListView

Posté : jeu. 06 août 2009 08:48
par timmalos
Et le bug venait partiellement de
_GUICtrlListView_DeleteallItems($hListView)

Qui en fait doit s'ecrire comme ca :

_GUICtrlListView_DeleteallItems(GUICtrlGetHandle($hListView))

(A savoir :wink: )

Re: [..] Rafraichissement Automatique d'une ListView

Posté : jeu. 06 août 2009 10:02
par Tlem
Pour le _GUICtrlListView_DeleteallItems je confirme qu'il fonctionne mieux avec la dernière syntaxe.
Pourtant, selon la documentation :
Parameters
$hWnd = Control ID/Handle to the control
Donc normalement le Control ID devrait fonctionner.

Je dirais donc qu'il y à bug dans la fonction puisque en lisant la description de la fonction dans le fichier GuiListView.au3, il est fait état du même fonctionnement...
► Afficher le texte_GUICtrlListView_DeleteAllItems
Pas de trace d'un ticket en relation sur le bugtrack. Donc tu peut rajouter un ticket sans problème.

Peut être serait-il judicieux (je dit peut être une connerie, mais bon ...), de modifier la fonction comme ceci :
► Afficher le texte_GUICtrlListView_DeleteAllItems

Re: [..] Rafraichissement Automatique d'une ListView

Posté : jeu. 06 août 2009 10:52
par timmalos
Le truc c'est que j'ai trouvé cette forme dans un exemple, j'arrive plus à trouver lequel d'une des fonctions _guilistview

Je risque d'avoir du mal à m'exprimer en anglais, deja que je comprend mal les distinctions entre un handle et controlID ...
Si tu veux que j'essaye je vais aller poster.

Re: [..] Rafraichissement Automatique d'une ListView

Posté : jeu. 06 août 2009 21:28
par orax
timmalos a écrit :Donc voila, ya t'il une autre solution que

_GUICtrlListView_DeleteAllItems($hListView)
_GUICtrlListView_DeleteColumn($hListView,$i)
Tlem a écrit :Ensuite je trouve les fonctions de mise à jour plutôt complexes.
Ne serait-il pas judicieux de passer plutôt par l'utilisation d'un ou plusieurs tableau.
Genre : un tableau multidimensionnel avec le nom de l'appli, sont état de surveillance, sont état de fonctionnement, et plus si nécessaire.
Ensuite une simple boucle de lecture des éléments et tu met à jour la ListView.
Je crois que ça ressemble un peu à ce que j'avais fait ici : Tri ascendant/descendant d'une ListView avec icônes (mais j'avais simplifié le code, il est un peu incomplet). J'avais fait comme ça parce qu'avec _GUICtrlListView_DeleteallItems ça clignotait (mais ça marchait quand même). En gros, $a_listeProcessus contient les infos de la Listview actuelle et $a_listeProcessusMAJ contient les nouvelles infos. Une comparaison est faite entre les deux tableaux et je ne modifie que ce qu'il y a à modifier.

Re: [..] Rafraichissement Automatique d'une ListView

Posté : jeu. 06 août 2009 23:02
par Tlem
@tim, comme je l'ai déjà dit, ça ne me gène pas de rapporter ce genre de problème sur le forum Anglais ou sur le bugtrack. Il suffit simplement de me le dire.
Je ne voudrais pas que les membres du forum imaginent que je m'attribue la découverte d'un bug ou autre.
Donc j'essaie d'être neutre. ;)

Re: [..] Rafraichissement Automatique d'une ListView

Posté : ven. 07 août 2009 21:20
par timmalos
Oh oh oh, je vais pas t'en vouloir si tu rapporte ce bug!!! Je suis pas à la ruée vers l'or des bugs ;) Ca serait un grand plus si tu le faisais pour moi ;) Sinon je vais avoir du mal. Par contre j'irai lire ce que tu as mis pour approuver/completer j'ai fait pas mal d'autres recherches. Mais si tu le fais je te dis un GRAND merci, sinon ca sera pour le week end prochain, quand j'aurai fini mon appli, comme ca j'aurai le temps. Ca marche niquel la ca fait plaisir, mais je vais quand meme regarder le post de Orax, car il est vrai qu'au rafraichissement c'est pas tres beau a voir.

Re: [..] Rafraichissement Automatique d'une ListView

Posté : ven. 07 août 2009 23:33
par Tlem
Bon. Au final, avant de poster sur le forum Anglais, j'ai contrôlé quelques petites choses.

Et là ... J'y comprend pas grand chose car l'exemple de la doc fonctionne trés bien avec le control ID. Donc je pense que c'est au niveau de ton script que quelque chose coince ... Mais je sais vraiment pas quoi. :shock:

Exemple de la doc :

Code : Tout sélectionner

#include <GuiConstantsEx.au3>
#include <GuiListView.au3>

Global $GUI, $hListView

$GUI = GUICreate("ListView Delete All Items", 400, 300)

$hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
GUISetState()

; 3 column load
For $iI = 0 To 9
    GUICtrlCreateListViewItem("Item " & $iI & "|Item " & $iI & "-1|Item " & $iI & "-2", $hListView)
Next

MsgBox(4160, "Information", "Delete All Items")
; Items created using built-in function, pass the control ID
MsgBox(4160, "Deleted?", _GUICtrlListView_DeleteAllItems($hListView))

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()

Re: [..] Rafraichissement Automatique d'une ListView

Posté : sam. 08 août 2009 13:37
par timmalos
Peut etre parce que l'exemple est fondé sur
GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)

Qui retourne effectivement un handle alors que moi j'ai utilisé
_Guilistview_create() ou quelque chose comme ca, mais en tout ca l'UDF. Et là il faut rajouter Guictrlgethandle() pour que ca marche, donc je pense qu'il y a bien un bug avec le controlID

Re: [..] Rafraichissement Automatique d'une ListView

Posté : dim. 09 août 2009 01:25
par Tlem
Dans ton code c'est pourtant bien GUICtrlCreateListView qui est utilisé (ligne 166).
Peut être est-ce lié à la deuxième GUI ou au style...

Re: [..] Rafraichissement Automatique d'une ListView

Posté : dim. 09 août 2009 18:05
par timmalos
Oups, moi dans mon code actuel j'utilise la creation de l'UDF, ya qq chose qui cloche