ページ 11

ファイルのドラッグ&ドロップ C++builder

Posted: 2014年11月17日(月) 10:39
by ツンドラ
毎度お世話になっております。ツンドラと申します。
C++builder XE6でアプリケーション開発をしております。

今回は、エクスプローラからC++builderで作成したフォームアプリケーションにドラック&ドロップしたファイルを受け入れる機能を実装しようと思いました。
こちらのサイトを参考にしました。
http://www.geocities.jp/yuusui_housuu/p ... _drop.html

フォームにはMemoコンポーネントのみ配置しています。
以下のコードは変更した場所を抜粋しています。

コード:

/*ヘッダファイル*/

class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TMemo *Memo1;
private:	// ユーザー宣言

public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);

	void __fastcall WMDropFiles( TWMDropFiles &Msg );//この宣言を追加

	//以下の3行を追加します。
	//これにより、Formに向けて送られたメッセージをWMDropFilesに転送します。
	BEGIN_MESSAGE_MAP
	  VCL_MESSAGE_HANDLER( WM_DROPFILES , TWMDropFiles, WMDropFiles )
	END_MESSAGE_MAP( TForm )
};

コード:

/*ソースファイル*/
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	DragAcceptFiles(Form1->Handle, true );//ドラッグで受け取り可能に
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WMDropFiles( TWMDropFiles &Msg )
{
	// 変数宣言
	int FileCount;             	   //受け取ったファイル数
	wchar_t FileName[ MAX_PATH ];  //ファイルを一時保存 char→wchar_t
	Application->BringToFront();   //アプリケーションを前面に移動

	// ファイル数を得る
	FileCount = (int)DragQueryFile( (HDROP)Msg.Drop , 0xFFFFFFFF , NULL , MAX_PATH );

	//ファイルパスを得る
	Form1->Memo1->Clear();

	for( int i=0 ; i < FileCount ; ++i ){
		DragQueryFile((HDROP)Msg.Drop, i, FileName, MAX_PATH );
		Form1->Memo1->Lines->Add(FileName);
	}

	DragFinish((HDROP)Msg.Drop);
	Msg.Result = true;//falseならば、他のコントロールでも処理される可能性があるがfalseでも良い。
}
//---------------------------------------------------------------------------
ソースファイルの宣言にあるFileName[ MAX_PATH ]は、URLのサンプルコードではcharだったのですが、コンパイルにはじかれたためwchar_tにしました。
以下、charのときのコンパイルエラーです。
[bcc32 エラー] Unit1.cpp(33): E2034 'char[260]' 型は 'wchar_t *' 型に変換できない
[bcc32 エラー] Unit1.cpp(33): E2342 パラメータ 'lpszFile' は wchar_t * 型として定義されているので char * は渡せない

wchar_tにしたところ、コンパイルは通ったのですが、フォーム上にファイルをドラッグ&ドロップしてもTMemoに反応がありません。
理想ではドロップされたファイルがTMemo上に表示されて欲しいのですが、上手くいかずこちらに質問させて頂きました。

間違っている構文や改善などアドバイスいただきたいです。よろしくお願いします。