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.