Page 1 sur 1

[R] Drag and drop entre list

Posté : jeu. 13 sept. 2018 21:24
par jl56
Bonjour a tous,

j'aimerais utiliser le drag and drop pour ranger des éléments entre 2 listes
je ne trouve pas d'exemple a part vers un input voir mon malheureux code
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=C:\pi\forum\test drag drop.kxf
Global $Form1_1 = GUICreate("Form1", 616, 438, 192, 124)
Global $List1 = GUICtrlCreateListView("Animaux", 42, 34, 129, 240)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
Global $List1_0 = GUICtrlCreateListViewItem("Ananas", $List1)
Global $List1_1 = GUICtrlCreateListViewItem("Canard", $List1)
Global $List1_2 = GUICtrlCreateListViewItem("Chat", $List1)
Global $List1_3 = GUICtrlCreateListViewItem("Chien", $List1)
Global $List1_4 = GUICtrlCreateListViewItem("Poule", $List1)
Global $List2 = GUICtrlCreateListView("Fruit", 321, 38, 121, 240)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
Global $List2_0 = GUICtrlCreateListViewItem("Cerise", $List2)
Global $List2_1 = GUICtrlCreateListViewItem("Poire", $List2)
Global $List2_2 = GUICtrlCreateListViewItem("Pomme", $List2)
Global $List2_3 = GUICtrlCreateListViewItem("Raisin", $List2)
Global $List2_4 = GUICtrlCreateListViewItem("Renard", $List2)
Global $Input1 = GUICtrlCreateInput("", 123, 322, 121, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
   $msg = GUIGetMsg()
   Select
      Case $msg = $GUI_EVENT_CLOSE
         Exit

   EndSelect

WEnd
Si vous avez des suggestions sur le sujet

Je vous en remercie

A+

JL56

Re: [.] Drag and drop entre list

Posté : ven. 14 sept. 2018 15:29
par TommyDDR
Tenez, ce code devrait vous convenir (j'ai mis des commentaires pour détailler un peu)
Pensez à télécharger les 3 UDFs joints
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <Misc.au3>
#include "_GUIXViewEx.au3"

Opt("GUIOnEventMode", 1)
Opt("MustDeclareVars", 1)

Global $gui
Global $taille[2] = [300, 300]
Global $list[2]
Global $titresListes = ["Animaux", "Fruits"]
Global $textesListes = [["Ananas", "Canard", "Chat", "Chien", "Poule"], _
                  ["Cerise", "Poire", "Pomme", "Raisin", "Renard"]]
Global $startDragList = -1 ; Permet de stocker la liste qui a débuté le drag&drop
Global $startDragItem = -1

$gui = GUICreate("", $taille[0], $taille[1])
GUISetOnEvent($GUI_EVENT_CLOSE, "quit", $gui)
For $i = 0 To UBound($list, 1) - 1
   ConsoleWrite($i & @CRLF)
   $list[$i] = GUICtrlCreateListView($titresListes[$i], 160 * $i, 0, 140, 300)
   _GUICtrlXView_SetConf($list[$i], false, false) ; Permet de rendre "joli" la selection dans une liste (passez le 1er false à true pour activer le tri par clic sur les colones)
   _GUICtrlXView_SetOnEvent($list[$i], startDrag, $LVN_BEGINDRAG) ; On appelle la fonction startDrag quand l'evenement de début de drag&drop intervient
   For $j = 0 To UBound($textesListes, 2) - 1
      GUICtrlCreateListViewItem($textesListes[$i][$j], $list[$i]) ; Remplissage des listes
   Next
Next

GUISetState(@SW_SHOW, $gui)

While(True)
   If($startDragItem >= 0 And Not(_IsPressed("01"))) Then ; Un drag&drop est en cours et la souris ne clic plus, on vient donc de drop
      Global $g_tStruct = DllStructCreate($tagPOINT)        ; On récupère
      DllStructSetData($g_tStruct, "x", MouseGetPos(0))     ; le handle du
      DllStructSetData($g_tStruct, "y", MouseGetPos(1))     ; control sous
      Local $endDragList = _WinAPI_WindowFromPoint($g_tStruct); la souris
      Local $hitTest = _GUICtrlListView_HitTest($endDragList)  ; On récupère le numéro de l'item
      Local $endDragItem = $hitTest[0]                   ; sous la souris
      Local $id = _GUICtrlListView_MapIndexToID($startDragList, $startDragItem)  ; On stock l'ID (ID = numéro fixe qui ne change pas même si l'élément bouge dans la liste)
                                                               ; Cela servira si on drag&drop au sein d'une même liste car les éléments vont bouger
      _GUICtrlListView_InsertItem($endDragList, _GUICtrlListView_GetItemText($startDragList, $startDragItem), $endDragItem) ; On ajoute l'item dans la liste de destination
      _GUICtrlListView_DeleteItem($startDragList, _GUICtrlListView_MapIDToIndex($startDragList, $id)) ; On supprime l'item dans la liste d'origine
      $startDragList = -1 ; On réinitialise les
      $startDragItem = -1 ; variables temporaires
   EndIf
   Sleep(10)
WEnd

Func startDrag($hwnd, $event) ; Un drag&drop a été initialisé
   $startDragList = $hwnd ; On stock la liste qui l'a initialisé (pour avoir la liste de l'élément à déplacer)
   $startDragItem = _GUICtrlListView_GetSelectedIndice($hwnd) ; On stock l'item selectionné (pour avoir l'élément à déplacer)
