Delphi Programming / Object Pascal

[掲載 2014年06月03日] [更新 2017年06月29日] Delphi サンプルプログラム集 |
| 098_ドラッグ & ドロップでアプリを起動してファイルを表示 |
| 動作確認等 |
Windows 7 U64(SP1) + Delphi XE(UP1) Pro |
 |
098_DragDropStartApp.zip [1,107 KB] 2017年06月29日版 (EXE 同梱) |
| 01_ドラッグ & ドロップでアプリを起動してファイルを表示 |
EXE ファイル、あるいは EXE ファイルのショートカット (アプリのショートカット) に、エクスプローラ等から、ドラッグ & ドロップでアプリを起動して、そのファイルを表示するサンプルです。
Delphi のショートカットに、プロジェクトファイルをドラッグ & ドロップすると、そのプロジェクトを開くことができます。それと同じような動作するアプリを作成する際の参考です。
この機能を実装するには、例えば、メインフォームの OnCreate イベント等で、コマンドラインパラメータを処理します。コマンドラインのパラメータとは、アプリをコマンドラインで起動する際に、指定する起動オプションのことです。 |
| 本ページのサンプルは (コマンドライン) パラメータが 1 つだけを処理しています。複数のパラメータを扱う例として、例えば以下のサンプルがあります。 |
[備考]
アプリケーションの起動中に、エクスプローラ等からファイル名をドラッグ & ドロップした場合は、いわゆるドラッグ & ドロップとしての処理となります。
アプリケーションのショートカットにドラッグ & ドロップした場合は、コマンドラインパラメータとしての処理を行います。パラメータの区切りは半角の空白文字です。
|
 |
図1
設計時画面
|
コンパイルしたら、EXE のショートカットをデスクトップ等に作成します。このショートカットに、エクスプローラの画像ファイル、あるいは、ブラウザの画像をドラッグ & ドロップします。すると、その画像をフォームに配置した TImage で表示します。
TImage で表示できない画像ファイルをドラッグ & ドロップした場合は、[画像が不正です] のダイアログが表示されます。画像以外のファイルの場合もアプリは起動しますが、何も表示しません。 |
 |
図2
アプリのショートカットを作成 |
 |
図3
そのショートカットに、画像ファイルをドラッグ & ドロップ |
 |
図4
画像が表示される |
リスト1
アプリのショートカットに、画像ファイルをドラッグ & ドロップして起動
起動パラメータ (起動オプション) が 1 つの場合 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// 起動パラメータ(起動オプション・引数)が1つの場合の例
//
// 2番目のパラメータの値はParamStr(2)
// 3番目のパラメータの値はParamStr(3)
// n番目のパラメータの値はParamStr(n)
// のように受け取る
// 該当するパラメータが存在しない場合は、取得結果は空白文字列となる
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
StrText : String;
WIC : TWICImage;
begin
Image1.Left := 0;
Image1.Top := 0;
Image1.AutoSize := True;
Image1.Transparent := True;
//起動時の引数が1つの時だけ、その値を取得して処理
if ParamCount = 1 then begin
//1番名のパラメータ(引数)の値を取得(パラメータは文字列で受け取る)
StrText := ParamStr(1);
WIC := TWICImage.Create;
try
WIC.LoadFromFile(StrText);
Image1.Picture.Assign(WIC);
finally
WIC.Free;
end;
end;
end;
end.
| 02_実行中のアプリにドラッグ & ドロップでファイルを表示 |
|
アプリの実行中にドラッグ & ドロップでファイル名を受け取るには DragAcceptFiles で受け入れを設定して、WM_DROPFILES メッセージで受信します。
メッセージの受信には TApplicationEvents コンポーネントを使用すると便利です。
本サンプルは、管理者権限で実行するとドラッグ & ドロップは機能しません。
|

