如何实现从listbox中拖拉一个文件名(带路径)到桌面,或从桌面拖拉一个文件到listbox,就能实现文件的复制功能?

解决方案 »

  1.   

    拖放文件触发消息WM_DROPFILES处理此消息用到以下函数:
    DragAcceptFiles
    DragQueryFiles
    DragQueryPoint
    DragFinish
    具体参数参考msdn
      

  2.   

    为什么不能用listbox控件中的onDragover,onDragDrop事件呢?请大家指点下。
      

  3.   

    onDragover
    onDragDrop
    只在程序内部生效
      

  4.   

    应该用到
      OnDragOver
      OnDragDrop
      OnEndDrag
    事件,具体怎么做,再细想
      

  5.   

    1)在单元文件中包含ShellAPI单元。2)在窗体类声明中加入一个处理WM_DROPFILES消息的过程
      procedure DragDropFiles(var msg:TMessage);message WM_DROPFILES;3)在窗体的创建过程中加入下列代码:
    procedure TForm1.FormCreate(Sender: TObject)
    begin
      ...
      DragAcceptFiles(Handle,true);    //允许拖拉文件到本窗口中
    end;4)实现WM_DROPFILES消息处理过程:procedure TForm1.DragDropFiles(var msg:TMessage);
    var
      FileName: array[0..MAX_PATH] of char;
      I,Sum : Integer;
    begin
      try
        // 获得拖拉的文件数目,该功能由第二个参数决定
        Sum:=DragQueryFile(msg.WParam,$FFFFFFFF,nil,0);
        for I := 0 to Sum - 1 do
        begin
          //读取文件名
          DragQueryFile(msg.WParam,i,FileName,SizeOf(FileName));
          ...  //自己去实现了
        end
      finally
        DragFinish(msg.WParam);
      end;
    end;OK了,运行程序看看,很爽,我刚学会,刚实现,呵呵
      

  6.   

    完全同意 niniu(你牛) 的做法。Procedure Tfm_main.DragDropFiles(Var message: TMessage);
    Var
      p: Array[0..254] Of char;
      i: word;
      Fn:string;
    Begin
      Inherited;
      i := DragQueryFile(Message.wParam, $FFFFFFFF, Nil, 0);
      For i := 0 To i - 1 Do
      Begin
        DragQueryFile(Message.wParam, i, p, 255);
      End;
      Try
        fn:=strPas(p);
        If FileExists(fn) Then
        begin
          //处理文件件,文件名就是fn  
        end;  Finally
        DragFinish(HDROP(Message.WParam));
      End;
    End;我刚开始做的时候,忘了覆盖消息,半天出不来,呵呵。Procedure DragDropFiles(Var message: TMessage); Message WM_DropFiles;这句关键,这个过程接替了系统的WM_DropFiles消息Inherited;也不要忘了!