EndFunc


Func quit()
   Exit
EndFunc

Re: [.] Drag and drop entre list

Posté : sam. 15 sept. 2018 05:26
par jl56
Bonjour à tous,

@TommyDDR
Merci beaucoup c'est bluffant et très instructif
Merci pour vos commentaires précieux

Une dernière question comment ne pas afficher le titre de la liste.
Je ne voudrai afficher que les éléments de la liste ( j'ai tenté de ne pas mettre de titre mais cela laisse une ligne vide)

A+
JL56

Re: [.] Drag and drop entre list

Posté : sam. 15 sept. 2018 09:39
par mikell
Listview style : $LVS_NOCOLUMNHEADER

Re: [.] Drag and drop entre list

Posté : dim. 16 sept. 2018 12:11
par jl56
Bonjour à tous,

@mikell

Merci au début j'avais un peu honte de ne pas l'avoir trouvé l'info dans l'aide mais a dire vrai, j'utilise koda et ce style n'y est pas présent
pour mes listes j'utilise _GUICtrlListView_SetExtendedListViewStyle et la non plus ce n'est pas présent.

j'ai repris un example pour faire quelques tests et j'ai un phénomène curieux, le comportement de la liste diffère selon le mode d'application du style!
voir code ci-dessous
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>

Example()

Func Example()
   Local $hImage, $hListView

   ; Create GUI
   GUICreate("ListView Set Extended Style", 400, 300)
;~    $hListView = GUICtrlCreateListView("", 2, 2, 394, 268 ,$LVS_NOCOLUMNHEADER)  ; cette ligne toute seule fonctionne

   $hListView = GUICtrlCreateListView("", 2, 2, 394, 268)   ;ces deux lignes
   GUICtrlSetStyle($hListView  ,$LVS_NOCOLUMNHEADER)  ;modifie l'aspet de la liste

   _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
   GUISetState(@SW_SHOW)

   ; Load images
   $hImage = _GUIImageList_Create()
   _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
   _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
   _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
   _GUICtrlListView_SetImageList($hListView, $hImage, 1)

   ; Add columns
   _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
   _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
   _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

   ; Add items
   _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
   _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1, 1)
   _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2, 2)
   _GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
   _GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1, 2)
   _GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)

   ; Loop until the user exits.
   Do
   Until GUIGetMsg() = $GUI_EVENT_CLOSE
   GUIDelete()
EndFunc   ;==>Example
comme je l'ai dit j'utilise Koda a chaque modification de ma gui je dois retrouver les lignes de code de mes créations de listes pour y ajouter ,$LVS_NOCOLUMNHEADER

ça fonctionne mais c'est dommage de faire comme ça

A+

JL56

Re: [.] Drag and drop entre list

Posté : dim. 16 sept. 2018 13:14
par TommyDDR
Le solution serait d'utiliser Koda pour "apprendre" et ne pas l'utiliser pour faire le programme :)
Un des gros problèmes de Koda, c'est lors de la création en "chaine"
Global $List1_0 = GUICtrlCreateListViewItem("Ananas", $List1)
Global $List1_1 = GUICtrlCreateListViewItem("Canard", $List1)
Global $List1_2 = GUICtrlCreateListViewItem("Chat", $List1)
Global $List1_3 = GUICtrlCreateListViewItem("Chien", $List1)
Global $List1_4 = GUICtrlCreateListViewItem("Poule", $List1)
Le nom des variables n'est pas du tout optimisé, la plus part des developpeurs auraient fait un tableau $List1[5] dont chaque cases du tableau auraient contenu un item, cela évite les If($List1_0) blabla If($List1_1) blabla... etc.

Je vous conseille vivement de ne plus utiliser Koda pour la création d'un programme, mais plutôt dans l'apprentissage (pour voir quel effet a telle ou telle option)

Pour les styles que vous ne trouvez pas, ceux-ci ne sont pas propre à AutoIt mais à Windows, vous trouverez toutes les infos que vous voulez en tapant le nom d'un style (sans le $) dans un moteur de recherche, "LVS_NOCOLUMNHEADER" nous amène à la page : https://docs.microsoft.com/en-us/window ... dow-styles

Re: [.] Drag and drop entre list

Posté : dim. 16 sept. 2018 13:48
par jl56
Merci TommyDDR pour votre réponse

Je vous rassure j'utilise des tableaux pour renseigner mes listes.
Je n'utilise Koda que pour la partie graphique de la GUI je le trouve très pratique et visuel pour déplacer/créer/gérer/modifier des éléments de la gui. Dans koda je modifie systématiquement le nom des variables pour que mon code soit plus clair.

le problème de comportement de la liste que je mentionne ci-dessus viens d'un exemple de l'aide d'autoit et non de koda

Merci de l'info

A+

JL56