Читать «Виртуальная библиотека Delphi» онлайн - страница 107

Unknown

begin

{ default WndProc return value }

  Result := 0;

{ handle messages here; the message number is in Msg }

  Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam);

end;

begin

  Application.CreateForm(TForm1, Form1);

  OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));

  SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc));

end.

10. Проблема с DragDrop для внешних программ.

Я пишу небольшую программку — "мусорную корзину". В FormCreate вызывается DragAcceptFiles(HANDLE, True). Проблема в том, что когда размер окна восстанавливается и затем минимизируется Drag and Drop перестает работать. Я безуспешно пробовал помещать DragAcceptFiles в разные методы формы. Однако если сделать вызов DragAcceptFiles(Application.Handle, True) в MainForm.Create, то все работает. Как перехватить событие WM_DROPFILES?

Это можно сделать так:

type

  TMainForm = class(TForm)

  ...

    procedure FormCreate(Sender: TObject);

  private

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

  end;

procedure TMainForm.DropFiles(var Msg : TWMDropFiles);

begin

  DragQueryPoint(Msg.Drop, Point);

  NrOfFiles := DragQueryFile(Msg.Drop, Word(-1), FileName, BufSize);

  DragQueryFile(Msg.Drop, 0, FileName, BufSize);

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

  DragAcceptFiles(Handle, True);

end;

Подробнее о перехвате событий Windows см. Главу 7 руководства Component Writers Guide.

11. Как обрабатывать WM_DROPFILES (Drag/Drop)?

Следующий код показывает как обрабатывать это событие. Обрабатываются имена всех "брошенных" файлов. Для загрузки каждого файла вызывается CreateChild(FName). В обработчике OnCreate данной формы вы должны вызвать DragAcceptFiles.

type

  TFrameForm = class(TForm)

  ...

  protected

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

  end;

procedure TFrameForm.WMDropFiles(var Msg : TMessage);

var

  I, N, Size: Word;

  FName: string;

  HDrop: Word;

begin

  HDrop := Msg.WParam;

  N := DragQueryFile(HDrop, $FFFF, nil, 0);

  for I := 0 to (N-1) do

  begin

    Size := DragQueryFile(HDrop, I, nil, 0);

    if Size < 255 then { 255 char. string limit - not really a problem }

    begin

      FName[0] := Chr(Size);

      DragQueryFile(HDrop, I, @FName[1], Size+1);

      CreateChild(FName);

    end;