Page 1 sur 2
[Résolu] Problème Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 15:56
par Shadow
Salut,
J'ai chercher comment faire pour Drag et Drop un élément d'une ListWiew vers un Editor
mais j'ai du mal chercher, pas trouvé, alors j'ai essayé et avancé un peut mais je bloque:
Voici mon début de code, je dois pas être très loins:
Code : Tout sélectionner
Enumeration 1
#Fenetre
#ListView
#Editor
EndEnumeration
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop Liste wiew vers Editor Gadget...", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
EditorGadget(#Editor, 2, 2, 496, 147)
ListViewGadget(#ListView, 2, 151, 496, 147)
For I = 1 To 6
AddGadgetItem(#ListView, -1, "Element n°" + Str(I))
Next
EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
Repeat
Event = WaitWindowEvent(1)
EventWindow = EventWindow()
EventGadget = EventGadget()
EventMenu = EventMenu()
EventType = EventType()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #ListView
TexteDragEtDropListView$ = GetGadgetItemText(#ListView, GetGadgetState(#ListView))
DragText(TexteDragEtDropListView$)
Case #Editor
EndSelect
Case #PB_Event_Menu
Select EventMenu
Case 0
EndSelect
Case #PB_Event_GadgetDrop
Case #PB_Event_CloseWindow
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 16:08
par Ar-S
J'ai énuméré tes éléments de 0 à 5 plutôt que de 1 à 6 ça t'évitera de mauvaises surprises car les listes commencent à 0
Ensuite tout est dans
Case #PB_Event_GadgetDrop
Code : Tout sélectionner
Enumeration 1
#Fenetre
#ListView
#Editor
EndEnumeration
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop Liste wiew vers Editor Gadget...", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
EditorGadget(#Editor, 2, 2, 496, 147)
ListViewGadget(#ListView, 2, 151, 496, 147)
For I = 0 To 5
AddGadgetItem(#ListView, -1, "Element n°" + Str(I))
Next
EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
Repeat
Event = WaitWindowEvent(1)
EventWindow = EventWindow()
EventGadget = EventGadget()
EventMenu = EventMenu()
EventType = EventType()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #ListView
TexteDragEtDropListView$ = GetGadgetItemText(#ListView, GetGadgetState(#ListView))
DragText(TexteDragEtDropListView$)
Case #Editor
EndSelect
Case #PB_Event_Menu
Select EventMenu
Case 0
EndSelect
Case #PB_Event_GadgetDrop
NUM = GetGadgetState(#ListView) ; numéro de l'élément
Titre$ = GetGadgetItemText(#ListView,NUM) ; Text de l'élément numéro NUM
Debug "Ligne : "+NUM
Debug "titre : " +Titre$
; Si tu veux en ajouter les éléments les uns apres les autres
AddGadgetItem(#Editor, -1, Titre$)
; Si tu veux remplacer les textes à chaque fois
; SetGadgetText(#Editor, Titre$)
Case #PB_Event_CloseWindow
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()
;
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 17:21
par Shadow
Super merci Ar'S
Dernière chose, comment faire pour ajouter l'élément
a l’emplacement du curseur dans l'éditeur ?
Avec:
Mais j'aimerais voir le curseur dans l'éditeur et je ne le vois pas quand je Drag...
De plus quand je Drag et Drop du texte de l'éditeur lui même, il me met
l'élément sélectionné dans la ListWiew dans l'éditeur, pas bon ça...
Peut être comme ceci ?:
Code : Tout sélectionner
Enumeration 1
#Fenetre
#ListView
#Editor
EndEnumeration
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop Liste wiew vers Editor Gadget...", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
EditorGadget(#Editor, 2, 2, 496, 147)
ListViewGadget(#ListView, 2, 151, 496, 147)
For I = 0 To 5
AddGadgetItem(#ListView, -1, "Element n°" + Str(I))
Next
EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
Repeat
Event = WaitWindowEvent(1)
EventWindow = EventWindow()
EventGadget = EventGadget()
EventMenu = EventMenu()
EventType = EventType()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #ListView
TexteDragEtDropListView$ = GetGadgetItemText(#ListView, GetGadgetState(#ListView))
DragText(TexteDragEtDropListView$)
Case #Editor
EndSelect
Case #PB_Event_Menu
Select EventMenu
Case 0
EndSelect
Case #PB_Event_GadgetDrop
If TexteDragEtDropListView$ <> ""
NumeroElementListView = GetGadgetState(#ListView) ; Numéro de l'élément sélectionné du ListView
TexteElementListView$ = GetGadgetItemText(#ListView, NumeroElementListView) ; Texte de l'élément sélectionné du ListView
; Ajouter l'éléments les uns apres les autres dans l'editeur.
; AddGadgetItem(#Editor, -1, TexteElementListView$)
; Ajouter l'éléments à la position du curseur dans l'editeur.
SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, TexteElementListView$)
TexteDragEtDropListView$ = ""
EndIf
Case #PB_Event_CloseWindow
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()
Par contre, je vois toujours pas le curseur dans l'éditeur quand le Drag...
Peut être que ça viens de PB et que ont peut pas faire autrement ?
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 18:05
par Ar-S
Pour le curseur tu as tout ici :
http://purebasic.fr/french/viewtopic.php?f=1&t=6319
Et pour placer l'élément aprés le curseur dans ma fonction D&Drop précédente je t'ai mis en commentaire la version pour remplir l'editor.
- Soit tu fais un getgadgettext() de l'editor et tu ajoutes contenu du DND (comme ça pas besoin d'API
- Soit tu places le contenu du DnD via les commandes du lien que je viens de te filer.
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 18:13
par Shadow
Ah merci...
L'éditeur a déjà un drag et drop d'origine en interne et il accepte
aussi les données de d'autre éditeur chose que j’ignorais !
Mais ça ne fonctionne plus du coup avec ce code...
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 18:20
par Marc56
Plus rapide encore: Autant utiliser le texte que le d&d "transporte" (= EventDropText())
https://www.purebasic.com/french/docume ... ptext.html
Code : Tout sélectionner
Case #PB_Event_GadgetDrop
SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, EventDropText())
; C'est tout, Merci PB :-)
Dérivé de l'exemple fourni dans la doc:
https://www.purebasic.com/french/docume ... op.pb.html
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 18:35
par Shadow
Merci à vous
Donc voici le résulta optimisé au mieux:
Code : Tout sélectionner
Enumeration 1
#Fenetre
#ListView
#Editor
EndEnumeration
If OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Drag et Drop ListeWiew vers Editor Gadget...", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
EditorGadget(#Editor, 2, 2, 496, 147)
ListViewGadget(#ListView, 2, 151, 496, 147)
For I = 0 To 5
AddGadgetItem(#ListView, -1, "Élément n°" + Str(I))
Next
EnableGadgetDrop(#Editor, #PB_Drop_Text, #PB_Drag_Copy)
Repeat
Event = WaitWindowEvent(1)
If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
Select EventGadget()
Case #ListView
DragText(GetGadgetItemText(#ListView, GetGadgetState(#ListView)))
Case #Editor
EndSelect
ElseIf Event = #PB_Event_GadgetDrop
Select EventGadget()
Case #Editor
; Ajouter l'éléments les uns apres les autres dans l'editeur.
; AddGadgetItem(#Editor, -1, TexteElementListView$)
; Ajouter l'éléments à la position du curseur dans l'editeur.
SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, EventDropText())
EndSelect
ElseIf Event = #PB_Event_CloseWindow
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Cependant ont ne vois toujours pas le curseur dans l’éditeur pour orienté la position du Drop (Relâcher de la souris)

Je ne sais pas comment faire ça.
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 21:02
par Ar-S
Dans l'API SendMessage_ c'est la constante #EM_SETSEL qu'il va falloir utiliser.
Après ton sendmessage ajoute :
Code : Tout sélectionner
SetActiveGadget(#Editor)
SendMessage_(GadgetID(#Editor), #EM_SETSEL, $fffffff, $fffffff)
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 21:22
par Shadow
Fonctionne pas.
Re: Drag et Drop ListWiew vers Editor
Publié : sam. 04/mars/2017 21:43
par Shadow
Voila, là ça va être très clair:
https://www.dropbox.com/s/7ttw4ss23g2j9 ... m.mp4?dl=0
Scène 1, le curseur de la souris se déplace en même temps que le drag dans l'éditeur
Scène 2, le curseur est invisible...
Re: Drag et Drop ListWiew vers Editor
Publié : dim. 05/mars/2017 0:01
par Ar-S
Je passe. Plus le temps pour le moment.
Re: Drag et Drop ListWiew vers Editor
Publié : lun. 06/mars/2017 0:28
par Shadow
Est ce que quelqu’un peut m'aider svp ?
Fred si tu passe par là, est-ce un bug ?
Re: Drag et Drop ListWiew vers Editor
Publié : lun. 06/mars/2017 0:44
par falsam
Ce n'est pas un bug. L'insertion de ton item se fait au point d'insertion du curseur de l'EditorGadget().
Si tu souhaites placer ton item à un autre endroit de ton EditorGadget() alors place ton curseur d'insertion à un autre endroit de ton éditeur.
Re: Drag et Drop ListWiew vers Editor
Publié : lun. 06/mars/2017 0:59
par Shadow
Oui oui mais pourquoi le comportement change ?
Re: Drag et Drop ListWiew vers Editor
Publié : lun. 06/mars/2017 1:37
par falsam
Shadow a écrit :Dernière chose, comment faire pour ajouter l'élément a l’emplacement du curseur dans l'éditeur ?
Une petite bidouille de ce style pour une début de piste.
Code : Tout sélectionner
Declare Drag()
OpenWindow(0, 0, 0, 800, 600, "Drag & Drop")
EditorGadget(0, 0, 0, 800, 300)
AddGadgetItem(0, -1, LSet("", 20, #CRLF$))
ListViewGadget(1, 0, 305, 800, 300)
For I = 0 To 5
AddGadgetItem(1, -1, "Élément n°" + Str(I))
Next
BindGadgetEvent(1, @Drag())
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Procedure Drag()
DragText(GetGadgetItemText(1, GetGadgetState(1)), #PB_Drag_Copy)
EndProcedure