Comment puis-je faire glisser des fichiers pour des contrôles spécifiques dans Delphi

Je voudrais accepter les fichiers dès que quelqu’un dépose un fichier sur un contrôle spécifique (par exemple, TMemo). J’ai commencé avec cet exemple: http://delphi.about.com/od/windowsshellapi/a/accept-filedrop.htm et l’ai modifié comme suit:

procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles( Memo1.Handle, True ) ; end; 

Cela permet au contrôle d’afficher l’icône de glissement, mais le message WM_DROPFILES correct n’est pas appelé car DragAcceptFiles besoin d’un DragAcceptFiles (Parent?). Je pourrais déterminer le MemoHandle dans la procédure WMDROPFILES mais je ne sais pas comment, plus le curseur de glissement s’applique à tous les contrôles maintenant. Comment puis-je faire glisser pour un contrôle spécifique (et bloquer d’autres contrôles de glisser)?

Vous devez en effet passer le handle de fenêtre du contrôle mémo, mais vous devez également écouter le message WM_DROPFILES est envoyé:

 unit Unit5; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI; type TMemo = class(StdCtrls.TMemo) protected procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES; procedure CreateWnd; override; procedure DestroyWnd; override; end; TForm5 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form5: TForm5; implementation {$R *.dfm} procedure TForm5.FormCreate(Sender: TObject); begin end; { TMemo } procedure TMemo.CreateWnd; begin inherited; DragAcceptFiles(Handle, true); end; procedure TMemo.DestroyWnd; begin DragAcceptFiles(Handle, false); inherited; end; procedure TMemo.WMDropFiles(var Message: TWMDropFiles); var c: integer; fn: array[0..MAX_PATH-1] of char; begin c := DragQueryFile(Message.Drop, $FFFFFFFF, fn, MAX_PATH); if c <> 1 then begin MessageBox(Handle, 'Too many files.', 'Drag and drop error', MB_ICONERROR); Exit; end; if DragQueryFile(Message.Drop, 0, fn, MAX_PATH) = 0 then Exit; Text := fn; end; end. 

L’exemple ci-dessus n’accepte qu’un seul fichier supprimé. Le nom du fichier sera placé dans le contrôle mémo. Mais vous pouvez également autoriser la suppression d’une sélection multiple:

var c: entier; fn: array [0..MAX_PATH-1] de char; i: entier; commencer

 c := DragQueryFile(Message.Drop, $FFFFFFFF, fn, MAX_PATH); Clear; for i := 0 to c - 1 do begin if DragQueryFile(Message.Drop, i, fn, MAX_PATH) = 0 then Exit; Lines.Add(fn); end;