[R] Section de IniWrite dynamique

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

[R] Section de IniWrite dynamique

#1

Message par Laddy »

Bonjour à tous

j'ai un petit soucis de méthode, moi qui pensait que ça m'aiderait pour mon autre script avec Zeshrek, je me piège toute seule.
je voudrai créer un ini de façon "dynamique"
Je suis entrain de gréer une sorte de gestionnaire utilisateurs sur mes VM.
J'entre le nom, le nom de la vm et son status.
Et je crée mon ini et liste le contenu dans ma listview.
Mais voila si j'ajoute un nouvel utilisateur, il ecrase le premier.
Comment faire pour que le nom de ma section soit dynamique et change en fonction des entrées délà faite ?

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>


#Region ### START Koda GUI section ### Form=D:\Téléchargements\koda_1.7.3.0\Forms\UserCloneVDI.kxf
Global $UserCloneVDI = GUICreate("UserCloneVDI", 627, 389, 192, 124)
Global $User = GUICtrlCreateInput("", 184, 24, 185, 21)
Global $Utilisateur = GUICtrlCreateLabel("Utilisateur :", 104, 24, 56, 17)
Global $Nom = GUICtrlCreateLabel("Nom de la machine virtuelle : ", 16, 64, 143, 17)
Global $VM = GUICtrlCreateInput("", 184, 64, 185, 21)
Global $Add = GUICtrlCreateButton("Ajouter", 448, 64, 83, 25, $WS_GROUP)
Global $Supp = GUICtrlCreateButton("Supprimer", 544, 64, 75, 25, $WS_GROUP)
Global $Combo = GUICtrlCreateCombo("", 472, 24, 145, 25)
GUICtrlSetData(-1, "En cours|Terminer|Suspendu|Annuler")
Global $Status = GUICtrlCreateLabel("Status :", 408, 32, 40, 17)
Global $Fermer = GUICtrlCreateButton("Fermer", 536, 352, 75, 25, $WS_GROUP)
Global $ListView1 = GUICtrlCreateListView("", 8, 112, 610, 230)
_GUICtrlListView_AddColumn($ListView1, "Utilisateurs", 200)
_GUICtrlListView_AddColumn($ListView1, "VM", 200)
_GUICtrlListView_AddColumn($ListView1, "Status", 200) ; Liste déroulante ? [En cours], [Terminer], [Suspendu], [Annuler]

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
    Case $Add
    Ajouter()
    Case $Fermer
Exit
  Case $GUI_EVENT_CLOSE
   Exit

 EndSwitch
WEnd

Func Ajouter()
    GUICtrlCreateListViewItem(GUICtrlRead($User)  & "|" & GUICtrlRead($VM) & "|" &GuiCtrlRead($Combo), $ListView1)
    IniWrite(@ScriptDir & "\user.ini", "Utilisateur01", "Utilisateur", GUICtrlRead($User))
        IniWrite(@ScriptDir & "\user.ini", "Utilisateur01", "Vbox", GUICtrlRead($VM))
        IniWrite(@ScriptDir & "\user.ini", "Utilisateur01", "Status", GUICtrlRead($Combo))
EndFunc 
 
J'ai cherché sur le forum us et ici je n'ai pas encore trouvé d'exemples sur ce type de cas.

mon user.ini
[Utilisateur01]
Utilisateur=laddy
Vbox=xgnobox
Status=En cours
aimerait ceci
[Utilisateur01]
Utilisateur=laddy
Vbox=xgnobox
Status=En cours
[Utilisateur02]
Utilisateur=Pat
Vbox=xgnobox01
Status=Terminer

Merci à ceux qui m'éclaireront.

Laddy
Modifié en dernier par Laddy le ven. 28 janv. 2011 08:07, modifié 1 fois.
reverpi
Niveau 2
Niveau 2
Messages : 18
Enregistré le : mar. 11 janv. 2011 13:28
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#2

Message par reverpi »

Il suffit de compter ton nombre de section avec IniReadSectionNames.
Ton nombre de sections correspond à ton nombre d'utilisateur.
Donc à 5 sections tu es à "Utlisateur05" donc tu créer "Utilisateur06"
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#3

Message par Laddy »

Bonjour
merci je vais regarder l'aide de cette commande, je n'ai jamais compté.
zeshrek va me botter les f***** c'est une chose qu'il m'avait expliqué apparement je ne l'ai pas bien comprise.... :oops: surtout sa réutilisation en dehors du tableau
reverpi
Niveau 2
Niveau 2
Messages : 18
Enregistré le : mar. 11 janv. 2011 13:28
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#4

