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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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:
Dernière modification par Marc56 le ven. 02/sept./2016 8:19, modifié 1 fois.
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message par Zorro »

Merci pour ce rappel Image
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message par Marc56 »

Merci :)
J'en ai bavé un peu pour comprendre au début donc autant partager un exemple courant.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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

~~~~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
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message 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 ! ....
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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.
~~~~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
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message 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
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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à :|
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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.
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message 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


Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message 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 ......
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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: )
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message 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
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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.
Répondre