この方法で1つのファイルを開く方法と、EXEまたはアプリケーションのショートカットにドラッグアンドドロップされたファイルの数を取得する方法を知っています。
しかし、ファイルごとに1つずつ、アプリケーションの複数のインスタンスを実行するにはどうすればよいでしょうか。
この方法で1つのファイルを開く方法と、EXEまたはアプリケーションのショートカットにドラッグアンドドロップされたファイルの数を取得する方法を知っています。
しかし、ファイルごとに1つずつ、アプリケーションの複数のインスタンスを実行するにはどうすればよいでしょうか。
これを.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を処理させることができると思います。しかし、数学的な性質であるため、このバージョンの対称性は私にとって魅力的です。
ドロップペンドファイルがパラメーターとして渡される限り、渡されたパラメーターごとにアプリケーションの新しいインスタンスを実行できます。
以下に示す例では、最初のパラメーターはエクスプローラーのDrog&Dropを介して開始されたアプリケーションによって処理され、アプリケーションの新しいインスタンスが追加のパラメーターに対して実行されます。
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;
アプリのアイコンまたはショートカットにドロップされた各ファイルは、コマンドラインパラメーターになります。それらを簡単にループできます。
var
i: integer;
begin
for i := 1 to ParamCount do
Memo1.Lines.Add(ParamStr(i));
end;
したがって、それぞれについて、アプリ内で(たとえば、メインフォームのOnCreate内から)個別のフォームを開くことができます。または、通常のスタートアップコードの前に、プロジェクト(.dpr)ファイルから呼び出されるルーチンでこれをコーディングして、追加で起動することもできます。それぞれのアプリのインスタンス(これを実行しているインスタンス用に1つ保存します)。
たとえば、上記のループでは、ShellExecuteまたはCreateProcessを使用して、ParamStr(i)をそのインスタンスの単一パラメーターとして渡す自分のインスタンスを開始できます。