IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Comment faire un drag&drop dans un ListView depuis l'explorateur Windows ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club

    Inscrit en
    Décembre 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 52
    Points : 63
    Points
    63
    Par défaut Comment faire un drag&drop dans un ListView depuis l'explorateur Windows ?
    Bonjour,

    Je souhaite réaliser un drag and drop depuis l'explorateur windows vers un TListView.

    Lorsque que je passe le handle de ma form contenant la ListView en paramètre à DragAcceptFiles comme ceci il n' y a pas de problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DragAcceptFiles(Handle,true);
    Comme je veux limiter la zone de drag and drop à ma listView je fais ceci:
    je passe le handle de ma ListView comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DragAcceptFiles(ListView.Handle,true);
    le programme n'intercepte pas le message windows du drop.

    Pourquoi?

    Voici la fonction appelé lors du drop du fichier et sa déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       procedure DragDrop(var msg: TWMDropFiles); message WM_DROPFILES;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Form.DragDrop(var msg : TWMDropFiles);
    var nom_fichier : array [0..500] of char;
        nb_fichier,i : integer;
    begin
      //Récupération du nombre de fichier en cours de déplacement
      nb_fichier := DragQueryFile(msg.Drop,$FFFFFFFF,nom_fichier,sizeof(nom_fichier));
     
      for i:= 0 to nb_fichier - 1 do
      begin
        //Récupération du ième fichier
        DragQueryFile(msg.Drop,i,nom_fichier,sizeof(nom_fichier));
         ShowMessage('OK');
      end;
      DragFinish(msg.Drop);

  2. #2
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    J'ai constaté le même comportement. C'est étrange, parce que le fait de faire le DragAccpetFiles avec le Handle de la ListView semble être bien compris, car lorsque tu fait la manip, on voit bien que le changement de curseur de la souris se fait bien au passage sur la ListView, mais la proc DragDrop ne semble pas déclenchée.

    Cependant, j'ai une propostion :

    Dans le Create, tu fait toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DragAcceptFiles(ListView.Handle,true);
    Ensuite, tu met un objet TApplicationEvents sur ta fiche, et dans l'évènement OnMessage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    const
      MaxLen = 512;
    var
      I,
      J,
      Count : integer;
      File : string;
    begin
      if (Msg.message = WM_DROPFILES) then
      begin
        Count := DragQueryFile(Msg.wParam, uInt(-1), nil, 0);
     
        for I := 0 to Count - 1 do
        begin
          SetLength(File, MaxLen);
          J := DragQueryFile(Msg.wParam, vInI, PChar(File), Length(File));
          SetLength(File, J);
     
          ListView.AddItem(File, nil);
        end;
        DragFinish(Msg.wParam);
      end;
     
    end;
    Ca marche chez moi

    A+

  3. #3
    Membre du Club

    Inscrit en
    Décembre 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 52
    Points : 63
    Points
    63
    Par défaut
    Ok je vais essayer je te remercie .

  4. #4
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 54
    Points : 52
    Points
    52
    Par défaut précisions
    J'ai essayé d'utiliser le programme.

    Je sélectionne plusieurs fichiers.

    Quand je fais un drag and drop sur ma listview, le programme ne me copie que le chemin et le nom du fichier sélectionné sur ma listview, multiplié par le nombre de fichiers que j'avais sélectionné (en somme j'ai X fois le même nom de fichier).

    Comment faire pour que, dans ma listview, j'ai les noms des fichiers que j'ai sélectionné ?

    Merci d'avance.

  5. #5
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bonsoir



    Jer' a écrit :

    J'ai constaté le même comportement. C'est étrange, parce que le fait de faire le DragAccpetFiles avec le Handle de la ListView semble être bien compris, car lorsque tu fait la manip, on voit bien que le changement de curseur de la souris se fait bien au passage sur la ListView, mais la proc DragDrop ne semble pas déclenchée.
    Et bien ce comportement me semble parfaitement normal dans la mesure où le message WM_DROPFILES n'est pas géré par la ListView (le fait que la fiche le gère n'y change rien puisque le message est directement envoyé par Windows à la ListView via son handle)

    Voici une autre possibilité en dérivant un nouveau composant de TListView :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    unit ListViewDD;
     
    interface
     
    uses
      Messages,SysUtils, Classes, Controls, ComCtrls, ShellAPI;
     
    type
      TListViewDragFileEvent = procedure(ListView : TListView; FileName : String) of object;
     
      TListViewDD = class(TListView)
      private
        FOnDragFile : TListViewDragFileEvent;
      protected
        procedure CreateWnd; override;
        procedure DestroyWnd; override;
        procedure DropMsg(var msg: TWMDropFiles); message WM_DROPFILES;
      public
      published
        property OnDragFile : TListViewDragFileEvent read FOnDragFile write FOnDragFile;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Demo', [TListViewDD]);
    end;
     
    procedure TListViewDD.DropMsg(var msg: TWMDropFiles);
    var
      i, Count : integer;
      FileName: string;
      Files: array[0..512] of Char;
    begin
      Count := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0);
      for i := 0 to Count - 1 do
      begin
        FileName:= Copy(Files, 0, DragQueryFile(Msg.Drop, i, Files, 512));
        if Assigned(FOnDragFile) then FOnDragFile(Self,FileName);
      end;
      Msg.Result:=0;
      DragFinish(Msg.Drop);
    end;
     
    procedure TListViewDD.CreateWnd;
    begin
      inherited;
      if not (csDesigning in ComponentState) then DragAcceptFiles(Handle,True);
    end;
     
    procedure TListViewDD.DestroyWnd;
    begin
      if not (csDesigning in ComponentState) then DragAcceptFiles(Handle, False);
      inherited;
    end;
     
     
    end.
    J'ai aussi ajouté un nouvel événement OnDragFile qui permet de réagir lorsqu'un ou plusieurs fichiers sont dépossés sur la ListView (insertion dans la liste ou autre ...) ce qui donne de la souplesse.

    Le seul point qui me chagrine un peu est de faire appel à Handle dans DestroyWnd (surtout si en interne FHandle = 0 ... )

    @+
    Php
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire du drag and drop dans un Listbox
    Par jca dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/02/2013, 20h54
  2. Réponses: 1
    Dernier message: 20/11/2008, 19h50
  3. [VB.NET]Drag and Drop dans une Listview
    Par gégécap dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/08/2006, 18h41
  4. Comment faire un Drag&Drop vers Windows ?
    Par Lung dans le forum Composants VCL
    Réponses: 17
    Dernier message: 21/06/2004, 13h10
  5. Comment faire un Drag&Drop sur un tableau
    Par Stef.web dans le forum Composants VCL
    Réponses: 6
    Dernier message: 11/10/2003, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo