[Ex] Editer un fichier de configuration

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

[Ex] Editer un fichier de configuration

#1

Message par timmalos »

Bonjour à tous. Aujourd'hui je vous propose un exemple concernant les ListView, et plus particulièrement comment rendre une cellule Editable pour l'utilisateur.

Le script que je vous propose est très simple : Vous renseigner un fichier de configuration .ini, et il ouvre une GUI ou vous pouvez facilement changer toutes les informations de ce fichier.

Pour faire ceci, plusieurs problèmes se posent.
Le plus important concerne les cellules éditables. En effet on ne peut éditer QUE la première colonne. Pas très pratique. On va donc user d'un stratagème : Changer l'ordre des colonnes. Ainsi, on pourra éditer n'importe quelle colonne , dans la limite d'une seule colonne éditable.
Ici, je vais creer la colonne VALEUR en premier, mais elle sera affichée en SECOND, attention de ne pas se perdre :)

Petit supplément, on va jongler avec les WM_NOTIFY parce que c'est vachement plus drôle ;)
En fait, je voulais une chose : Si une section CRYPTEE est détectée, alors il fallait que je puisse éditer directement la valeur non cryptée. Pour cela, on utilise une INPUTBOX et on insère la nouvelle valeur dans la cellule.
Comme toujours, le script sera plus parlant ;)

Code : Tout sélectionner

#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#Include <String.au3>

Global $ini_configure = @ScriptDir & "\parametres.ini"



_GuiEDITini()

Func _GuiEDITini()
    Local $w = 800,$h=600,$int = 3
    Global $hListView,$ArrayCrypt[10]
    Dim $array,$iS = 1,$iC = 0
    GUICreate("ListView Edit Label", $w,$h)
    $hListView = GUICtrlCreateListView("", $int, $int, $w-2*$int, $h-2*$int, BitOR($LVS_EDITLABELS, $LVS_REPORT))
    _GUICtrlListView_SetUnicodeFormat($hListView, False);Use ANSI

    GUISetState()

    ; Add columns
    _GUICtrlListView_InsertColumn($hListView, 0, "Valeur",1200)
    _GUICtrlListView_InsertColumn($hListView, 1, "Paramètre",$w/2.7)
    _GUICtrlListView_SetColumnOrder($hListView, "1|0")
    _GUICtrlListView_SetColumnWidth($hListView,0,$LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($hListView,0,_GUICtrlListView_GetColumnWidth($hListView,0)-20);Ceci en compensation de la barre Verticale de defilement

    _GUICtrlListView_EnableGroupView($hListView)

    ; Add items
    $Sections = IniReadSectionNames($ini_configure)
    If IsArray($Sections) Then
        For $i = 1 to $Sections[0]
            _GUICtrlListView_InsertGroup($hListView, $iS, $iS, $Sections[$i])
            $array = IniReadSection ( $ini_configure, $Sections[$i] )
            If IsArray($array) Then
                For $j = 1 to $array[0][0]
                    _GUICtrlListView_AddItem($hListView, $array[$j][1])
                    _GUICtrlListView_AddSubItem($hListView, $iC, $array[$j][0], 1)
                    _GUICtrlListView_SetItemGroupID($hListView, $iC, $iS)
                    If $Sections[$i] = "Crypt" Then
                        Redim $ArrayCrypt[$array[0][0]]
                        $ArrayCrypt[$j-1] = $iC
                    EndIf
                    $iC+=1
                Next
                $iS += 1
            Else
                MsgBox(0,"","Erreur de lecture  des parametres")
                Return 0
            EndIf
        Next
    Else
        MsgBox(0,"","Erreur de lecture  du fichier de configuration")
        Return 0
    EndIf



    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    Do
        sleep(20)
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
    Return 1
EndFunc   ;==>_Main


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $LVN_BEGINLABELEDITA, $LVN_BEGINLABELEDITW ; Start of label editing for an item
                    $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                    $id = _ArraySearch($ArrayCrypt,Int(DllStructGetData($tInfo, "Item")))
                    If $id <> -1 Then
                        $rep = InputBox("","Ce champ est crypté. Veuillez donner la nouvelle valeur ci-dessous.",_StringEncrypt(0,_GUICtrlListView_GetItemText($hListView,Int(DllStructGetData($tInfo, "Item"))), "12*/#Max987²", 2))
                        ;_ArrayDelete($ArrayCrypt,$id)
                        If $rep <> "" Then _GUICtrlListView_SetItemText($hListView,Int(DllStructGetData($tInfo, "Item")),_StringEncrypt(1,$rep, "12*/#Max987²", 2))
                        _GUICtrlListView_CancelEditLabel($hListView)
                        _GuiEDITiniSet(Int(DllStructGetData($tInfo, "Item")))
                    EndIf
                    Return False
                Case $LVN_ENDLABELEDITA, $LVN_ENDLABELEDITW ; The end of label editing for an item
                    $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                    Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
                    If StringLen(DllStructGetData($tBuffer, "Text")) Then
                        _GuiEDITiniSet(Int(DllStructGetData($tInfo, "Item")),DllStructGetData($tBuffer, "Text"))
                        Return True
                    EndIf
                Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    _GUICtrlListView_EditLabel($hListView,Int(DllStructGetData($tInfo, "Index")))
                    $id = _ArraySearch($ArrayCrypt,Int(DllStructGetData($tInfo, "Index")))
                    If $id <> -1 Then
                        $rep = InputBox("","Ce champ est crypté. Veuillez donner la nouvelle valeur ci-dessous.",_StringEncrypt(0,_GUICtrlListView_GetItemText($hListView,Int(DllStructGetData($tInfo, "Index"))), "12*/#Max987²", 2))
                        If $rep <> "" Then _GUICtrlListView_SetItemText($hListView,Int(DllStructGetData($tInfo, "Index")),_StringEncrypt(1,$rep, "12*/#Max987²", 2))
                        _GUICtrlListView_CancelEditLabel($hListView)
                        _GuiEDITiniSet(Int(DllStructGetData($tInfo, "Index")))
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func _GuiEDITiniSet($ID,$b = "")
    $a = _GUICtrlListView_GetGroupInfo($hListView,_GUICtrlListView_GetItemGroupID($hListView,$ID))
    _GUICtrlListView_SetUnicodeFormat($hListView, TRUE);Use ANSI
    If $b = "" Then $b = _GUICtrlListView_GetItemText($hListView,$ID)
    $c = _GUICtrlListView_GetItemText($hListView,$ID,1)
    _GUICtrlListView_SetUnicodeFormat($hListView, False);Use ANSI"
    IniWrite($ini_configure,$a[0],$c,$b)
EndFunc
 
Je vous met le fichier d'exemple "parametres.ini" en fichier joint. Mettez le dans le même dossier et admirez :)
Fichiers joints
parametres.ini
(2.04 Kio) Téléchargé 559 fois
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Ex] Editer un fichier de configuration

