Ben*_*iss 4 windows delphi winapi vcl
有人将文件丢弃到特定控件(例如TMemo)时,我想接受文件.我从这个例子开始:http://delphi.about.com/od/windowsshellapi/a/accept-filedrop.htm并修改如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles( Memo1.Handle, True ) ;
end;
Run Code Online (Sandbox Code Playgroud)
这允许控件显示拖动图标但是WM_DROPFILES
没有调用正确的消息因为DragAcceptFiles
需要(父?)窗口句柄.我可以在WMDROPFILES
程序中确定MemoHandle,但我不知道如何,加上拖动光标现在适用于所有控件.如何允许拖动特定控件(并阻止其他控件拖动)?
您确实应该传递备忘录控件的窗口句柄,但是您还需要侦听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.
Run Code Online (Sandbox Code Playgroud)
上面的示例只接受丢弃的单个文件.文件名将放在备忘录控件中.但您也可以删除多项选择:
var c:integer; fn:char的数组[0..MAX_PATH-1]; 我:整数; 开始
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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4001 次 |
最近记录: |