【发布时间】:2010-08-31 21:22:42
【问题描述】:
我已将文件扩展名与我的 Delphi 2009 程序相关联。我一直在使用命令行调用方法将文件名传递给我的 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 可能更适合我。
目前,这是我的放置处理程序:
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;
它现在接受一个或多个文件,并会根据我的需要打开它们。这是非常古老的代码,来自 Delphi 3 书籍,但它似乎仍然有效。
我在任何地方都找不到任何关于如何在 Delphi 中实现 IDropHandler 的文档,特别是让它与我正在使用的 Drop Handler(上图)一起工作。
谁能告诉我如何使用 IDropHandler,以便单击带有我的文件扩展名的选定文件会将它们传递给我的 Drop Handler,并且我的程序可以打开所有单击的文件?
【问题讨论】:
标签: delphi drag-and-drop registry associations