#2

Message par mikell »

Merci pour ce script très intéressant pour la gestion conjointe d'un ini et d'une listview, et aussi du cryptage, mais :
timmalos a écrit :on pourra éditer n'importe quelle colonne , dans la limite d'une seule colonne éditable.
pourquoi ça ? la partie 'listview' de votre script ressemble à ce script trouvé ici
► Afficher le texte
où toutes les cellules sont éditables sur 3 colonnes :?:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [Ex] Editer un fichier de configuration

#3

Message par jl56 »

Bonjour à tous

@timmalos

Merci pour ce script qui m'évitera de générer une GUI pour modifier chaqu'un de mes ini
en plus c'est très esthétique


A+ JL56
Avatar du membre
ricky
Niveau 7
Niveau 7
Messages : 443
Enregistré le : ven. 06 févr. 2009 09:25
Localisation : Suisse
Status : Hors ligne

Re: [Ex] Editer un fichier de configuration

#4

Message par ricky »

Hello,

pas mal comme script et surtout utile, mais à la compilation et une liste de warnings. Est-ce normal?
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Ex] Editer un fichier de configuration

#5

Message par timmalos »

@ricky J'ai retiré ce script d'un autre plus imposant, et en effet c'est probable qu'il y ait pas mal de warnings, comme les Global declarées dans la fonction. Mais je vous fais confiance pour vous en affranchir et corriger par vous même ces warnings :)


@mikell En fait ici si tu regarde bien ton script on gère nous même la création d'un Edit au bon endroit par DESSUS la listview, ce n'est qu'une bidouille intéressante certes,mais disons que DE BASE, la listview ne gère qu'une seule colonne éditable.

Après ca complique énormément. Pour ma part, je n'avais ici besoin que d'une seule colonne éditable, donc j'ai reglé le problème plus facilement. Mais ca ne doit pas être très compliqué d'associer les 2 scripts, si la demande est là je le ferai sinon c'est le prochain qui en aura besoin qui s'en chargera :)
Avatar du membre
ricky
Niveau 7
Niveau 7
Messages : 443
Enregistré le : ven. 06 févr. 2009 09:25
Localisation : Suisse
Status : Hors ligne

Re: [Ex] Editer un fichier de configuration

#6

Message par ricky »

Oui, j'ai corrigé pas mal de choses, mais j'en un qui me résiste et je me pose la question si c'est normal :
WARNING: $iIDFrom: declared, but not used in func.
Pourquoi on envoi qqch dans $iIDFrom et on ne l'utilise pas, est-ce normal?
Tu veux le code corrigé?
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Ex] Editer un fichier de configuration

#7

Message par timmalos »

Tu dois pouvoir supprimer cette ligne.
Répondre