[..] Lecture fichier XML et création d'une GUI "dynamique"

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

[..] Lecture fichier XML et création d'une GUI "dynamique"

#1

Message par davzell »

salut a tous,

j'aimerai faire un programme pour lire un fichier xml et créer des checkbox (ou autre) en fonction de ce qui est lu.

je m'explique, mon xml ressemble à ça

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8" ?>
<Products>
  <Product name="All">
    <!-- étape1 -->
    <Task label="etape blablabla 1"/>
    <!-- étape -->
    <Task label="etape blablable 2"/>
    <!-- étape 3 -->
    <Task label="......."/>
Le nombre d'étapes est aléatoire dans chaque fichier xml.
j'aimerai créer une gui avec un bouton qui déclenche la lecture du xml, qu'a chaque ligne ou il y a marqué Task Label il me crée une checkbox (par exemple) dans ma gui, avec le nom de l'étape.

Ensuite je voudrais pouvoir décocher les checkbox et que ça supprime la ligne associé.


Je voudrais déjà savoir si il est possible de faire une gui dynamique qui peut s’agrandir en fonction des checkbox ? Ou alors est ce qu'il y a un moyen plus simple que les checkbox d'arriver au même résultat ?

Est ce qu'il est nécessaire ou plus facile de faire ce code avec les udf qui existent pour les fichiers xml ou je devrais m'en sortir avec fileopen ?


merci d'avance
Modifié en dernier par davzell le ven. 22 nov. 2013 09:04, modifié 2 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: lecture fichier xml et création d'une gui "dynamique"

#2

Message par mikell »

Merci de mettre le titre du sujet en conformité avec le règlement du forum
" 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
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] lecture fichier xml et création d'une gui "dynamiqu

#3

Message par mikell »

Plutôt qu'une gui dynamique qui peut s’agrandir en fonction des checkbox, vaudrait mieux une listview qui possède d'origine une barre de scroll et où tu peux mettre des checkbox sur les items
Par exemple si on met ce que tu as posté dans un fichier "test.xml" :
► Afficher le texte
Tu pourrais aussi envoyer le xml dans une editbox, faire les modifications manuellement et enregistrer le résultat ^^
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#4

Message par davzell »

effectivement la listview avec les checkbox c'est exactement ce qu'il fallait

il me reste juste à l'adapter a mon xml et ce sera nikel.

Il y a un moyen quand on coche par exemple la checkbox 3 de la liste que ca coche automatiquement toute celles du dessus ?
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#5

Message par mikell »

Oui mais c'est lourd parce qu'il faut le mettre dans la boucle principale
Vaudrait mieux gérer ça dans la commande de suppression

Code : Tout sélectionner

While 1
For $i = 0 to _GUICtrlListView_GetItemCount($listview)-1
       If _GUICtrlListView_GetItemChecked($listview, $i) Then
           For $j = 0 To $i
               _GUICtrlListView_SetItemChecked($listview, $j)
           Next
        EndIf
 Next
;... etc
Wend
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#6

Message par davzell »

ouai effectivement ca marche, mais dans certains cas ca ne me va pas.

je vais plutôt faire deux boutons, un pour supprimer la sélection, l'autre pour supprimer de la checkbox sélectionné jusqu'à a la première ligne ou il y a marqué <!-- étape1 -->.

d'ailleurs est ce qu'il vaut mieux faire chercher au script la première étape ou alors lui dire de supprimer jusqu'à la ligne de la checkbox jusqu'à la ligne 3 du xml (tout les fichiers xml commence de la même manière avec les 3 premières lignes à épargner :D) ?
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#7

Message par davzell »

je fais remonter un peu ce post pour une modification du code car le fichier xml a un peu evolué

dans mes lignes "task label" il y a maintenant un ajout qui correspond à RequiredFor="..." avec un nom aléatoire a coté.

ce qui donne

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8" ?>
<Products>
  <Product name="All">
    <!-- étape1 -->
    <Task label="etape blablabla 1" RequiredFor="test1"/>
    <!-- étape -->
    <Task label="etape blablable 2" RequiredFor="test1"/>
    <!-- étape 3 -->
    <Task label="etape blablable 3" RequiredFor="test2/>

Ce qu'il faudrait que j'arrive a faire dans ma gui est:

