Accueil > Forum > > > > ajouter item dans listbox par drag&drop
ajouter item dans listbox par drag&drop
lundi 28 août 2006 à 12:20:12 |
ajouter item dans listbox par drag&drop

Also know as
|
Bonjour,
Voilà j'ai un problème depuis quelques temps qui m'énerve quelque peu car je m'acharne à trouver une solution mais je tourne autour du pot sans trouver une solution.
J'ai créer une ListBox acceptant le drag&drop. Elle accepte uniquement les formats audio.
Mais voilà je souhaite pouvoir RAJOUTER une fichier audio par la suite sans écraser les autres. Mais je n'y arrive pas voici ma source :
procedure Tfiche_principale.TraiteMessage(var Msg: TMsg; var Handled: Boolean); // Dans FormCreate, on a mis Application.OnMessage := TraiteMessage; // c'est donc cette procédure qui est appelée à chaque fois que se déclenche l'évènement OnMessage (c'est à dire à chaque fois que Windows envoie un message à l'application) // faire attention cette procédure est appelé très souvent par Windows d'où le if dés le départ. var NombreDeFichiers,size,i:integer; NomDuFichierStr:string; NomDuFichier:array[0..255] of char; Nbfichiers: Integer; begin if Msg.message=WM_DROPFILES then begin NombreDeFichiers:= DragQueryFile( Msg.wParam, $FFFFFFFF, NomDuFichier, sizeof(NomDuFichier));// récupération du nombre de fichiers NbFichiers := NombreDeFichiers; for i:=0 to NombreDeFichiers-1 do begin size:= DragQueryFile( Msg.wParam, i, NomDuFichier, sizeof(NomDuFichier) );// récupération du nom du fichier NomDuFichierStr:=NomDuFichier; // tansformation du tableau de char en STRING if ((ExtractFileExt(NomDuFichierStr) = '.mp3') or (ExtractFileExt(NomDuFichierStr) = '.wma') or (ExtractFileExt(NomDuFichierStr) = '.wav')) then // Vérifie si l'extension des fichiers sélectionnés est bien un fichier audio begin // Si c'est le cas... if Titres_musiques.Items[0] = '' then // Si la première ligne est vide alors c'est que le tableau est vide begin Titres_musiques.Clear; // On le vide pour enlever la phrase du drag&drop SetLength(Chemin_musiques, NombreDeFichiers); // Règle la taille du tableau Chemin_musiques[i] := NomDuFichierStr; // Ajoute le chemin complet de la musique dans le tableau Titres_musiques.Items[i] := ExtractFileName(NomDuFichierStr); //Ajoute le titre de la musique dans la ListBox ShowMessage(IntToStr(NbFichiers)); //Savoir combien il à détecté de fichiers au moment du drag&drop ShowMessage(IntToStr(i)); // Ou en est "i" end else begin SetLength(Chemin_musiques, NombreDeFichiers + NbFichiers); Chemin_musiques[i] := NomDuFichierStr; Titres_musiques.Items[i] := ExtractFileName(NomDuFichierStr); //ShowMessage(IntToStr(NbFichiers)); //ShowMessage(IntToStr(i)); end; end; end; end; end;
Pourriez-vous s'il vous plait me donner une solution qui puisse enfin régler mes problèmes ?
Les "ShowMessage" sont personnels, ils me servent à m'y retrouver justement dans mes tests, mais bon là je bloque...
Merci d'avance
|
|
lundi 28 août 2006 à 13:03:04 |
Re : ajouter item dans listbox par drag&drop

jinh68
|
Salut,
Ton problème est assez fréquent.
Pour accepter le Drag&Drop de fichiers depuis l'explorateur Windows, il faut utiliser l'API DragAcceptFiles. Seulement dans le cas présent, tu veux que ça soit ta ListBox qui accepte le drop de fichiers.
Donc le message WM_DROPFILES lui sera directement envoyé si tu indiques son Handle. C'est pour cela que le message ne passera pas dans la file à destination de ton application(cela m'étonne, j'avoue, mais j'ai fait la constatation après tests).
Deux choix à première vue s'offrent à toi:
- Tu utilises le Handle de ta fiche principale, avec la routine procedure DropFilesMessage(var Msg:TMsg); message WM_DROPFILES; et tu regardes si la souris est dans le rectangle de ta ListBox.
- Tu crées une classe dérivée de TListBox qui capte le message WM_DROPFILES et tu crées un évènement associé(libre cours à ton imagination).
j!nH
|
|
lundi 28 août 2006 à 13:17:17 |
Re : ajouter item dans listbox par drag&drop

Also know as
|
En fait mon problème ne réside pas dansle fait de pouvoir faire ou non un drag&dropca y'a pas de soucis, mais 'est plus dans le fait de ceci :
- je met par drag&drop deux musiques - Oh! flut j'enai oublié une je souhaite la rajouter, et donc je prend cette nouvelle musique et je l'ajoute mais ma source ne l'ajoute pas mais la remplace par la première.
Et je cherche le moyen que si je souhaite à rajouter une musique il me le mette à la suite des autres et non pas les remplacer.
Merci en tout cas pour ton explication très précise.
@+
|
|
lundi 28 août 2006 à 13:19:27 |
Re : ajouter item dans listbox par drag&drop

jinh68
|
Erf, pourtant ton code ne marchait pas chez moi....
j!nH
|
|
lundi 28 août 2006 à 13:25:15 |
Re : ajouter item dans listbox par drag&drop

