如何打开在应用程序图标上拖放的所有文件?

时间:2013-03-12 18:01:14

标签: delphi file-io drag-and-drop multiple-instances

我知道如何以这种方式打开一个文件以及如何获取在EXE上拖放的文件数或我的应用程序的快捷方式。

但是,如何运行多个应用程序实例,每个文件一个?

3 个答案:

答案 0 :(得分:4)

我把它放在我的.dpr文件代码的开头:

if ParamCount>1 then
begin
  for i := 1 to ParamCount do
    ShellExecute(0, nil, PChar(ParamStr(0)), PChar('"'+ParamStr(i)+'"'), 
        nil, SW_SHOWDEFAULT);
  exit;
end;

这将检查是否存在多个命令行参数。如果是这样,那么每个都将被移交给一个新进程,此过程终止。

我想你可以将参数2交给N并让这个过程处理参数1.但是,由于具有数学性质,这个版本的对称性对我很有吸引力。

答案 1 :(得分:2)

只要将droppend文件作为参数传递,就可以为每个传递的参数运行Application的新实例。
在下面显示的示例中,第一个参数将由在资源管理器中通过Drog& Drop启动的应用程序处理,将为任何其他参数运行Application的新实例。

program Project1;

uses
  Forms, Shellapi,Messages,Windows,
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
var
i:Integer;
begin
  for I := 2 to Paramcount  do
      ShellExecute(0,'OPEN',PChar(Paramstr(0)),PChar(Paramstr(i)),'',sw_Show);
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

Form2中代码的最简单示例可以通过

procedure TForm2.FormCreate(Sender: TObject);
begin
  Caption := ParamStr(1); 
  // whatever should be done with the dropped file
end;

答案 2 :(得分:1)

应用程序图标或快捷方式上删除的每个文件都是命令行参数。您可以轻松地遍历它们:

var
  i: integer;
begin
  for i := 1 to ParamCount do
    Memo1.Lines.Add(ParamStr(i));
end;

因此,对于每个,您可以在应用程序中打开一个单独的表单(例如,从主表单的OnCreate中),或者您也可以在从正常启动代码之前的项目(.dpr)文件调用的例程中对此进行编码并为每个实例启动应用程序的其他实例(为您正在执行此操作的实例保存一个实例)。

E.g。在上面的循环中,您可以使用ShellExecute或CreateProcess来启动自己的实例,将ParamStr(i)作为实例单个参数传递。