Page 1 sur 1

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

Posté : jeu. 21 nov. 2013 17:18
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

Re: lecture fichier xml et création d'une gui "dynamique"

Posté : jeu. 21 nov. 2013 19:31
par mikell
Merci de mettre le titre du sujet en conformité avec le règlement du forum

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

Posté : ven. 22 nov. 2013 22:03
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 ^^

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

Posté : lun. 25 nov. 2013 15:15
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 ?

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

Posté : lun. 25 nov. 2013 17:41
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

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

Posté : mar. 26 nov. 2013 11:50
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) ?

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

Posté : ven. 06 mars 2015 13:35
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

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

Posté : jeu. 23 avr. 2015 17:23
par davzell
someone ?

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

Posté : jeu. 23 avr. 2015 23:09
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.

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

Posté : jeu. 02 juil. 2015 14:22
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

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

Posté : jeu. 02 juil. 2015 17:18
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.

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

Posté : ven. 03 juil. 2015 11:20
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 ?

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

Posté : ven. 03 juil. 2015 16:15
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.

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

Posté : lun. 06 juil. 2015 09:10
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 -->