[Résolu] Problème Drag et Drop ListWiew vers Editor

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

[Résolu] Problème Drag et Drop ListWiew vers Editor

Message 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()
Dernière modification par Shadow le lun. 06/mars/2017 3:20, modifié 1 fois.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Drag et Drop ListWiew vers Editor

Message 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()
  
  
  ; 
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Drag et Drop ListWiew vers Editor

Message 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:

Code : Tout sélectionner

SendMessage_(GadgetID(#Editor), #EM_REPLACESEL, -1, Texte$)
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 ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Drag et Drop ListWiew vers Editor

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Drag et Drop ListWiew vers Editor

Message 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...
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Drag et Drop ListWiew vers Editor

Message 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
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Drag et Drop ListWiew vers Editor

Message 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.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Drag et Drop ListWiew vers Editor

Message 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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Drag et Drop ListWiew vers Editor

Message par Shadow »

Fonctionne pas.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Drag et Drop ListWiew vers Editor

Message 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...
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Drag et Drop ListWiew vers Editor

Message par Ar-S »

Je passe. Plus le temps pour le moment.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Drag et Drop ListWiew vers Editor

Message par Shadow »

Est ce que quelqu’un peut m'aider svp ?
Fred si tu passe par là, est-ce un bug ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Drag et Drop ListWiew vers Editor

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Drag et Drop ListWiew vers Editor

Message par Shadow »

Oui oui mais pourquoi le comportement change ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Drag et Drop ListWiew vers Editor

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre