[R] Problème avec combobox

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

[R] Problème avec combobox

#1

Message par arrkhan »

/!\ Attention post long /!\

Bonsoir, ayant découvert AutoIt il y a peu, j'essaye actuellement d'en comprendre le fonctionnement en modifiant et en adaptant les fichiers d'exemple, ma premiere tentative est de modifier @AppDataDir\AutoIt3\Examples\GUI\Advanced\sysinfo.au3 en virant les GuiCtrlCreateInput que je trouvais mal adapté au script...

Image

...et en les remplacant par des GuiCtrlCreateLabel en modifiant quelque peu l interface, ce qui donne:

Image

j'ai également ajouté des lignes concernant le processeur en allant chercher l info dans le registre, la memoire totale et la memoire utilisée, absente du sysinfo original, en rajoutant:

Code : Tout sélectionner

GUICtrlCreateLabel("Processeur:", 30, 230, 150, 20)
GUICtrlCreateLabel("" & $RegReadProcType, 180, 230, 280, 20)
GUICtrlCreateLabel("Mémoire totale:", 30, 250, 150, 20)
GUICtrlCreateLabel("" & Round(($Mem[1])/1024,0) & " Mo", 180, 250, 280, 20)
GUICtrlCreateLabel("Mémoire utilisée:",30, 270, 150, 20)
GUICtrlCreateLabel("" & Round(($Mem[1])/1024,2)-Round(($Mem[2])/1024,2) & " Mo", 180, 270, 280, 20)
ce qui donne:

Image


puis je me suis attaqué à la section des disques durs:

Image

comme on peut le voir, les espaces total et libre sont indiqués en Mo, ce qui n 'est pas forcement l'ideal...

Code : Tout sélectionner

GuiCtrlCreateInput("" & $TOTAL, 180, 190, 280, 20)
GuiCtrlCreateInput("" & $FREE, 180, 220, 280, 20)
... j'ai donc tatonné et épluché l'aide afin de pouvoir les transformé en Go avec seulement deux décimales, ce qui nous donne

Code : Tout sélectionner

GUICtrlCreateLabel("" & Round(($TOTALC)/1024,2) & " Go", 180, 160, 280, 20)
GUICtrlCreateLabel("" & Round(($FREEC)/1024,2) & " Go", 180, 180, 280, 20)
Comme suit:

Image

ce long post pour expliquer que je ne suis pas satisfait de ce sysinfo, considérant qu'il serait plus complet si l'on avait la possibilité de voir tout les disques présent sur la machine.... Je me suis donc attelé à modifier la section disque dur afin d'avoir une combobox et de pouvoir choisir le disque à afficher, comme cela:

Image

le probleme, c'est qu'etant trés débutant avec AutoIt et la programmation en général, je suis dans l impasse (c.f. le code en bas)

voilà je n arrive pas à faire en sorte que le choix de disque de l utilisateur génére la taille totale et la place dispo dans les emplacement en dessous, j'ai essayé plein de méthodes d'où les nombreuses ;lignes, la dernière en date ayant été d'adapter le post de Vins83 du topic : http://www.autoitscript.fr/viewtopic.ph ... fc594d3edb

un autre probleme vient de mon code vraiment crado, surtout pour les nombreuses variable, mais c'est la seule facon que j'ai trouvé pour pouvoir aficher le lecteur plus son nom dans la combobox, j'ai essayé d'adapter un fichier d exemple a mes besoin mais je n'ai pas réussi:

Code : Tout sélectionner

