加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

将文件拖放到Delphi表单不起作用

发布时间:2020-12-15 04:12:36 所属栏目:大数据 来源:网络整理
导读:我试图接受从文件资源管理器拖放到窗体的文件,但它不起作用.永远不会调用我的WM_DROPFILES处理程序.我正在运行 Windows 8,如果这有任何区别. 这是我做的一个简单示例(我在表单上只有一个TMemo): type TForm1 = class(TForm) Memo1: TMemo; private { Privat
我试图接受从文件资源管理器拖放到窗体的文件,但它不起作用.永远不会调用我的WM_DROPFILES处理程序.我正在运行 Windows 8,如果这有任何区别.

这是我做的一个简单示例(我在表单上只有一个TMemo):

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
    procedure WMDROPFILES(var msg : TWMDropFiles) ; message WM_DROPFILES;
    procedure CreateWnd; override;
    procedure DestroyWnd; override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.CreateWnd;
begin
  inherited;
  DragAcceptFiles(Handle,True);

end;

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

end;

procedure TForm1.WMDROPFILES(var msg: TWMDropFiles);
var
  i,fileCount: integer;
  fileName: array[0..MAX_PATH] of char;
begin
  fileCount:=DragQueryFile(msg.Drop,$FFFFFFFF,fileName,MAX_PATH);
  for i := 0 to fileCount - 1 do
  begin
    DragQueryFile(msg.Drop,i,MAX_PATH);
    Memo1.Lines.Add(fileName);
  end;
  DragFinish(msg.Drop);
end;

解决方法

您很可能正在运行升级的应用程序.可能是因为你正在运行Delphi提升.在Vista及更高版本中,低权限进程无法向更高权限进程发送消息.这 MSDN blog解释了更多.

如果您正在运行Delphi IDE,我建议您停止这样做.标准桌面应用程序开发很少需要这样做.

正如雷米指出的那样,你的DestroyWnd是不正确的.在调用DragAcceptFiles之前,您正在销毁窗口句柄.只需颠倒订单即可.我个人在CreateWnd和DestroyWnd都使用WindowHandle.如果未分配窗口句柄,则Handle属性会创建窗口句柄,因此会屏蔽此类错误.

procedure TForm1.CreateWnd;
begin
  inherited;
  DragAcceptFiles(WindowHandle,True);
end;

procedure TForm1.DestroyWnd;
begin
  DragAcceptFiles(WindowHandle,false);
  inherited;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读