5

誰かがファイルを特定のコントロール (例: TMemo) にドロップしたら、すぐにファイルを受け入れたいと思います。私はこの例から始めました: http://delphi.about.com/od/windowsshellapi/a/accept-filedrop.htmそしてそれを次のように修正しました:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles( Memo1.Handle, True ) ;
end;

これにより、コントロールはドラッグ アイコンを表示できますが、(Parent?)windowhandle が必要なWM_DROPFILESため、適切なメッセージが呼び出されません。DragAcceptFiles手順で MemoHandle を特定できましたが、WMDROPFILES方法がわかりません。さらに、ドラッグ カーソルがすべてのコントロールに適用されるようになりました。特定のコントロールのドラッグを許可する (および他のコントロールのドラッグをブロックする) にはどうすればよいですか?

4

1 に答える 1

7

確かにメモ コントロールのウィンドウ ハンドルを渡す必要がありますが、それWM_DROPFILESに送信されたメッセージもリッスンする必要があります。

unit Unit5;

interface

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

type
  TMemo = class(StdCtrls.TMemo)
  protected
    procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES;
    procedure CreateWnd; override;
    procedure DestroyWnd; override;
  end;

  TForm5 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.FormCreate(Sender: TObject);
begin
end;

{ TMemo }

procedure TMemo.CreateWnd;
begin
  inherited;
  DragAcceptFiles(Handle, true);
end;

procedure TMemo.DestroyWnd;
begin
  DragAcceptFiles(Handle, false);
  inherited;
end;

procedure TMemo.WMDropFiles(var Message: TWMDropFiles);
var
  c: integer;
  fn: array[0..MAX_PATH-1] of char;
begin

  c := DragQueryFile(Message.Drop, $FFFFFFFF, fn, MAX_PATH);

  if c <> 1 then
  begin
    MessageBox(Handle, 'Too many files.', 'Drag and drop error', MB_ICONERROR);
    Exit;
  end;

  if DragQueryFile(Message.Drop, 0, fn, MAX_PATH) = 0 then Exit;

  Text := fn;

end;


end.

上記の例では、ドロップされた単一のファイルのみを受け入れます。ファイル名はメモ コントロールに配置されます。ただし、複数選択をドロップできるようにすることもできます。

var c: 整数; fn: char の配列 [0..MAX_PATH-1]。i: 整数。始める

c := DragQueryFile(Message.Drop, $FFFFFFFF, fn, MAX_PATH);

Clear;
for i := 0 to c - 1 do
begin
  if DragQueryFile(Message.Drop, i, fn, MAX_PATH) = 0 then Exit;
  Lines.Add(fn);
end;
于 2013-05-20T12:31:26.007 に答える