ホーム >プログラム >Delphi ローテクTips

Delphi for .NET でドラッグアンドドロップ

Delphi for .NET でエクスプローラからのドラッグアンドドロップでファイルを取得。

基本的に.NETでない版とあまり変わりはないようです。

  private
    { Private 宣言 }
    procedure WMDropFiles(var Msg: TWMDROPFILES); message WM_DROPFILES;
implementation
uses
  System.Text, ShellAPI;

System.Text ユニットと ShellAPI ユニットが必要です。

procedure TForm1.FormCreate(Sender: TObject);
begin
  //ドラッグアンドドロップの受け入れ
  DragAcceptFiles(Handle, True);
end;
procedure TForm1.WMDropFiles(var Msg: TWMDROPFILES);
//最初の1ファイルのみ受け入れ
var
  l_Buffer: StringBuilder;
begin
  //DragQueryFileの戻り値 + 1 にしないと最後の1文字が取得できない
  l_Buffer := StringBuilder.Create(DragQueryFile(Msg.Drop, 0, nil, 0) + 1);
  DragQueryFile(Msg.Drop, 0, l_Buffer, l_Buffer.Capacity);
  DragFinish(Msg.Drop);

  //メディアプレーヤーで再生
  MediaPlayer1.FileName := l_Buffer.ToString;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;

Delphi for .NET においてWindowsAPIで文字列を取得するには System.Text.StringBuidler というのを使うようです。
またUnicode版のDragQueryFileWを指定しなくてもきちんとUnicodeに対応しています。
内部でUnicode版のDragQueryFileWに変換して呼んでるのだと思われます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.ComponentModel, Borland.Vcl.MPlayer;

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    procedure WMDropFiles(var Msg: TWMDROPFILES); message WM_DROPFILES;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation
uses
  System.Text, ShellAPI;
{$R *.nfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  //ドラッグアンドドロップの受け入れ
  DragAcceptFiles(Handle, True);
end;

procedure TForm1.WMDropFiles(var Msg: TWMDROPFILES);
//ドラッグアンドドロップ受け入れ(最初の1ファイルのみ)
var
  l_Buffer: StringBuilder;
begin
  //DragQueryFileの戻り値 + 1 にしないと最後の1文字が取得できない
  l_Buffer := StringBuilder.Create(DragQueryFile(Msg.Drop, 0, nil, 0) + 1);
  DragQueryFile(Msg.Drop, 0, l_Buffer, l_Buffer.Capacity);
  DragFinish(Msg.Drop);

  //メディアプレーヤーで再生
  MediaPlayer1.FileName := l_Buffer.ToString;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;

end.