1) sélectionner une checkbox (qui correspondrait par exemple à une ligne avec marqué RequiredFor="test1")
2) ensuite a l'aide d'un bouton que j’appellerai "sélectionner des Required identique", que toutes les checkbox ou il y a marqué RequiredFor="test1" soient cochés automatiquement
3) via mon bouton de suppression des cases sélectionnés je pourrais du coup supprimer d'un coup toutes les lignes RequiredFor qui ont le même nom

le code que j'ai pour le moment

Code : Tout sélectionner

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\Adobe_Dreamweaver_XML.ico
#AutoIt3Wrapper_Outfile=..\Tasks-read.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <Array.au3>

FileCopy("etape.xml", "etape-orig.xml", 0)
FileMove ("etape.xml", "etape-modif.xml", 1)

Global $xml = @scriptdir & "\etape-modif.xml"
Global $new_xml = @scriptdir & "\etape.xml"

$txt = FileRead($xml)
Global $array = StringRegExp($txt, '(?s)Task\h+label="([^"]+)', 3)   ; récupère les noms
Global $array2 = StringRegExp($txt, '(?s)\s*<!.+?Task label=[^>]+>', 3)   ; récupère les lignes du xml
; _ArrayDisplay($array2)

$gui = GUICreate("Modification etape.xml pour maj iNot", 790, 400, 5, 50)
$listview = GUICtrlCreateListView("étapes de maj", 10, 10, 235, 330, -1, $LVS_EX_CHECKBOXES)
GUICtrlSendMsg($listview, $LVM_SETCOLUMNWIDTH, 0, 180)
For $i = 0 To UBound($array)-1
   GUICtrlCreateListViewItem($array[$i], $listview)
Next
$edit = GuiCtrlCreateEdit($txt, 250, 10, 530, 380)
;~ GUICtrlCreateLabel("Supression", 20, 350, 80, 25)
$degage = GuiCtrlCreateButton("Supprimer la séléction", 10, 345, 180, 22)
$degageall = GuiCtrlCreateButton("Supprimer jusqu'a la séléction", 10, 373, 180, 22)
$appwiz = GuiCtrlCreateButton("Appwiz", 193, 345, 50, 22)
GUISetState()


While 1
$msg = GUIGetMsg()
Switch $msg
    Case  -3
       Exit
   Case $appwiz
   Run(@ComSpec & " /c " & 'C:\windows\system32\appwiz.cpl', "", @SW_HIDE)
   Case $degage
       WinClose ( "tasks.xml")
    If $array <>"" Then
        $count = _GUICtrlListView_GetItemCount($listview)
        For $i = $count-1 to 0 step -1
        If _GUICtrlListView_GetItemChecked($listview, $i) = True Then
             _GUICtrlListView_DeleteItem($listview, $i)
             $txt = StringReplace($txt, $array2[$i], "")
             _ArrayDelete($array, $i)
             _ArrayDelete($array2, $i)
        EndIf
        Next
        EndIf
       FileDelete($new_xml)
       FileWrite($new_xml, $txt)
       GuiCtrlSetData($edit, $txt)
       Run("notepad.exe " & $new_xml)

   Case $degageall
WinClose ( "etape.xml")
For $i = 0 to _GUICtrlListView_GetItemCount($listview)-1
       If _GUICtrlListView_GetItemChecked($listview, $i) Then
           For $j = 0 To $i
               _GUICtrlListView_SetItemChecked($listview, $j)
           Next
        EndIf
 Next

        If $array <>"" Then
        $count = _GUICtrlListView_GetItemCount($listview)
        For $i = $count-1 to 0 step -1
        If _GUICtrlListView_GetItemChecked($listview, $i) = True Then
             _GUICtrlListView_DeleteItem($listview, $i)
             $txt = StringReplace($txt, $array2[$i], "")
             _ArrayDelete($array, $i)
             _ArrayDelete($array2, $i)
        EndIf
        Next
        EndIf
       FileDelete($new_xml)
       FileWrite($new_xml, $txt)
       GuiCtrlSetData($edit, $txt)
       Run("notepad.exe " & $new_xml)
EndSwitch
Wend
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#8

Message par davzell »

someone ?
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#9

Message par jchd »

