How do you drag and drop a file from Explorer Shell into a VirtualTreeView control in a Delphi application?

后端 未结 2 990
無奈伤痛
無奈伤痛 2020-12-30 12:58

There is extensive drag and drop support in VirtualTreeView by Mike Lischke, and I am using TVirtualStringTree, which has some on-drag-and-drop events, but I can not figure

2条回答
  •  无人及你
    2020-12-30 13:02

    I use this method to capture (receive) files dragged into a TWinControl from explorer.
    You can test it on your control. In a standard TTreeView work fine.

    Add ShellAPI to uses.

    At private section:

      private
        originalEditWindowProc : TWndMethod;
        procedure EditWindowProc(var Msg:TMessage);
        // accept the files dropped
        procedure FilesDrop(var Msg: TWMDROPFILES);
    

    At OnCreate of your form:

      // Assign procedures
      originalEditWindowProc := TreeView1.WindowProc;
      TreeView1.WindowProc := EditWindowProc;
      // Aceptar ficheros arrastrados  // Accept the files
      ShellAPI.DragAcceptFiles(TreeView1.Handle, True);
    

    And the two procedure are these:

    // Al arrastrar ficheros sobre el TV.  On drop files to TV
    procedure TForm1.FilesDrop(var Msg: TWMDROPFILES);
    var
      i:Integer;
      DroppedFilename:string;
      numFiles : longInt;
      buffer : array[0..MAX_PATH] of char;
    begin
      // Número de ficheros arrastrados // Number of files
      numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
    
      // Recorrido por todos los arrastrados // Accept all files
      for i := 0 to (numFiles - 1) do begin
    
        DragQueryFile(Msg.Drop, i, @buffer, sizeof(buffer));
    
        // Proteccion
        try
          DroppedFilename := buffer;
    
          // HERE you can do something with the file...
          TreeView1.Items.AddChild(nil, DroppedFilename);
        except
          on E:Exception do begin
            // catch
          end;
        end;
      end;
    end;
    
    
    procedure TForm1.EditWindowProc(var Msg: TMessage);
    begin
      // if correct message, execute the procedure
      if Msg.Msg = WM_DROPFILES then begin
        FilesDrop(TWMDROPFILES(Msg))
      end
      else begin
        // in other case do default...
        originalEditWindowProc(Msg) ;
      end;
    end;
    

    I hope that this are usefull for you.

    Regards.

提交回复
热议问题