Page 1 sur 1

Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 8:05
par Marc56
Comme c'est dans les sujets du moments :P
Petit exemple rapide pour les débutants (les anciens connaissent déjà)

Il y a 3 types d'objets pouvant être utilisées en d&d
- Fichiers (sous-entendu: noms de fichiers avec chemin complet)
- Images
- Bloc de texte.

Ci-dessous un exemple pour ajouter des noms de fichiers dans une liste.
C'est l'utilisation la plus simple du système, seulement 2 étapes:
  • Déterminer la "cible" et ce qu'elle peut recevoir avec EnableGadgetDrop()
  • Utiliser l'élément reçu: EventDropFiles()

Code : Tout sélectionner

; Exemple ultra simplifié pour constituer une liste
; de noms de fichiers par drag'n'drop (depuis un programme externe)
; Utile par exemple pour constituer une playliste

Enumeration 
    #Win
    #List_Files
EndEnumeration

OpenWindow(#Win, 0, 0, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#List_Files, 10, 10, 580, 380)

; Autoriser le gadget #List_Files à recevoir des fichiers depuis une fenêtre externe
; (Explorateur de fichier, Bureau, ou tout autre gestionnaire de fichiers)

EnableGadgetDrop(#List_Files, #PB_Drop_Files, #PB_Drag_Copy)

Repeat
    Select WaitWindowEvent()
            
        Case #PB_Event_CloseWindow
            End
            
        Case #PB_Event_GadgetDrop
            If EventGadget() = #List_Files
                AddGadgetItem(#List_Files, -1, EventDropFiles())    
            EndIf
            
    EndSelect
ForEver

End

; EventDropFiles() retourne le chemin complet de chaque fichier
; Utiliser GetFilePart() et autres pour en faire des chemins relatifs
Pour les autres possibilités: voir l'exemple donné dans l'aide
http://www.purebasic.com/french/documen ... index.html

:wink:

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 8:18
par Zorro
Merci pour ce rappel Image

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 8:24
par Marc56
Merci :)
J'en ai bavé un peu pour comprendre au début donc autant partager un exemple courant.

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 9:14
par Ar-S
Le Drag n Drop doit permettre la gestion de plusieurs fichiers, ton exemple ne prend en compte qu'un seul fichier.
Voilà une version un poil plus complète qui vous sera surement utile.
Elle gère la dépose de plusieurs fichiers et affiche le tout par ordre alphabétique.
C'est en partie cette méthode que j'utilise pour mes playlist.

Le chemin complet est stocké dans Fichier()\FullPath$ et le nom de fichier dans Fichier()\File$

Code : Tout sélectionner

; Exemple ultra simplifié pour constituer une liste
; de noms de fichiers par drag'n'drop (depuis un programme externe)
; Utile par exemple pour constituer une playliste
;
; V2 - Ar-S - Ajout d'une liste chainée et d'une structure pour un affichage plus propre des fichiers et par ordre alphabétique.


Enumeration
    #Win
    #List_Files
EndEnumeration


Structure info
  FullPath$
  File$
EndStructure

Global NewList Fichier.info()


OpenWindow(#Win, 0, 0, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#List_Files, 10, 10, 580, 380)

; Autoriser le gadget #List_Files à recevoir des fichiers depuis une fenêtre externe
; (Explorateur de fichier, Bureau, ou tout autre gestionnaire de fichiers)

EnableGadgetDrop(#List_Files, #PB_Drop_Files, #PB_Drag_Copy)

Repeat
    Select WaitWindowEvent()
           
        Case #PB_Event_CloseWindow
            End
           
        Case #PB_Event_GadgetDrop
          
          If EventGadget() = #List_Files
            FichierDrop$ = EventDropFiles()
            ; On compte le nombre de fichier déposé
            NbrFichier  = CountString(FichierDrop$, Chr(10)) + 1 ; on utilise +1 car 1er élément = 0
            Debug Str(NbrFichier) + " fichiers déposé(s)"
            
            ; On stock le nom seul et le chemin complet dans notre liste structurée
             For i = 1 To NbrFichier  
              AddElement(Fichier())
              Fichier()\FullPath$ = StringField(FichierDrop$, i, Chr(10))
              Fichier()\File$     = GetFilePart( Fichier()\FullPath$ )
            Next  
          EndIf  
            
            ; Classement par ordre alphabétique
            SortStructuredList(Fichier(), #PB_Sort_Ascending, OffsetOf(info\File$), TypeOf(info\FullPath$))

            ;Affichage des fichiers
            ForEach fichier()
              AddGadgetItem(#List_Files, -1, Fichier()\File$)   
            Next
            
           
    EndSelect
ForEver

End


Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 9:38
par Zorro
@Ar-s , ne marche pas chez moi !

j'ai le panneau Stationnement interdit qui remplace le pointeur
si j'essai de poser un fichier sur la fenetre ! ....

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 9:54
par Marc56
(pour les débutants toujours)

Une version très 'lite' (sans réalisation de liste et donc non triée)
Tenir la touche CTRL ou MAJ pour sélectionner les fichiers dans l'explorateur

Technique: Le d&d passe toujours tous les fichiers en une seule chaine séparée par des chr(10)
il suffit donc de découper avec StringField()

Code : Tout sélectionner

; Drag and drop de multiples fichiers

Enumeration 
    #Win
    #List_Files
EndEnumeration

OpenWindow(#Win, 0, 0, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#List_Files, 10, 10, 580, 380)
EnableGadgetDrop(#List_Files, #PB_Drop_Files, #PB_Drag_Copy)

Repeat
    Select WaitWindowEvent()
            
        Case #PB_Event_CloseWindow
            End
            
        Case #PB_Event_GadgetDrop
            If EventGadget() = #List_Files
                For i = 1 To CountString(EventDropFiles(), Chr(10)) + 1
                    AddGadgetItem(#List_Files, -1, StringField(EventDropFiles(), i, Chr(10))) 
                Next
            EndIf
            
    EndSelect
ForEver
:wink:

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 10:10
par Ar-S
@Zorro
Ah ba je ne vois pas pourquoi ça ne fonctionne pas...
J'ai testé en 5.50 x64 et 5.43 x86 et ça marche.. :idea:
Tu as essayé sous EPB ou sous l'editeur officiel ? (sait on jamais)

@Marc56
Technique: Le d&d passe toujours tous les fichiers en une seule chaine séparée par des chr(10)
il suffit donc de découper avec StringField()
Tout à fait, il est donc judicieux d'utiliser GetExtensionPart() pour filtrer les fichiers que l'on veut récupérer.
Pour être totalement complet, j'utilise 2 listes chainées.
- une 1ere liste qui choppe tous les fichiers
- je la trie par ordre alphabétique (comme ça c'est fait)
- Je crées une seconde liste qui n'enregistrera que les types de fichiers désirés de la 1ere liste.
- Je vide la 1ere liste (comme ça on pourra ajouter des fichiers)
- J'affiche cette seconde liste dans mon listview.

ça permet non seulement un filtre efficace mais surtout ça permet de gérer par la suite cette playlist si on désire supprimer / ajouter des éléments facilement dans le listview.

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 10:23
par Zorro
Ar-S a écrit :@Zorro
Tu as essayé sous EPB ou sous l'editeur officiel ? (sait on jamais)
ben oui , ça viens encore de EPB !! :roll:

j'utilise deja le Drag and Drop avec EPB
peut etre que c'est bloquant ?

un prg qui utilise le Drag and Drop, ne pourrai lancer un prg qui utilise le Drag en Drop !!??
je ferai le test en désactivant mon Drag and Drop EPB ...

[reedit]
Tain ! meme en désactivant le Drag and Drop de EPb, ça ne marche pas !!
franchement je ne comprends pas !! 8O 8O

la fenetre s'affiche , seul le Drag and Drop semble bloqué sur mon editeur !!
je ne vois aucune raisons a ça


peut etre un blocage lié a la commande de compilation par Shell .???

tout se passe comme si la commande

Code : Tout sélectionner

EnableGadgetDrop(#List_Files, #PB_Drop_Files, #PB_Drag_Link)
n'avait aucun effet ! 8O 8O

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 11:26
par Marc56
Zorro a écrit : tout se passe comme si la commande

Code : Tout sélectionner

EnableGadgetDrop(#List_Files, #PB_Drop_Files, #PB_Drag_Link)
n'avait aucun effet ! 8O 8O
#PB_Drag_Link ?

Code : Tout sélectionner

EnableGadgetDrop(#List_Files, #PB_Drop_Files, #PB_Drag_Copy)
#PB_Drag_Copy
:wink:

Edit: Cela dit, ça marche aussi avec #PB_Drag_Link, donc ton problème ne vient pas de là :|

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 13:26
par Marc56
Tu as peut-être avec EPB le même comportement que pour Total Commander:
Je me suis rendu compte que si je lance mon Desk depuis TC, le d&d ne marche pas mais marche si lancé par un raccourci ou depuis l'explorateur
Même comportement avec le nouveau Tiny Mod Player d'Ar-S : lancé depuis TC: pas de d&d
alors que depuis le bureau ou depuis l'explorateur Windows, ça marche.

Ton EPB génère peut-être et lance l'EXE temporaire dans un espace mémoire sans communication ?

Pour info, dans mon desk, les programmes sont lancés par un simple RunProgram( sans aucun paramètre supplémentaire.
L'exe est compilé sans gestion des threads.
Les programmes lancés utilisant le d&d fonctionnent.

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 13:56
par Zorro
je sais pas, c'est louche !!

pour testé j'ai fais ce code :

qui est un resumé de ce que fais EPB lorsqu'on lance une compilation ....
ce code qui compile le code de la variable Code.s , puis lance le code apres l'avoir ecris sur disque, la fenetre s'ouvre, et attends qu'on Drop un ou plusieurs fichiers (version d'AR-s)

sous l'editeur officiel, fonctionne (le Drag and Drop) !!
si je le lance le meme code a partir de EPB le drag and Drop ne fonctionne pas !!

et là , je ne comprends pas pourquoi .....

jusqu'a la rencontre de ce probleme avec le Drag and Drop , avec EPB je n'ai jamais eu de soucis pour lancer un code ...
meme 3D .....

je ne vois vraiment pas ce qui peut bloquer le Drag and Drop !! lorsque le code est generé par EPB ... 8O

Code : Tout sélectionner


code.s="Enumeration"+chr(13)
code.s+"		#Win"+chr(13)
code.s+"		#List_Files"+chr(13)
code.s+"EndEnumeration"+chr(13)
code.s+"Structure info"+chr(13)
code.s+"		FullPath$"+chr(13)
code.s+"		File$"+chr(13)
code.s+"EndStructure"+chr(13)
code.s+"Global NewList Fichier.info()"+chr(13)
code.s+"OpenWindow(#Win, 0, 0, 600, 400, "+chr(34)+chr(34)+", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)"+chr(13)
code.s+"ListViewGadget(#List_Files, 10, 10, 580, 380)"+chr(13)
code.s+"EnableGadgetDrop(#List_Files, #PB_Drop_Files, #PB_Drag_Link)"+chr(13)
code.s+"Repeat"+chr(13)
code.s+"		Select WaitWindowEvent(2)"+chr(13)
code.s+"		Case #PB_Event_CloseWindow"+chr(13)
code.s+"				End"+chr(13)
code.s+"		Case #PB_Event_GadgetDrop"+chr(13)
code.s+"				Select EventGadget()"+chr(13)
code.s+"				Case  #List_Files"+chr(13)
code.s+"						FichierDrop$ = EventDropFiles()"+chr(13)
code.s+"						NbrFichier  = CountString(FichierDrop$, Chr(10)) + 1 ; on utilise +1 car 1er élément = 0"+chr(13)
code.s+"						Debug Str(NbrFichier) + "+chr(34)+" fichiers déposé(s)"+chr(34) +""+chr(13)
code.s+"						For i = 1 To NbrFichier "+chr(13)
code.s+"								AddElement(Fichier())"+chr(13)
code.s+"								Fichier()\FullPath$ = StringField(FichierDrop$, i, Chr(10))"+chr(13)
code.s+"								Fichier()\File$     = GetFilePart( Fichier()\FullPath$ )"+chr(13)
code.s+"						Next "+chr(13)
code.s+"				EndSelect"+chr(13)
code.s+"				SortStructuredList(Fichier(), #PB_Sort_Ascending, OffsetOf(info\File$), TypeOf(info\FullPath$))"+chr(13)
code.s+"				ForEach fichier()"+chr(13)
code.s+"						AddGadgetItem(#List_Files, -1, Fichier()\File$)"+chr(13)   
code.s+"				Next"+chr(13)
code.s+"		EndSelect"+chr(13)
code.s+"ForEver"+chr(13)
code.s+"End"+chr(13)

#file=1
path_prg.s=GetCurrentDirectory()

if Filesize(path_prg.s+"test_drag.pb")>0
		DeleteFile(path_prg.s+"test_drag.pb")
Endif

OpenFile(#file,path_prg.s+"test_drag.pb")
		WriteString(#file,code.s,#pb_Ascii)
CloseFile(#file)

AdresseSourcePB$ = path_prg.s+"test_drag.pb"
AdresseExe$ = path_prg.s+"test_drag.exe"
; Pour compiler une source
parametre.S="  /debugger  /exe  "
path$ = #PB_Compiler_Home+"Compilers\PBCompiler.exe"
RunProgram(path$, AdresseSourcePB$+parametre.S+AdresseExe$, "") 
RunProgram(AdresseExe$) ; lance le prg



Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 14:14
par Zorro
ha mais j'ai compris !!!


comme tu le soupçonnais Marc56

un prg qui lance un prg qui gere le Drag and Drop , ça desactive le Drag and Drop !!

par exemple en compilant le prg avec EPB , celui-ci est ensuite lancé par EPB , ben, pas de Drag and Drop !

par contre si on va lancer avec le navigateur Windows, le Exe généré par EPB , là le Drag and Drop fonctionne !!! :)

pourtant l'editeur Officiel peut lui , exécuter et avoir avec succes, le Drag and Drop sur le prg qu'il viens de compiler !!!

je me demande qu'elle procedure il utilise pour lancer le prg Exe créé !!! ???

si ça se trouve , il utilise ShellExecute au lieu de Run Program comme je le fais avec EPB ......

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 14:28
par Marc56
Essayes aussi à tout hasard, quelques paramètres de runprogram
#PB_Program_Open | #PB_Program_Read | #PB_Program_Write
http://www.purebasic.com/french/documen ... ogram.html
Possible que sans, le programme appelant "garde" les fonctions du d&d pour lui
(bon, je délire peut-être totalement ? :roll: :mrgreen: mais c'est facile d'essayer :wink: )

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 14:53
par Zorro
non c'est pas ça !!

j'ai meme testé avec ShellExecute_() ça ne change rien !!

tain, mais il font comment avec l'editeur Officiel ? 8O

Re: Exemple de constitution d'une playliste par drag'n'drop

Publié : ven. 02/sept./2016 15:16
par Marc56

Code : Tout sélectionner

RunProgram(path$, AdresseSourcePB$+parametre.S+AdresseExe$, "")
RunProgram(AdresseExe$) ; lance le prg
Il y a un binz là:
Dans ton système le deuxième RunProgram lance programme généré sans attendre la fin de la compilation :?
(pas de #PB_Program_Wait dans le premier RunProgram)

C'est pour cela que lors de mon premier lancement il ne s'est rien passé: le compilateur en ligne n'avait pas fini 8O

:arrow: Donc potentiellement à chaque lancement tu lances la compilation précédente :oops:

Ça n'explique pas le problème, mais déjà ça décale d'un cran toutes les modifications que tu peux faire.