Je viens juste de regarder ce sujet, très en diagonale je l'avoue.
Ce qui me saute aux yeux est que la structure générale d'un XML (ou d'un JSON ou autre) est un arbre. En anglais, c'est tree et non pas list. Du coup un treeview semble (de l'extérieur et toujours en diagonale) une structure générique bien plus adaptée qu'un listview.

Après avoir craché ce (gentil) venin, je rentre dans ma coquille car je n'ai rien de plus concret à proposer dans ce contexte.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#10

Message par davzell »

j'ai un peu avancé sur la partir dont je parlé deux messages plus haut mais je me retrouve coincé

► Afficher le texte

fichier xml de test (a nommer tasks-modif.xml pour tester)

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8" ?>
<Products>
  <Product name="All">
    <!--Installation de Microsoft Visual C++ 2012 -->
    <Task label="MicrosoftVisuxl2012Instalation" RequiredFor="xx"/>
    <!-- Installation de Microsoft Visual C++ 2010 -->
    <Task label="MicrosoftVisualInstallation" RequiredFor="xx"/>
    <!--Installation de Microsoft Visual C++ 2008 -->
    <!-- Mise a jour de la plateforme -->
    <Task label="UpdatePlateformDatabase" RequiredFor="1"/>
    <!-- Nettoyage des colonnes de MAJ -->
    <Task label="ViderColonnesUpdate" RequiredFor="1"/>
    <!-- Lance Alert pour faire remonter les informations de nos versions -->
    <Task label="LaunchAlert" RequiredFor="1"/>
  </Product>
</Products>
 
si je coche la première case et ensuite sur le bouton "sélectionner les required", seul mes RequiredFor="xx" sont coché dans la GUI

par contre si je coche les 3 dernières cases et appuie sur le même bouton, toutes les cases sont cochés

je pensais que le problème venait de la partie $req = StringRegExpReplace($array2[$i], '(?s).*For="([^"]+).*', "$1") mais au final je ne trouve pas ce qui pourrait clocher dedans

une idée ?
merci
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#11

Message par orax »

À la ligne 113 If StringInStr($array2[$j], $req) Then _GUICtrlListView_SetItemChecked($listview, $j), $req est comparé à deux lignes complètes au lieu d'être comparé à la valeur de l'attribut RequiredFor (xx ou 1).

Pour $array2[0] j'ai

Code : Tout sélectionner

    <!--Installation de Microsoft Visual C++ 2012 -->
    <Task label="MicrosoftVisuxl2012Instalation" RequiredFor="xx"/>
Il faudrait que $array2[0] = xx pour cet exemple.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#12

Message par davzell »

ok donc ça devrait être mieux comme du coup ?

Code : Tout sélectionner

  For $j = 0 to UBound($array2)-1
                       $req2 = StringRegExpReplace($array2[$j], '(?s).*For="([^"]+).*', "$1")
                        MsgBox(0,"information",$req2)
                      If StringInStr($req2, $req) Then _GUICtrlListView_SetItemChecked($listview, $j)

par contre pour essayer de comprendre, StringInStr cherche bien une valeur dans une valeur donné ?

qu'est ce qui fait que ça ne marche pas quand je lui demande comparer avec la phrase complète ?
Au final ne devrait t'il pas quand même trouver ce que je cherche dans la phrase complète ?
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#13

Message par orax »

davzell a écrit :Au final ne devrait t'il pas quand même trouver ce que je cherche dans la phrase complète ?
Si, c'est justement ce qu'il fait.
Dans la chaîne...

Code : Tout sélectionner

        <!--Installation de Microsoft Visual C++ 2012 -->
        <Task label="MicrosoftVisuxl2012Instalation" RequiredFor="xx"/>
il pourra trouver un 1 alors qu'il ne devrait pas.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
davzell
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 26 sept. 2013 14:15
Status : Hors ligne

Re: [..] Lecture fichier XML et création d'une GUI "dynamiqu

#14

Message par davzell »

c'est ce que je pensais, c'est d’ailleurs dans ce sens que j'ai cherché

mais dans la ligne suivant je n'ai pas de 1 et pourtant il me la sélectionne

Code : Tout sélectionner

    <Task label="MicrosoftVisualInstallation" RequiredFor="xx"/>
    <!--Installation de Microsoft Visual C++ 2008 -->
Répondre