[R] Drag and drop entre list

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

[R] Drag and drop entre list

#1

Message 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
Modifié en dernier par jl56 le lun. 17 sept. 2018 19:02, modifié 1 fois.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [.] Drag and drop entre list

#2

Message 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
Fichiers joints
_GUIXViewEx.au3
(24.88 Kio) Téléchargé 360 fois
_GUIRegisterMsg.au3
(2.61 Kio) Téléchargé 363 fois
_ArrayEx.au3
(17.47 Kio) Téléchargé 358 fois
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [.] Drag and drop entre list

#3

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [.] Drag and drop entre list

#4

Message par mikell »

Listview style : $LVS_NOCOLUMNHEADER
" 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: [.] Drag and drop entre list

#5

Message 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
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [.] Drag and drop entre list

#6

Message 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
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 411
Enregistré le : mer. 24 oct. 2007 22:42
Localisation : 56000
Status : Hors ligne

Re: [.] Drag and drop entre list

#7

Message 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
Répondre