Also know as
|
Oui en effet mon code ne fonctionné pas car jen'aipas mis TOUT le code source permettant justement de faire un drag&drop, mais maintenant si tu testes ce que j'ai dis au dessus tu verras qu'il y'a un problème, et je cherche à trouver un soluce, tu saurais ?
|
|
lundi 28 août 2006 à 13:47:51 |
Re : ajouter item dans listbox par drag&drop
|
lundi 28 août 2006 à 14:13:57 |
Re : ajouter item dans listbox par drag&drop

jinh68
|
Pfff j'ai pas les yeux en face des trous aujourd'hui...
Merci pour ta clairvoyance Cirec...
j!nH
|
|
lundi 28 août 2006 à 15:56:50 |
Re : ajouter item dans listbox par drag&drop

Also know as
|
En effet Cirec tu as en partie raison.
Mais si tu suis bien mon programme il n'efface la listbox que quand la ligne N°1 est vide !
if Titres_musiques.Items[0] = '' then blabla...
(En fait j'ai écrit "Glisser-déposer ici vos musique" mais là la 5e ligne de mon tableau donc les précédentes sont vide voilà pourquoi il faut que je vide mon tableau avant de le remplir.)
Je sais que cela vient du fait que je dois jouer avec une variable pour savoir combien il à d'items jusque là.
Mais mon problème du coup vient du fait qu'il va falloir agrandir le tableau dynamique et là je bloque, donc je suis concincé, tu pourrais continuer à m'aider cirec ?
Le fait de remplacer ne viendra que plus tard, moi je cherche juste pour le moment à ajouter les titres à lasuite rien de plus...
|
|
mardi 29 août 2006 à 04:35:56 |
Re : ajouter item dans listbox par drag&drop

f0xi
|
fonctionnement logique d'un D&D : Click > glisse > relache = remplace Click+Ctrl > glisse > relache = ajoute on peu egalement faire l'inverse : Click > glisse > relache = ajoute Click+Alt > glisse > relache = remplace car on associe toujours Ctrl a + et Alt a - Croc (click me)
|
|
mardi 29 août 2006 à 05:05:26 |
Re : ajouter item dans listbox par drag&drop

f0xi
|
aller voila le code complet d'un D&D de fichiers simple et efficace... unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) ListBox1: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); private { Déclarations privées } public { Déclarations publiques } procedure ListBoxDrop(var msg : TWMDropFiles) ; message WM_DROPFILES; end;
var Form1: TForm1;
implementation
{$R *.dfm}
uses ShellApi;
procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(ListBox1.Handle, True); ListBox1.Style := lbOwnerDrawVariable; end;
procedure TForm1.FormDestroy(Sender: TObject); begin DragAcceptFiles(ListBox1.Handle, false); end;
procedure TForm1.ListBoxDrop(var msg: TWMDropFiles); var i, BufferSize, FilesCount : integer; FileName : string; begin FilesCount := DragQueryFile(msg.Drop, $FFFFFFFF, nil, 0); BufferSize := MAX_PATH; SetLength(FileName, BufferSize);
ListBox1.Items.BeginUpdate;
for i:= 0 to FilesCount-1 do begin DragQueryFile(msg.Drop, i, PChar(FileName), BufferSize); ListBox1.Items.Add(FileName); end;
ListBox1.Items.EndUpdate; end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with ListBox1 do begin Canvas.FillRect(Rect); Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,ExtractFileName(Items[index])); end; end;
end.
Croc (click me)
|
|
Cette discussion est classée dans : begin, nomdufichier, musiques, nomdufichierstr, nombredefichiers
Répondre à ce message
Sujets en rapport avec ce message
probleme dans mon programme [ par tarik ]
monsieur kerad je crois que j'ai un bug dans mon programme ci-dessousprocedure TForm1.Button1Click(Sender: TObject);begintable1.open;try Table1.First
Pb fermeture d'une appli ouverte à partir d'une autre [ par Sandrine ]
Bonjour,J'ai une application qui possède un bouton permettant d'ouvrir une deuxième application (qui ne possède qu'une fenêtre affichant du texte cont
Variables et conditions (2 quest. de newbie :)) [ par Homer ]
Bonjour,J'ai 2 questions. La première est comment faire une condition du style suivant en delphi:?if (($var1 == "a") AND ($var2 == "b")); [php]La 2e,
Un bug dans Delphi 6 ? [ par Kane ]
Je viens d'ecrire le code suivant sous delphi 6 pro et j'obtient un drole de resultat ! Avant que la feuille devienne progressivement transparente ell
Datamodule et accès à partir d'une form [ par manudel ]
Voilà, je voudrais avoir accès aux événements des objets figurant sur mon datamodule, mais je n'y arrive pas. J'ai l'erreur suivante : "le type de l'e
A nono40 [ par apz ]
Salut,le code suivant me donne l'erreur suivante:Trop de parametres regionaux dans la fonction delete(s, pos(' ',s),1);je crois que le compilateur pou
StrToInt (lettre a) [ par yvemoreau ]
je veux avec une String de un caractere(lettre)soit -transformer ce caractere en int transformer ce caractere en charle tout pour pouvoir utilis
StrToInt (lettre a) [ par yvemoreau ]
je veux avec une String de un caractere(lettre)soit -transformer ce caractere en int transformer ce caractere en charle tout pour pouvoir utilis
Index d'un table Dbase [ par webazard ]
Bonjour, je crée un base Dbase indiqué dans l'aide de delphi en remplacant ttparadox par ttdbase.en supprimant la construction d'index min prog marche
Hints dans une DLL [ par almi ]
J'ai une fenêtre (TForm) qui fonctionne parfaitement dans mon executable.Si je la place dans une DLL, j'obtiens le message :Ne peut assigner TFont à T
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|