|
図5
設計時画面
- TImage を 1 つ配置
- メッセージの受信用に TApplicationEvents コンポーネントを配置
|
リスト2
実行中のアプリにドラッグ & ドロップでファイルを表示 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, AppEvnts;
type
TForm1 = class(TForm)
Image1: TImage;
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
ShellAPI;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// DragAcceptFilesの使用にはusesにShellAPIが必要
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
//ドラッグアンドドロップを許可
//対象コントロールはSelf(このフォーム)
DragAcceptFiles(Self.Handle, True);
end;
//=============================================================================
// TApplicationEventsのOnMessageイベント処理
// エクスプローラからのファイルのドラッグ・ドロップ処理
//=============================================================================
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
LCount : Integer;
LBuffer : array [0..MAX_PATH-1] of char;
LFilePath : string;
WIC : TWICImage;
begin
if Msg.message = WM_DROPFILES then begin
//FormのOnCreateで受入れコントロールを指定はしているが...
//ドラッグドロップしたファイル数を取得
LCount := DragQueryFile(Msg.wParam, High(Cardinal), nil, 0);
if LCount = 1 then begin
//ドラッグドロップしたファイル名を取得
DragQueryFile(Msg.WParam, 0, LBuffer, MAX_PATH);
LFilePath := LBuffer;
//ドロップが完了したことを伝える
DragFinish(msg.wParam);
//ディスクから画像ファイルを読み込んで表示する
WIC := TWICImage.Create;
try
WIC.LoadFromFile(LFilePath);
Image1.AutoSize := True;
Image1.Picture.Assign(WIC);
finally
WIC.Free;
end;
end;
end;
end;
end.
|
上のコードではドラッグ & ドロップの受け入れ先をフォーム自身にしていますが、DragAcceptFiles 関数の引数で限定することもできます。また、受け入れ先をフォーム全体にしておいて、メッセージを受信した時に FindDragTarget 関数で限定することもできます。
ただし、本サンプルの場合は TImage が対象のコントロールです。実行中に何らかの画像が表示されていないと TImaage がどこにあるか判定するのが困難ですから、実用的とは言えません。
|
リスト3
ドラッグ & ドロップの受け入れ先を限定する方法 |
if Msg.message = WM_DROPFILES then begin
if FindDragTarget(Msg.pt, False) <> Image1 then exit;
| 03_ShellExecute 関数や CreateProcess 関数での起動パラメータ |
|
ドラッグ & ドロップでアプリを起動する際に与えるパラメータは、コマンドラインパラメータ、あるいはコマンドラインの引数、起動パラメータ、起動オプションと言う場合もあります。
これらのパラメータは、ShellExecute 関数や CreateProcess 関数で EXE を起動する際にも、起動パラメータとして指定できます。この後のサンプルの記事を参考にしてください。
上のサンプルは、起動した EXE 側でパラメータを受け取る処理です。
ShellExecute 関数や CreateProcess 関数で EXE を起動する時は、パラメータを与える側の処理ということになります。 |
| 04_EXE のショートカットにおける起動パラメータの設定 |
|
EXE のショートカットに起動パラメータ (起動オプション、起動パラメータ) を指定しておくには、下図のように [リンク先] で設定します。
|
 |
図6
EXE のショートカットで起動オプション (起動パラメータ) を設定 |
| 05_コマンドプロンプトから EXE を起動する場合 |
コマンドラインパラメータは、下図のように、コマンドプロンプトからも指定できます。これがコマンドラインパラメータと言われる由来です。
次のコードは、最初のサンプルと同じ画像ファイルを指定して、その画像を表示します。 |
 |
図7
コマンドライン |
| 06_IDE での実行時にコマンドラインパラメータ ( 実行時引数 ) を設定 |
通常、プログラムの開発時は IDE(統合開発環境)の元でコンパイルして実行します。
この時、[実行] メニューの [実行時引数] のダイアログで、パラメータを設定すると、これが、実行時のコマンドラインパラメータとなります。 |
 |
図8
コマンドラインパラメータの設定 |
|
本ページの最初のサンプルの実行結果です。画像を、上の図のパラメータの設定で示す場所に置いて実行しています。
[実行] [実行時引数] のダイアログで設定したコマンドラインパラメータは、IDE から実行した場合だけ有効となります。作成した EXE を直接起動した場合は、この設定は無視されます。つまり、この設定は、設計時における動作確認用として使われるだけです。
この設定内容は、プロジェクトには保存されています。プロジェクトファイルを他の方に提供する場合は注意が必要です。
|
 |
図9
[実行時引数] を設定して IDE から実行した場合 |
 |
図10
作成した EXE を直接実行した場合
- [実行時引数] の設定をしないで実行した場合と同じ結果となる
|
|