[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 : 359
Enregistré le : mer. 24 oct. 2007 21:42
Localisation : 56000
Status : Hors ligne

[R] Drag and drop entre list

#1

Message par jl56 » jeu. 13 sept. 2018 20:24

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 18:02, modifié 1 fois.

Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1743
Enregistré le : mar. 22 juil. 2008 20:55
Localisation : Nantes
Status : Hors ligne

Re: [.] Drag and drop entre list

#2

Message par TommyDDR » ven. 14 sept. 2018 14:29

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é 22 fois
_GUIXViewEx.au3
(24.88 Kio) Téléchargé 22 fois
_GUIRegisterMsg.au3
(2.61 Kio) Téléchargé 20 fois
_GUIRegisterMsg.au3
(2.61 Kio) Téléchargé 20 fois
_ArrayEx.au3
(17.47 Kio) Téléchargé 24 fois
_ArrayEx.au3
(17.47 Kio) Téléchargé 24 fois
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

Avatar du membre
jl56
Niveau 7
Niveau 7
Messages : 359
Enregistré le : mer. 24 oct. 2007 21:42
Localisation : 56000
Status : Hors ligne

Re: [.] Drag and drop entre list

#3

Message par jl56 » sam. 15 sept. 2018 04:26

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
Modérateur
Modérateur
Messages : 5749
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : En ligne

Re: [.] Drag and drop entre list

#4

Message par mikell » sam. 15 sept. 2018 08:39

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 : 359
Enregistré le : mer. 24 oct. 2007 21:42
Localisation : 56000
Status : Hors ligne

Re: [.] Drag and drop entre list

#5

Message par jl56 » dim. 16 sept. 2018 11:11

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 : 1743
Enregistré le : mar. 22 juil. 2008 20:55
Localisation : Nantes
Status : Hors ligne

Re: [.] Drag and drop entre list

#6

Message par TommyDDR » dim. 16 sept. 2018 12:14

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 : 359
Enregistré le : mer. 24 oct. 2007 21:42
Localisation : 56000
Status : Hors ligne

Re: [.] Drag and drop entre list

#7

Message par jl56 » dim. 16 sept. 2018 12:48

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