Les bases du Drag and Drop

Informations pour bien débuter en PureBasic
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Les bases du Drag and Drop

Message par Marc56 »

Peu utilisé alors que très facile en PB, voici un mini tuto sur l’utilisation du drag and drop.

Ici, la méthode de base: le drag and drop de fichier depuis Windows vers une application PB (ouverte)
(Note: Pour faire de même mais sur l'icône d'une application, on se sert de ProgramParameter())

Utilisation classique: ouvrir un fichier en trainant son icône depuis le bureau Windows ou l'explorateur de fichier. C'est utile pour les éditeurs de fichier, les éditeurs de SGBD, les visualiseurs d'image, les lecteurs mp3 etc.

Principe: On déclare une fenêtre (ou un objet) comme pouvant recevoir un fichier.
:!: :arrow: Quand on dit "fichier" (#PB_Drop_Files), ce n'est pas le fichier qui est transmis, mais le chemin d'accès (complet)

Exemple 1: Fichiers envoyés un par un

Code : Tout sélectionner

EnableExplicit

Enumeration 
    #Win
    #Lst
EndEnumeration

OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#Lst, 5, 5, 490, 290)

; On détermine que la fenêtre entière peut recevoir des fichiers depuis l'explorateur
; (#PB_Drop_Files = la fenêtre ne va pas reçevoir le fichier, mais le NOM complet du fichier) 
EnableWindowDrop(#Win, #PB_Drop_Files, #PB_Drag_Copy)


Repeat
    Select WaitWindowEvent()
            
        Case #PB_Event_CloseWindow 
            End
            
        Case #PB_Event_WindowDrop
            AddGadgetItem(#Lst, -1, EventDropFiles()) 
            
    EndSelect
    
ForEver

End
Exemple 2: envoyer plusieurs fichiers en même temps.
Dans ce cas, l'application reçoit tous les fichiers dans la même variable, ils sont séparés par un Chr(10). If suffit donc de séparer les éléments.

Code : Tout sélectionner

EnableExplicit

Enumeration 
    #Win
    #Lst
EndEnumeration

Define Drop_Files$
Define Nb_Files
Define i

OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#Lst, 5, 5, 490, 290)

; On détermine que la fenêtre entière peut recevoir des fichiers depuis l'explorateur
; (#PB_Drop_Files = la fenêtre ne va pas reçevoir le fichier, mais le NOM complet du fichier) 
EnableWindowDrop(#Win, #PB_Drop_Files, #PB_Drag_Copy)


Repeat
    Select WaitWindowEvent()
            
        Case #PB_Event_CloseWindow 
            End
            
        Case #PB_Event_WindowDrop
            ; Stocker le lot de fichiers
            Drop_Files$ = EventDropFiles()
            ; Compter les fichiers en comptant les sauts de ligne
            Nb_Files = CountString(Drop_Files$, Chr(10))
            
            ; S'il y en a au moins 1 alors couper la chaine
            ; puis les ajouter
            If Nb_Files > 0
                For i = 1 To Nb_Files
                    AddGadgetItem(#Lst, -1, StringField(Drop_Files$, i, Chr(10))) 
                Next
            Else
                ; Un seul
                AddGadgetItem(#Lst, -1, Drop_Files$) 
            EndIf
    EndSelect
    
ForEver

End


Considérations:
- EnableWindowDrop() C'est toute la fenêtre qui permet de recevoir le(s) fichier(s) peut importe les gadgets qui recouvrent.
pour ne recevoir que sur certains éléments c'est EnableGadgetDrop()
- Pour ne prendre que les fichiers intéressants, il suffit de filtrer chaque fichier à l'arrivé avec GetExtensionPart()
Exemple dans mon lecteur multimedia, le drop de dossier ne prend que les fichier de musique lus par la lib movie de PB.
Erreur classique: Penser à la différence majuscule/minuscule (utiliser Ucase() pour tout mettre en majuscules)

Code : Tout sélectionner

Select UCase(GetExtensionPart(Drop_File$))
                    Case "M4A", "FLAC", "MP3", "OGG", "WAV" 
Voilà, c'est aussi simple que cela.
Vous savez maintenant comment ouvrir des fichiers plus rapidement qu'avec OpenFileRequester

:wink: