Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : ajouter item dans listbox par drag&drop [ Divers / Débutant(e) ] (Also know as)

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

Also know as

Membre Club

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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
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

cirec

Membre Club Administrateur CodeS-SourceS
Salut,

Regarde ton code : il est normal que chaque ajout par un Drag & Drop efface la liste précédente ...
c'est toi qui lui demande : " Titres_musiques.Clear;  "

Le programme ne peut pas lire dans tes pensés, il ne peut donc pas savoir si tu veux ajouter où remplacer les éléments existant.

Il faut revoir la conception du dit programme :
en y ajoutant un bouton " Vider la liste " par exemple
où une CheckBox " Remplacer " 

If  Remplacer.Cheched Then Titres_Musiques.Clear;
// si elle est " Checked " alors on éfface la liste sinon on ajoute à la liste



@+
Cirec

lundi 28 août 2006 à 14:13:57 | Re : ajouter item dans listbox par drag&drop

jinh68

Membre Club

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

Membre Club
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

Membre Club Administrateur CodeS-SourceS

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

Membre Club Administrateur CodeS-SourceS

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)


1 2

Cette discussion est classé 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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 13,588 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.