Внешний вид сайта:

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

Операции перетаскивания — обычно используемые в приложениях 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.

Комментарии

Нет комментариев. Ваш будет первым!