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.
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
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"
Vous savez maintenant comment ouvrir des fichiers plus rapidement qu'avec OpenFileRequester