首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让IDropTarget与我的Drop Handler一起在Delphi中工作?

如何让IDropTarget与我的Drop Handler一起在Delphi中工作?
EN

Stack Overflow用户
提问于 2010-09-01 05:22:43
回答 2查看 2.3K关注 0票数 2

我已经将一个文件扩展名与我的Delphi2009程序关联起来。我一直在使用命令行调用方法将文件名传递给我的Delphi程序,这样它就可以打开了。

然而,我发现,当选择多个文件,并一次单击所有文件时,它会在我的程序的单独实例中打开每个文件。I asked about this,显然解决方案是使用one of the other two Windows methods: DDE or IDropTarget

但是DDE正在被弃用,因此MSDN推荐使用IDropTarget方法。Lars Truijens in his answer to me还说,如果我已经在运行拖放功能,那么IDropTarget可能会更适合

目前,这是我的drop处理程序:

代码语言:javascript
运行
复制
private
  procedure WMDropFiles(var WinMsg: TMessage);
            message wm_DropFiles;

procedure TLogoAppForm.FormShow(Sender: TObject);
begin
  DragAcceptFiles(Handle, true);
end;

procedure TLogoAppForm.WMDropFiles(var WinMsg: TMessage);
// From Delphi 3 - User Interface Design, pg 170
const
  BufSize = 255;
var
  TempStr : array[0..BufSize] of Char;
  NumDroppedFiles, I: integer;
  Filenames: TStringList;
begin
  NumDroppedFiles := DragQueryFile(TWMDropFiles(WinMsg).Drop, $ffffffff, nil, 0);
  if NumDroppedFiles >= 1 then begin
    Filenames := TStringList.Create;
    for I := 0 to NumDroppedFiles - 1 do begin
      DragQueryFile(TWMDropFiles(WinMsg).Drop, I, TempStr, BufSize);
      Filenames.Add(TempStr);
    end;
    OpenFiles(Filenames, '');
    Filenames.Free;
  end;
  DragFinish(TWMDropFiles(WinMsg).Drop);
  WinMsg.Result := 0;
end;

它现在接受一个或多个文件,并将按照我的要求打开它们。这是非常老的代码,来自Delphi3的一本书,但它似乎仍然可以工作。

我在任何地方都找不到任何关于如何在Delphi语言中实现IDropHandler的文档,特别是让它与我正在使用的Drop Handler (上面)一起工作的文档。

谁能告诉我如何使用IDropHandler,使点击选定的文件与我的文件扩展名将它们传递给我的拖放处理程序,我的程序可以打开所有点击的文件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-01 15:16:55

This page有一个用Delphi语言实现IDropTarget的例子。Here是另一种来自绝地代码格式化程序。但是this library可能会更好。除了其他功能之外,它还支持从Windows Explorer中进行拖放,因此在TDropHandler类中已经支持IDropTarget。

票数 1
EN

Stack Overflow用户

发布于 2010-09-01 09:27:08

使用Delphi的向导将一个标准的COM进程外服务器对象添加到您的项目中,让它implement the IDropHandler interface (本文的代码是用C++编写的,但是其中的许多概念也可以应用于Delphi代码,其中一些概念已经由VCL为您实现了),然后重写它的虚拟UpdateRegistry()方法以添加两个额外的注册表项(参见上面文章的底部),您的IDropHandler对象需要这些注册表项来处理Windows Explorer双击和弹出菜单操作。

然后,将应用程序代码更改为使用RegisterDragDrop()而不是DragAcceptFiles(),这样用户仍然可以通过基于IDropTarget的类的实例将文件拖放到应用程序的窗口上。

在IDropHandler方法的实现中,您可以查询传入的IDataObject接口,看看它是否可以提供HDROP格式的数据,如果可以,则可以将其传递给现有的WM_DROPFILES消息处理程序( BTW是旧的,也不建议使用,因此应该考虑删除它)。

这听起来像是很多工作,但一旦你真正进入其中,它根本就不是很多。我最近在我的一个C++Builder VCL应用程序中实现了IDropTarget支持,它并没有花很长时间就让它工作起来。

一旦IDropTarget正常工作,您就可以根据需要支持许多其他外壳格式,例如在从非文件系统源删除数据时。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3613333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档