$var = DriveGetDrive("FIXED")
If NOT @error Then
    ;MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
        MsgBox(4096,"Drive " & $i , $var[$i] & "\" & DriveGetLabel($var[$i]))
        
    Next
EndIf
je ne sait pas comment recupérer "$i , $var[$i] & "\" & DriveGetLabel($var[$i])" qui est en fait le lecteur + son nom facon c:\System pour l'integrer dans la combobox, sinon c'etait pratique car, il ne me transmettait que les drives existant.....

voici le code, il est long, car j ai laisse les nombreux tests et nombreuses variables que j ai teste, mais pour ceux qui veulent l'executer, pas de problèmes, il est fonctionnel tel quel:
► Afficher le texte
Voilà, j'espere ne pas vous avoir découragé, et merci d'avoir lu jusqu'au bout
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#2

Message par Tlem »

Bonsoir/(Bonjour)

Je n'ai pas décortiquer tout votre script (Car il est tard), mais si je peut vous suggérer quelque chose, pour la première partie de votre script je ferais plutôt une boucle pour tester et mémoriser les infos de chaque lecteur.

Premièrement, mettre en tableau les lettres de l'alphabet (Utiliser la commande DIM, des exemples sont donné dans l'aide).
Deuxièmement, à partir du premier tableau, faire une boucle pour créer un second tableau (tester d'abord la présence du lecteur), puis en retirera les infos nécessaires.

Vous aurez donc au final, un tableau avec un certains nombre de lecteurs et leurs informations, que vous n'avez plus qu'a mettrent dans les combos et dans les champs adaptés.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#3

Message par arrkhan »

merci de cette réponse

le probleme c'est que je suis vraiment debutant en programmation, mais j apprend vite....
pour la première partie de votre script je ferais plutôt une boucle pour tester et mémoriser les infos de chaque lecteur.
ben dans l'aide, j ai trouver cela:

Code : Tout sélectionner

$var = DriveGetDrive("ALL")
If NOT @error Then
;MsgBox(4096,"", "Found " & $var[0] & " drives")
For $i = 1 to $var[0]
MsgBox(4096,"Drive " & $i , $var[$i] & "\" & DriveGetLabel($var[$i]))
qui m indique dans une msgbox les disques physiques present, mais je ne sait pas encore comment l exploiter...
mettre en tableau les lettres de l'alphabet...à partir du premier tableau, faire une boucle pour créer un second tableau....puis en retirera les infos nécessaires
humhum, mais ca je sais pas faire, j'ai encore bocou de mal avec les boucles, je comprend a peu pres leur fonctionnement qd je les voit, mais de la a les creer, y a encore du chemin...

petite chose egalement que j'ai oublie de preciser dans mon premier post:

le vrai probleme reside dans le fait que je n arrive pas a voir les tailles dispo de mes disques dans l interface qd je selectionne un disque dans la combobox, le plus simple serait d executer le script pour voir ce dont je veux parler

désoler de probablement mal m'exprimer
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#4

Message par arrkhan »

Bon, première partie du problème resolu... merci Tlem et vive moi \o/

voici le code que je viens de réécrire
► Afficher le texte
mais je ne sais pas si c'est parce que je n'ai que 10 disques (1=system, 2=transfert, 3=partition de sauvegarde temporaire, 4=gros stockage, 5=DVDDrive, 6,7,8,9=DVDDrive virtuels, 10=cleusb) mais au dela de $var[10], ca me met l'erreur = "Array variable has incorrect number of subscripts or subscript dimension range exceeded"

bon, 4h42, il est encore tôt, je vais tenté autre chose ^^
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#5

Message par arrkhan »

....1 heure plus tard...

j'ai essaye plusieurs chose mais une seule me semble convaincante, j ai mis un If FileExist devant chaque ligne:

Code : Tout sélectionner

If FileExists($var[1]) Then
    GUICtrlSetData (-1, $var[1] & "\" & DriveGetLabel($var[1]) , "Choisissez un disque...")
If FileExists($var[2]) Then
    GUICtrlSetData (-1, $var[2] & "\" & DriveGetLabel($var[2]) , "Choisissez un disque...")
Ca a régler le probleme du nombre de disques, mais par contre je ne voit plus les Drive virtuels ni ma cle usb en lettre z, apparement les disque visible dans la combobox doivent se suivrent sinon ca marche plus...

Ou sinon faire un systeme avec DriveStatus qui verifie si le disque est ready et l'affiche le cas échéant, mais je viens de faire plusieurs test, je n'ai pas encore trouvé comment faire non plus

arf 6heures, va falloir faire dodo maintenant sinon je vais cramé mon dimanche :'(
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#6

Message par ani »

héhé on dirait moi au tout début :)
félicitation arrkhan.

pour les disk y a un exemple avec combo ici c'est l'ancien forum.

merci a hellboy_21 pour cette exemple.

en cas de soucis hésite pas ;)
Modifié en dernier par ani le dim. 18 nov. 2007 13:03, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#7

Message par Tlem »

Dans votre code, vous récupéré la liste des lecteurs de la machine, mais pour chaque lecteur trouvé vous utilisé le GUICtrlCreateCombo, puis le GUICtrlSetData !!!

Pour commencer, récupérer d'abord la liste des lecteurs :

Code : Tout sélectionner

$var = DriveGetDrive ( "ALL" )
Ensuite, vous utilisez la variable @error qui est sensée vous donner comme information une erreur de création du tableau, car aucun lecteur n'a été trouvé, et dans ce cas il vaut mieux sortir du script, car il n'y aura rien à faire :

Code : Tout sélectionner

If @error Then
Msgbox ( 32 , "Erreur" , "Aucun lecteur physique n'à été detecté" )
Exit
EndIf
Après, on peut créer le ComboBox :

Code : Tout sélectionner

$CDisque = GUICtrlCreateCombo ( "Choisissez un disque..." , 180 , 136 , 130 , 20 , - 1 )
Qui ne sera visible que vers la fin du script avec le GuiSetState().
Ici on utilise la variable $CDisque qui nous donnera le controlID du Combo, et nous servira plus tard dans la boucle.

Pour régler votre problème sur le tableau :
"Array variable has incorrect number of subscripts or subscript dimension range exceeded"
Il vous faudra modifier la deuxième partie de votre code.
En effet, vous avez créer un tableau qui contient un certains nombre de lecteur, mais pour la suite de votre code vous essayez d'attribué à un ComboBox des valeurs de tableau qui n'existe pas :

Code : Tout sélectionner

GUICtrlSetData ( - 1 , $var[10] & "\" & DriveGetLabel ( $var[10] ) , "Choisissez un disque..." )
En fait, c'est là qu'il faut profiter de votre boucle pour réduire votre code de plus de 20 lignes encore. ;)

Une boucle comme celle-ci devrais correspondre à votre code précédent :

Code : Tout sélectionner

For $i = 1 to $var[0]
GUICtrlSetData ( $CDisque , $var[$i] & "\" & DriveGetLabel ( $var[$i] ) , "Choisissez un disque..." )
Next
Mais elle à l'inconvénient d'effacer chaque ligne du Combo par la nouvelle valeur.
Il faut donc ruser !

Selon la doc de GUICtrlCreateCombo, il faut créer les multiples valeurs comme ceci :

Code : Tout sélectionner

GUICtrlSetData ( - 1 , "item1|item2|item3" , "item3" )
faisons donc de même, et modifions notre boucle :

Code : Tout sélectionner

Dim $MesValeurs ; On déclare la variable pour pouvoir l'utilisée comme je l'ai fait.
For $i = 1 to $var[0]
$MesValeurs = $MesValeurs & $var[$i] & "\ " & DriveGetLabel ( $var[$i] ) & '|'
Next
GUICtrlSetData ( $CDisque , '"' & $MesValeurs & '"' , "Choisissez un disque..." )
GuiSetState ( )
Tout ce joue ici :

Code : Tout sélectionner

$MesValeurs & $var[$i] & "\ " & DriveGetLabel ( $var[$i] ) & '|' 
 
en effet cette ligne, crée une chaine de caractères grace à la boucle qui ressemblera à l'exemple, et en fait à chaque retour de boucle, on ajoute à la variable $MesValeurs le lecteur + le label + le caractère '|'

Jusque là, tout devrais fonctionner, mais il reste un problème, c'est que rien ne va s'afficher !!!

Tout simplement, vous créez un GUICtrlCreateCombo, mais il n'a aucune GUI pour s'afficher ...

Modifier le code comme ceci :

Code : Tout sélectionner

GUICreate ( "Ma GUICombo" )
$CDisque = GUICtrlCreateCombo ( "Choisissez un disque..." , 180 , 136 , 130 , 20 , - 1 )
Et tout devrait rentré dans l'ordre.

Voilà, j'espère que ses quelques explications vous apporterons la lumière sur l'utilisation des boucle et la GUI ... ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#8

Message par arrkhan »

Merci pour ces réponses constructives, je met en pratique de suite...
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#9

Message par arrkhan »

Que je comprenne bien....

À propos de la ligne:

Code : Tout sélectionner

GUICtrlSetData ( $CDisque , '"' & $MesValeurs & '"' , "Choisissez un disque..." )
Que je la laisse telle quelle ou bien que je la change en

Code : Tout sélectionner

GUICtrlSetData ( -1 , $MesValeurs  , "Choisissez un disque..." )


Quand j'execute le script, j'obtiens le même résultat dans la GUI, cela pose-t-il un problème quelconque pour la suite ?

Je me suis décidé à virer les '"' quand je me suis apercu que la combo me mettais du coup un " devant le lecteur c : "c:\

Encore merci, le code est quand même beaucoup plus propre comme ca y'a pas à dire ^^

Code : Tout sélectionner

#include <GuiConstants>

GuiCreate("ATP_DriveInfo _-_BETA_-_   Build 0227", 469, 639,(@DesktopWidth-469)/2, (@DesktopHeight-639)/2)
GUICtrlCreateLabel("Fichier généré le " & @MDAY & "-" & @MON & "-" & @YEAR  & " à " & @HOUR & ":" & @MIN & ":" & @SEC, 180, 490, 280, 20, $SS_RIGHT)

GUICtrlCreateLabel("Caractéristiques des disques:", 10, 120, 180, 20)

$VolumeLabel = GuiCtrlCreateLabel("Nom:", 30, 140, 150, 20)
$TotalSpace = GuiCtrlCreateLabel("Espace total:", 30, 160, 150, 20)
$FreeSpace = GuiCtrlCreateLabel("Espace libre:", 30, 180, 150, 20)

$DGDA = DriveGetDrive( "ALL" )

Dim $MesValeurs
For $i = 1 to $DGDA[0]
$MesValeurs = $MesValeurs & $DGDA[$i] & "\ " & DriveGetLabel ( $DGDA[$i] ) & '|' 
Next
If @error Then
Msgbox ( 32 , "Erreur" , "Aucun lecteur physique n'à été detecté" )
Exit
EndIf 
If NOT @error Then
        $CDisque=GUICtrlCreateCombo ( "Choisissez un disque..." , 180, 136, 130, 20, -1)
        GUICtrlSetData ( $CDisque ,  $MesValeurs , "Choisissez un disque..." ) 
EndIf

GuiSetState()
While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
   Case Else
    ;;; 
    EndSelect
WEnd
Exit
Prochaine étape, rajouter un bouton de rafraichissement à coté de la combobox, au cas où une clef usb est insérée, auquel ca je pense qu'il faut renvoyer à :

Code : Tout sélectionner

For $i = 1 to $DGDA[0]


avec un truc du genre : :label goto label pour AutoIt, bon y'a encore du taf, j'y retourne et encore merci

Edit: je comprend pas, je viens de retester ca marche plus

Re-edit: j'ai compris, je l ai lance alors que ma clef usb était insérée, là pas de probleme, je deco ma clef, je quitte l appli, je la relance, et j'obtiens la Msgbox ( 32 , "Erreur" , "Aucun lecteur physique n'à été detecté" ) What the fuck
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#10

Message par arrkhan »

Encore moi, je post au fur et à mesure de mes trouvailles, on sait jamais, ca servira surement à d'autres...

Partant du principe que l'exe final sera éxécuté sur un ordi sous windows, et donc contenant au minimum un disque dur système, je me suis résolu à virer les if @error then et consort, ce qui fait donc ...

Code : Tout sélectionner

If @error Then
Msgbox ( 32 , "Erreur" , "Aucun lecteur physique n'à été detecté" )
Exit
EndIf 
If NOT @error Then
EndIf
...en moins

l'exe ne s'en porte que mieux ce qui fera que ma touche "refresh fonctionnera également je pense...
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#11

Message par sylvanie »

Il faut boire le vin quand il est coulé !

un contrôle est toujours bienvenu, mais dans ton cas il est seulement mal placé. Il doit être ici :

Code : Tout sélectionner

$DGDA = DriveGetDrive( "ALL" ) 
If @error Then 
Msgbox ( 32 , "Erreur" , "Aucun lecteur physique n'à été detecté" ) 
Exit 
EndIf
car @error se réfère à la dernière fonction capable de la modifiée, or dans ce code, il y a un for et des concaténation, donc n'a plus forcément grand chose à voir avec DriveGetDrive. Heureuslent pour toi un for et des concaténation n'influnce pas cette dernière, mais il faut faire très attention à ce détaille que @error est une globale partagée.

sinon pour la gestion du refresh, tu peux regarder ceci :
http://autoit-fr.realbb.net/entraide-f5 ... e-t256.htm
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#12

Message par Tlem »

arrkhan a écrit :À propos de la ligne:

Code : Tout sélectionner

GUICtrlSetData ( $CDisque , '"' & $MesValeurs & '"' , "Choisissez un disque..." )
Que je la laisse telle quelle ou bien que je la change en

Code : Tout sélectionner

GUICtrlSetData ( -1 , $MesValeurs  , "Choisissez un disque..." )


Quand j'execute le script, j'obtiens le même résultat dans la GUI, cela pose-t-il un problème quelconque pour la suite ?
Non, sauf si vous rajouter un composant GUI entre les deux.
Le -1 considère le dernier élément précédent la ligne.
Il est de convention d'utiliser le -1 lorsque les deux (Ou plus) lignes de code se suivent, sinon garder l'utilisation du PID pour éviter des surprises.

arrkhan a écrit :Je me suis décidé à virer les '"' quand je me suis apercu que la combo me mettais du coup un " devant le lecteur c : "c:\
Effectivement, j'avais oublier de les enlever dans le post.
arrkhan a écrit :Prochaine étape, rajouter un bouton de rafraichissement à coté de la combobox, au cas où une clef usb est insérée, auquel ca je pense qu'il faut renvoyer à :

Code : Tout sélectionner

For $i = 1 to $DGDA[0]


avec un truc du genre : :label goto label
Au lieu de rajouter un bouton, lancer le rafraichissement lors du clic sur le ComboBox.
Dans AutoIt, il n'y à pas de notion Goto Label, par contre vous pouvez utiliser la fonction.

Créer une fonction du genre :

Code : Tout sélectionner

Func _Refresh ( )
$DGDA = DriveGetDrive ( "ALL" )
Dim $MesValeurs
For $i = 1 to $DGDA[0]
$MesValeurs = $MesValeurs & $DGDA[$i] & "\ " & DriveGetLabel ( $DGDA[$i] ) & '|'
Next
If @error Then
$MesValeurs = "Aucun Lecteur"
Exit
EndIf
GUICtrlSetData ( $CDisque , $MesValeurs , "Choisissez un disque..." )
GuiSetState ( )
EndFunc
Placer la ligne :

Code : Tout sélectionner

$CDisque = GUICtrlCreateCombo ( "Choisissez un disque..." , 180 , 136 , 130 , 20 , - 1 )
Après la ligne :

Code : Tout sélectionner

  $FreeSpace = GuiCtrlCreateLabel ( "Espace libre:" , 30 , 180 , 150 , 20 )
Toujour par convention, on crée la partie graphique d'abord, puis on adapte les champs, puis on affiche.

Pour finir, dans votre code, vous pourrez remplacer le code

Code : Tout sélectionner

;De :

$DGDA = DriveGetDrive ( "ALL" )

;à : 

GuiSetState ( )

;par un simple appel à la fonction :

_Refresh ( ) 
 
Pour rafraichir le Combo, vous n'avez qu'a faire appel à cette fonction dans la boucle While en utilisant

Code : Tout sélectionner

Case $msg = $CDisque
Autre solution, surveiller dans la boucle l'insertion d'un média (Il me semble qu'il existe une fonction, ou un UDF pour ça) et rafraichir le Combo.

Pour la suite ce sera demain ;)
Now it's Bed Time ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#13

Message par arrkhan »

re,

je n'ai toujours pas résolu tout mes problemes avec cette combobox, mais je lache un petit peu le probleme pour me concentrer sur l'apprentissage d'AutoIt et pouvoir en grande partie me debrouiller, je vais passer en mode lecture comme ani ^^

je suis, tout comme Ani, un grand novice...... =Þ
Répondre