Тема: ListBox, PlayList
Показать сообщение отдельно
  #6  
Старый 18.07.2007, 03:49
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Как принимать "перетаскиваемые" файлы.

При получении программой файлов, окну посылается сообщение WM_DROPFILES.
При помощи функции DragQueryFile можно определить количество и имена файлов.
При помощи функции DragQueryPoint можно определить координату мыши в тот момент, когда пользователь "отпустил" файлы.
Эта программа открывает все "перетащенные" в нее файлы.
Причем, если пользователь перетащил файлы в PageControl1, то в PageControl1 эти файлы и откроются.

Код:
...
public

   procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;

end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses ShellAPI, stdctrls;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  HF: THandle;
  s: array [0..1023] of char;
  i, FileCount: integer;
  p: TPoint;
  ts: TTabSheet;
  memo: TMemo;

begin

  HF := Msg.Drop;
  FileCount := DragQueryFile(HF, $FFFFFFFF, nil, 0);

  for i := 0 to FileCount - 1 do 
  begin
    DragQueryFile(HF, i, s, sizeof(s));
    ts := TTabSheet.Create(nil);
    DragQueryPoint(HF, p);
    if PtInRect(PageControl1.BoundsRect, p) then 
      ts.PageControl := PageControl1
    else 
      ts.PageControl := PageControl2;
    ts.Caption := ExtractFileName(s);
    memo := TMemo.Create(nil);
    memo.Parent := ts;
    memo.Align := alClient;
    memo.Lines.LoadFromFile(s);
  end;
  DragFinish(HF);
end;

 
procedure TForm1.FormCreate(Sender: TObject);
begin
  PageControl1.Align := alLeft;
  PageControl2.Align := alClient;
  DragAcceptFiles(Form1.Handle, true);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Form1.Handle, false);
end;

В догонку:

Подключаем модуль ShellAPI в области uses
По созданию окна [событие OnCreate] пишем такой код:
Код:
DragAcceptFiles(Handle, true);

Когда вы перетаскиваете файл на своё приложение и отпускаете кнопку мыши, Windows посылает этому окну сообщение wm_DropFiles. Сообщение сопровождается именем файла. Обработчик этого сообщения нужно включить в раздел protected класса формы. Вставьте следующий код:
Код:
protected
  procedure WMDropFiles (var Msg: TMessage); message wm_DropFiles;
Далее обрабатываем сообщение:

Код:
procedure TForm1.WMDropFiles(var Msg: TMessage);
var
  FileName: array[0..256] of char;
begin
  DragQueryFile(THandle(Msg.WParam), 0, FileName, SizeOf(Filename));
  Memo1.Lines.LoadFromFile(FileName);
  DragFinish(THandle(Msg.WParam));
end;

или так:

Код:
procedure TForm1.WMDROPFILES(var Msg: TMessage);
var
  i, amount, size: integer;
  Filename: PChar;
begin
  inherited;
  Amount := DragQueryFile(Msg.WParam, $FFFFFFFF, Filename, 255);
  for i := 0 to (Amount - 1) do
  begin
    size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
    Filename := StrAlloc(size);
    DragQueryFile(Msg.WParam, i, Filename, size);
    listbox1.items.add(StrPas(Filename));
    StrDispose(Filename);
  end;
  DragFinish(Msg.WParam);
end;
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием