Newsgroup: it.comp.lang.delphi
Titolo: Drag&Drop su TListView

Come posso fare per abilitare il drag&drop di files su una TListView?
Non ho bisogno di aggiungere semplicemente il file ma di selezionare
l'item sotto il mouse e di passare il nome del file a questo item.
Ho provato ad usare il messaggio wmdropfile ma non riesco a fare ciò.
In pratica:
* trascino un file esterno sulla lista.
* l'item sotto il cursore si illumina.
* al rilascio del file ho l'evento filesuitem con il nome file + item
selezionato.
Mi servirebbe solo qualche dritta.
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Come posso fare per abilitare il drag&drop di files su una TListView?
unit Unit1;
interface
uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, 
Controls, Forms,
   Dialogs, StdCtrls, ComCtrls;
type
   TFileDropOnItem = procedure(AItem: TListItem; AFileName: 
String) of object;
type
   TForm1 = class(TForm)
     ListView1: TListView;
     Button1: TButton;
     procedure FormCreate(Sender: TObject);
     procedure ListView1DragDrop(Sender, Source: TObject; X, Y: 
Integer);
   private
     FOldLVWindowProc: TWndMethod;
     FFileDropOnItem: TFileDropOnItem;
     procedure NewLVWindowProc(var Msg: TMessage);
     procedure FileDropOnItemEvent(AItem: TListItem; AFileName: 
String);
   public
     property OnFileDropOnItem: TFileDropOnItem read 
FFileDropOnItem write FFileDropOnItem;
   end;
var
   Form1: TForm1;
implementation
{$R *.dfm}
uses ShellAPI;
procedure TForm1.FileDropOnItemEvent(AItem: TListItem; AFileName: 
String);
begin
   Application.MessageBox(PChar(Format('Item="%s" 
AFileName="%s"', [AItem.Caption, AFileName])), '', MB_OK);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   with ListView1 do
   begin
     DragMode := dmAutomatic;
     Items.Add.Caption := 'pippo';
     Items.Add.Caption := 'pluto';
     Items.Add.Caption := 'paperino';
     RowSelect := True;
   end;
   FOldLVWindowProc := ListView1.WindowProc;
   ListView1.WindowProc := NewLVWindowProc;
   FFileDropOnItem := FileDropOnItemEvent;
   DragAcceptFiles(ListView1.Handle, True);
end;
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: 
Integer);
begin
   Application.MessageBox(PChar(Format('X=%d, Y=%d', [X,Y])), '', 
MB_OK);
end;
procedure TForm1.NewLVWindowProc(var Msg: TMessage);
var
   hDrop: Integer;
   FileIndex, FileCount: Integer;
   FileName: array [Byte] of Char;
   QueryPoint: TPoint;
   Item: TListItem;
begin
   if Msg.Msg = WM_DROPFILES then
   begin
     hDrop := Msg.WParam;
     if DragQueryPoint(hDrop, QueryPoint) then
     begin
       Item := ListView1.GetItemAt(QueryPoint.X, QueryPoint.Y);
       if Assigned(Item) then
       begin
         FileCount := DragQueryFile(hDrop, $FFFFFFFF, nil, 0);
         for FileIndex := 0 to FileCount-1 do
         begin
           ZeroMemory(@FileName, SizeOf(FileName));
           DragQueryFile(hDrop, FileIndex, FileName, 
SizeOf(FileName));
           if Assigned(FFileDropOnItem) then
             FFileDropOnItem(Item, FileName);
         end;
       end;
     end;
     DragFinish(hDrop);
     Msg.Result := 0;
   end
   else
     FOldLVWindowProc(Msg);
end;
end.

 > Come posso fare per abilitare il drag&drop di files su una TListView?
Direi che funziona! Grazie.
Ma se volessi anche evidenziare l'item sotto il mouse quando sono
sopra con il file da fare il drag&drop?


 sopra con il file da fare il drag&drop?
Hummm... la vedo dura, perché da quel che vedo così di sfuggita 
non si scatena nessun evento al passaggio del mouse sugli 
elementi.  Tieni presente che il d&d dei file è gestito 
esternamente al componente.

 [...]non si scatena nessun evento al passaggio del mouse sugli elementi.
...voglio dire che non viene spedito alcun messaggio specifico...