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.kxfGlobal $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 EndSelectWEnd
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 $guiGlobal $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&dropGlobal $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 NextNextGUISetState(@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)WEndFunc 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)EndFuncFunc quit
() ExitEndFunc
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"
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