Message par reverpi »

C'est la premiere valeur de ton tableau retourné ou bien tu utilise la fonction UBound sur ton tableau.
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#5

Message par Laddy »

Hmm que du chinois mais je vais chercher et je reviendrai si jamais demain
bonne soirée et merci
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#6

Message par bloodwolff »

Moi j'irais plus avec un truc du genre car il permet de supprimer des utilisateurs plus facilement ou même avec un stringreg sur un fileread :roll:

Code : Tout sélectionner

$Name = inireadsectionnames(blablabla)
If not @error then 
    $number = 0
    For $i = 0 to ubound($name)-1 
        if number(Stringtrimleft($name[$i], 11)) > $number then $number = number(Stringtrimleft($name[$i], 11))
    next
    $number += 1
Else 
    $number = 1
Endif
Compte skype : bloodwolfff
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2130
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#7

Message par TommyDDR »

Bonjour laddy,

j'avais un peu de temps devant moi donc j'ai repri votre code et y ai ajouté :

- Création d'une variable pour votre nom de fichier
- Bug d'écrasement d'utilisateur corrigé
- Chargement des utilisateurs du fichier ini au démarrage de l'appli

Si vous tenez vraiment à vos Utilisateur01, Utilisateur02, etc, je vous laisse chercher comment ajouter le "0"
► Afficher le texte
PS : Regardez aussi du coter des fonctions _SQLite...() si vous voulez passer par une Base De Données au lieu d'un ini.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#8

Message par Laddy »

Trop fort TommyDDR et Bloodwolf
Un immense merci .
Non je ne tiens pas particulièrement au 0 devant utilisateur.
J'en étais à essayer de lister mes utilisateurs dans la gui, et en regardant ton code, je n'y étais pas du tout.
Je n'utilise pas de base de donnée SQL.

Me reste encore beaucoup de chose à faire : comme pouvoir modifier le status de la VM de l'utilisateur. et lancer via un clic droit la vm en question. Gloups.
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#9

Message par zeshrek »

