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 :

[D10.2] Drag and drop depuis explorateur vers TListBox


Sujet :

Composants VCL Delphi

  1. #1
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut [D10.2] Drag and drop depuis explorateur vers TListBox
    Bonjour,

    Avec Delphi 10.2 et windows 10 je tente d'utiliser le drag and drop depuis l'explorateur vers une listbox, j'utilise ce qui est décrit dans la FAQ mais cela ne fonctionne pas.

    Je précise que je fais cela depuis un frame et non pas une form.

    J'ai du mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      DragAcceptFiles(ListBox1.Handle, true);
    en dehors du Create du frame sinon il n'était pas pris en compte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     protected
        procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
     
    procedure TFrame1.WMDropFiles(var Msg: TMessage);
    begin
      ShowMessage('on drop');
    end;
    Lorsque je drag un fichier depuis l'explorateur sur la listbox, le curseur change bien d'apparence pour indiquer que l'on va dropper le fichier mais l'événement WMDropFiles n'est jamais éxécuté

    Est ce que c'est parce que c'est un frame ?

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    forcément...tu indiques que c'est ListBox1 qui accepte les fichiers, et tu captures le message sur la Frame

    donc soit tu acceptes le drag&drop sur la frame, soit tu dois dériver la ListBox pour qu'elle capture le message WM_DROPFILES

    exemple

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Winapi.ShellAPI;
     
    type
      TDropFilesEvent = procedure(Sender: TObject; const Files: TArray<string>) of object;
     
      TListBox = class(Vcl.stdCtrls.TListBox)
      private
        FOnDropFiles: TDropFilesEvent;
        procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
      public
        procedure CreateWnd; override;
        property OnDropFiles: TDropFilesEvent read FOnDropFiles write FOnDropFiles;
      end;
     
      TForm1 = class(TForm)
        ListBox1: TListBox;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        procedure OnDropFiles(Sender: TObject; const Files: TArray<string>);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TListBox }
     
    procedure TListBox.CreateWnd;
    begin
      inherited;
      DragAcceptFiles(Handle, true);
    end;
     
    procedure TListBox.WMDropFiles(var Msg: TWMDropFiles);
    var
      Count: Integer;
      Files: TArray<string>;
      Index: Integer;
      Len: Integer;
    begin
      Count := DragQueryFile(Msg.Drop, Cardinal(-1), nil, 0);
      SetLength(Files, Count);
      for Index := 0 to Count - 1 do
      begin
        Len := DragQueryFile(Msg.Drop, Index, nil, 0);
        SetLength(Files[Index], Len);
        DragQueryFile(Msg.Drop, Index, PChar(Files[Index]), Len + 1);
      end;
      DragFinish(Msg.Drop);
      if (Count > 0) and Assigned(FOnDropFiles) then
        FOnDropFiles(Self, Files);
    end;
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ListBox1.OnDropFiles := OnDropFiles;
    end;
     
    procedure TForm1.OnDropFiles(Sender: TObject; const Files: TArray<string>);
    begin
      for var I := 0 to Length(Files) - 1 do
         ShowMessage(Files[I]);
    end;
     
    end.
    NB: la nouvelle déclaration de TListBox peut être placée dans une unité DropFilesListBox.pas que l'on placera APRES Vcl.StdCtrls dans le uses dans toute unité qui en aura besoin.

    attention, toutes les listbox de la fiche accepteront alors les fichiers...mais on peut remédier à cela

    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
     
      TListBox = class(Vcl.stdCtrls.TListBox)
      private
        FAcceptFiles: Boolean;
        FOnDropFiles: TDropFilesEvent;
        procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
        procedure SetAcceptFiles(Value: Boolean);
      public
        procedure CreateWnd; override;
        property OnDropFiles: TDropFilesEvent read FOnDropFiles write FOnDropFiles;
        property AccepFiles: Boolean read FAcceptFiles write SetAcceptFiles;
      end;
    ...
     
    procedure TListBox.CreateWnd;
    begin
      inherited;
      if FAcceptFiles then
        DragAcceptFiles(Handle, true);
    end;
     
    procedure TListBox.SetAcceptFiles(Value: Boolean);
    begin
      if Value <> FAcceptFiles then
      begin
        FAcceptFiles := Value;
        if HandleAllocated then
        begin
          DragAcceptFiles(Handle, FAcceptFiles);
        end;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Merci Paul, ça marche nickel !

  4. #4
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut curseur du drop
    Bonjour,

    En utilisant cette unité qui dérive TListBox, est ce qu'il y a un moyen de changer l'apparence du curseur lorsque la souris se déplace au dessus de la ListBox pour faire le drop du fichier ( provenant de l'explorateur windows ) ?

    Merci d'avance

Discussions similaires

  1. [WD17] Drag and Drop depuis une table vers un champ de saisie
    Par Dramon dans le forum WinDev
    Réponses: 0
    Dernier message: 24/02/2015, 16h36
  2. Drag And Drop: Win32(MFC) vers WPF
    Par sacoum dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 17/06/2008, 10h29
  3. Drag and Drop depuis le système
    Par Kh4iN3 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/02/2007, 20h49
  4. Drag and Drop depuis une JList
    Par vic dans le forum Composants
    Réponses: 1
    Dernier message: 25/09/2006, 01h22
  5. Faire un drag and drop depuis IE vers un TListView
    Par ALEX77 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 11/11/2004, 15h27

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