Карта сайтаСсылкиКонтакты

Позволить формам принимать файлы из проводника

PDF Печать
Статьи

Операции перетаскивания - обычно используемые в приложениях Windows. При работе с Проводником, Вы можете копировать, перемещать и даже удалять файлы с использованием перетаскивания.

Перемещение объекта с нажатой кнопкой мыши обычно называется перетаскиванием, а когда мы отпускаем кнопку мыши, называется опусканием.

Во перетаскивания из Проводника Windows, Вы должны обработать несколько API сообщений.

Возможность принимать файлы

Для объекта (окна), типа формы Delphi, чтобы быть способным принимать файлы из оболочки Windows, требуется вызов DragAcceptFiles. Затем нужно обработать сообщение WM_DROPFILES.

Например:

  1. Имеется форма Delphi по имени dropForm
  2. Есть управление Memo по имени Memo1
  3. Код, который регистрирует форму как окно, которое принимает файлы в событии OnCreate формы. Процедура WMDROPFILES обрабатывает файлы, внося их в список Memo

unit dropFormUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TDropForm = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject) ;
  private
    procedure WMDROPFILES(var msg : TWMDropFiles) ; message WM_DROPFILES;
  public
    { Public declarations }
  end;

var
  DropForm: TDropForm;

implementation
{$R *.dfm}

uses ShellApi;

// обработчик события OnCreate формы
procedure TDropForm.FormCreate(Sender: TObject) ;
begin
  // форма готова принимать файлы
  DragAcceptFiles( Handle, True ) ;
end;

// дескриптор файлов, опускаемых на форме
procedure TDropForm.WMDROPFILES(var msg: TWMDropFiles) ;
const
  MAXFILENAME = 255;
var
  cnt, fileCount : integer;
  fileName : array [0..MAXFILENAME] of char;
begin
  // сколько файлов опустили на форму?
  fileCount := DragQueryFile(msg.Drop, $FFFFFFFF, fileName, MAXFILENAME) ;

  // запрос имен файлов
  for cnt := 0 to -1 + fileCount do
  begin
    DragQueryFile(msg.Drop, cnt, fileName, MAXFILENAME) ;

    // что-то сделать с этим файлом
    memo1.Lines.Insert(0, fileName) ;
  end;

  // освободить память
  DragFinish(msg.Drop) ;
end;

end.

 

Добавить комментарий


Защитный код
Обновить