Laddy a écrit :zeshrek va me botter les f***** c'est une chose qu'il m'avait expliqué apparement je ne l'ai pas bien comprise.... surtout sa réutilisation en dehors du tableau
Ah ba non, ca on en avait pas parlé (quoi que bon, dans le code que je t'avais donné, il y avait ces 2 lignes qui auraient du te mettre sur la voie :

Code : Tout sélectionner

$var = IniReadSectionNames(@ScriptDir & "\MoveFile.ini") ; on lit le fichier ini en stockant dans le tableay $var[] les sections
$NbSectionsDuFichierIni = $var[0] ; on initialise le nombre de  sections avec $var[0] qui contient le nombre de sections
Hmmm... Tu passeras a mon bureau tout a l'heure pour recevoir ta punition... :twisted: :twisted: :twisted:
Si vis pacem para bellum
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#10

Message par Laddy »

Zeshrek oui honte sur moi, j'ai vu qu'après la ligne qui aurait pu m'aider.

tant bien que mal j'ai ajouté le clic droit pour supprimer une ligne , pour le moment je n'ai pas fait la fonction j'ai pas encore trouvé comme faire.

[+] Ajout d'un champ $Patch (chemin de la vm) + bouton Parcourir
[-] suppression du bouton Supprimer pour la remplacer par le clic droit : Supprimer (je ne sais pas si je fais le bon choix ...

► Afficher le texteCode
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#11

Message par zeshrek »

Je viens de parcourir ton code, et 3 choses me laissent perplexe :
1/ C'est moi ou tu as oublié les balises #cs et #ce au début et la la fin de ta zone de commentaires au début de ton source ?
2/ Dans la création de la GUI, pourquoi toutes tes lignes commencent par Global ? Soit tu déclares toutes tes variables au début du code (pour les globales, sinon c'est au début de la fonction concernée pour les locales), soit tu les déclares pas, mais ces global sont... perturbants, je dirais.
3/ Ton menu contextuel est attaché au listview (cf code en rouge ci dessous)

Code : Tout sélectionner

Global $List1context = GUICtrlCreateContextMenu([color=#FF0000]$ListView1[/color])
Global $MenuItem1 = GUICtrlCreateMenuItem("Supprimer", $List1context)
Global $hWnd_ListView = GUICtrlGetHandle([color=#FF0000]$ListView1[/color])
Il serait préférable de le lier a chaque ligne de la liste de facon a identifier celle sur laquelle tu as fait un clic droit.
Ou alors il te supprime d'office la ligne active.

Sinon, je n'ai pas trop le temps de me pencher sur ce script, je refais l'intégralité de l'autre script en partant de zero (ou presque), donc j'ai aps envie de me mélanger entre les deux
Toutefois, comme l'ajout est l'inverse d'un retrait, vu que tu as réussi la première, tu devrais arriver a faire la seconde... ;)
Si vis pacem para bellum
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2130
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#12

Message par TommyDDR »

Laddy a écrit :Merci TommyDDR
Ca fait plaisir de lire cela :D

Pour votre Combobox :

[Modification]

Code : Tout sélectionner

;On empêche l'utilisateur de saisir ce qu'il veut dans la combobox, il devra choisir l'un des choix proposé
Global $Combo = GUICtrlCreateCombo("", 472, 24, 145, 25, $CBS_DROPDOWNLIST)
[Ajout]

Code : Tout sélectionner

#include <ComboConstants.au3>
Pour votre bouton $Parcourir :
[Ajout]

Code : Tout sélectionner

;Mise en place du code
Case $Parcourir
Parcourir()

Code : Tout sélectionner

Func Parcourir()
    Local $Chemin = FileSelectFolder("Chemin de la VM", "", 6, "")
    If(Not(@error)) Then
        GUICtrlSetData($Path, $Chemin)
    EndIf
EndFunc
Pour votre input $Path :
[Modification]

Code : Tout sélectionner

;On ne peut plus écrire dans l'input, il faudra passer par le bouton "parcourir")
Global $Path = GUICtrlCreateInput("", 184, 104, 185, 21, $ES_READONLY)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#13

Message par Laddy »

Zeshrek, nos messages se sont croisés, j'ai édité encore une fois mon code.

1.Oui j'ai oublié le #cs et #ce que j'ai corrigé.
2.Pour les Global c'est Koda Design qui les ajoute d'office, oh le vilain.
Je vais corriger et mettre Global en haut.
3. Le clic droit a lieu uniquement sur la ligne Active.
Si j'ai bien compris ce que j'ai bidouillé

Code : Tout sélectionner

Local $Ctrl_LV_Selected = _GUICtrlListView_GetSelectedIndices($hWnd_ListView)
 
Pour l'autre code je me suis complètement perdue, j'en rêve la nuit du code, tellement il me prend la tête.
Je pense que du moment ou tu maitrises le tableau à x dimensions, tu peux faire n'importe quoi en autoit.
Comme en batch, tu maitrises les boucles et rien ne te résiste.


TommyDDR,
Merci encore une fois ;D
Quel est la différence entre ta fonction Parcourir utilisant FileSelectFolder et FileOpenDialog ?
Je vais ajouter les paramètres proposés pour La combo et l'input Path

Edit : J'ai testé FileSelectFolder me sélectionne le dossier et non le fichier, et je souhaite le fichier vdi.

Mon ini me donne ceci :

Code : Tout sélectionner

[Utilisateur1]
Utilisateur=Bulkhulk
Vbox=XPPro
Status=En cours
Chemin=F:\XPPRo.vdi
 
[+] Correction Global
[+] Ajout paramètres $Comb, $Path.
► Afficher le texteCorrection Code
Pour la fonction de suppression je ne vois pas trop comment m'y prendre pour le moment.
Modifié en dernier par Laddy le ven. 21 janv. 2011 15:19, modifié 1 fois.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2130
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#14

Message par TommyDDR »

Au temps pour moi, je pensais qu'il vous fallai un dossier, dans ce cas, FileOpenDialog est ce qu'il vous faut en effet.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#15

Message par Laddy »

Ah cool, j'ai eu un gros doute :oops:
Bon je me plonge de ma réflexion sur la suppression et je vais me prendre un doliprane.
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#16

Message par Laddy »

Bonjour
malheureusement après des jours des recherches, je n'ai pas trouvé d'exemples sur le forum pour m'aider, je n'y arrive pas grrr
c'est la solution de facilité mais je pense sérieusement à me contenter de ce script de base ..même en me référent au script de Zeshrek, pas réussi à mettre les champs de mon ini dans les colonnes du listview.
Mon idée était que si la ligne était sélectionnée , les champs input serait rempli
1. pour la suppression
2. pour une modification.
► Afficher le texteBricolage de code
Je vais honteusement me cacher.. :oops:
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Section de IniWrite dynamique

#17

Message par GaRydelaMer »

Bonsoir

Alors vite fait ce soir:

J'ai renommer les variables et les fonctions pour être plus clair:
► Afficher le texte
J'ai pas eue le temps de commenter le code mais je peux t'aider à le comprendre ici :)
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [R] Section de IniWrite dynamique

#18

Message par Laddy »

Bonjour GaRydelaMer
quelle surprise ce matin de voir ta réponse, c'est ce que je cherchais à faire, j'ai pris la matinée pour lire ton code je n'en suis pas encore à bout.
Il ya plein de commande que je ne connais pas encore faut que je les étudies. Si je bloque je te contacte pour que tu m'expliques.

Merci tu fais une heureuse.
Me restera à ajouter un truc pour lancer la vm (vboxmanage.exe starvm "$VM") et hop ! mais avant je dois étudier ton code ;D
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [R] Section de IniWrite dynamique

#19

Message par GaRydelaMer »

Re,

pas de soucis le plaisir est pour moi.

On peut encore l'optimiser.

Pour ensuite lancer ta commande, tu peux rajouter un bouton ou même une entrée dans le contextMenu de la listview.

Pour l'ajouter vers la ligne 164 tu peux remplacer l'exemple Print qui fait rien, et l'exécution de la commande dans la fonction: _Events_ContextMenu() ligne 102 sans oublier de déclarer la commande dans la déclaration de Enum:
Global Enum $idCmd_Delete = 10000, $idCmd_Print, $idCmd_Execute

Tu créer une fonction pour exécuter que tu peux relier a un bouton:

Code : Tout sélectionner

;; dans la boucle de début
;       Case $bt_Execute
;           User_Execute()


Func User_Execute()
    Local $aSelected = _GUICtrlListView_GetSelectedIndices($hWnd_ListView, True)
    If $aSelected[0] > 0 Then
        Local $iItem = $aSelected[1]
        Local $VM = _GUICtrlListView_GetItemText($hWnd_ListView, $iItem, 2)     
        Run("vboxmanage.exe starvm '" & $VM "'")
    EndIf
EndFunc
Je connais pas la syntaxe exacte de ton programme vboxmanage.exe
Laddy
Niveau 7
Niveau 7
Messages : 321
Enregistré le : mer. 03 sept. 2008 07:34
Status : Hors ligne

Re: [R] Section de IniWrite dynamique

#20

Message par Laddy »

Coucou

j'en étais arrivé ici , c'est un peu de bricolage d'après ton code j'ai des choses inutiles.
ça prouvre que je n'ai pas encore tout bien compris le code :oops:

Code : Tout sélectionner


If @OSArch = "X64" Then $OSarch = "64"
;If StringRight($vbox_path, 1) = "\" Then $vbox_path = StringRegExpReplace($vbox_path, "\\$", "")

If RegRead("HKEY_LOCAL_MACHINE" & $OSarch & "\SOFTWARE\Oracle\VirtualBox", "InstallDir") Then
    $PathVirtualBox = RegRead("HKEY_LOCAL_MACHINE" & $OSarch & "\SOFTWARE\Oracle\VirtualBox", "InstallDir")
ElseIf RegRead("HKEY_LOCAL_MACHINE" & $OSarch & "\SOFTWARE\Sun\VirtualBox", "InstallDir") Then
    $PathVirtualBox = RegRead("HKEY_LOCAL_MACHINE" & $OSarch & "\SOFTWARE\Sun\VirtualBox", "InstallDir")
ElseIf RegRead("HKEY_LOCAL_MACHINE" & $OSarch & "\SOFTWARE\Sun\xVM VirtualBox", "InstallDir") Then
    $PathVirtualBox = RegRead("HKEY_LOCAL_MACHINE" & $OSarch & "\SOFTWARE\Sun\xVM VirtualBox", "InstallDir")
Else
    MsgBox(16, "VirtualBox", "Erreur d'installation ou le logiciel n'est pas installé sur ce poste.")
    Exit
EndIf

Case $NM_DBLCLK
    Start_Vm()

Func Start_Vm()
    Local $aSections, $iItem, $aUser
     Local $aSelected = _GUICtrlListView_GetSelectedIndices($hWnd_ListView, True)
    If $aSelected[0] > 0 Then
        Local $iItem
        $iItem = $aSelected[1]
    $aSections = IniReadSectionNames($NomFichierIni)
    For $i = 1 To $aSections[0]
        $aUser = IniReadSection($NomFichierIni, $aSections[$i])
        For $iSubItem = 1 To $aUser[0][0]
        Local $toto = _GUICtrlListView_GetItemText($hWnd_ListView, $iItem, 2)

;Run('"' & $PathVirtualBox & 'VBoxManage.exe starvm '" & $toto "'")
        Next
    Next
    EndIf
    ConsoleWrite($toto)
    EndFunc
 
ça me retourne bien le $VM
Répondre