C++ Builder CE tips

FMXでファイルをフォームへDrag and Dropする。 FMX

別記事でC++ Builderに関する情報収集のコツを語りたいと思っていますが、これは具体例の1。サブタイトルの機能をFMXで実現することについて、NewsGroupで質問を投げたら、Delphi界隈で極めて高名なJun HOSOKAWAさんに FMXなら簡単にできるよ と教えてもらいました。今回はそちらのやり方を記載しますね。あ、元ネタはDelphiで書かれていましたが、C++ Builderで書きました。

ようするにTFormのDragOverとDragDropをオーバーライドすればいいということです。VCLやFMXのコンポーネントにはイベントフックを明示的に引き出せる場合があります。そういう場合は、プロパティーから関数を引き出して、具体的にオーバーライドすればいいんですが、TFormもそれが出来るということです。出来ると分かれば簡単ですよ。

Unit1.hがミソですけど、

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <FMX.Controls.hpp>
#include <FMX.Forms.hpp>
#include <FMX.Controls.Presentation.hpp>
#include <FMX.Memo.hpp>
#include <FMX.Memo.Types.hpp>
#include <FMX.ScrollBox.hpp>
#include <FMX.Types.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TMemo *Memo1;

private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
	virtual void __fastcall DragOver(const Fmx::Types::TDragObject &Data, const System::Types::TPointF &Point, Fmx::Types::TDragOperation &Operation);
	virtual void __fastcall DragDrop(const Fmx::Types::TDragObject &Data, const System::Types::TPointF &Point);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cppの方は、

//---------------------------------------------------------------------------

#include <fmx.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
//---------------------------------------------------------------------------

void __fastcall TForm1::DragOver(const Fmx::Types::TDragObject &Data, const System::Types::TPointF &Point, Fmx::Types::TDragOperation &Operation)
{
	TForm::DragOver(Data,Point,Operation);
	Operation = TDragOperation::Copy;

}

void __fastcall TForm1::DragDrop(const Fmx::Types::TDragObject &Data, const System::Types::TPointF &Point)
{
	TForm::DragDrop(Data,Point);
	for( int i = Data.Files.Low ; i <= Data.Files.High ; i ++ )
        Memo1->Lines->Add(Data.Files[i]);
}
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

です。FormにはTMemoでも貼っておいてください。これで動きます。Win32 APIのごちゃごちゃがないというだけでもすっきりしてますね。FMXでWin32 APIのごちゃを使うやり方はまた別記事で。

コメント

  1. […] VCLやらFMXでエクスプローラーからフォームへのファイルのドラグアンドドロップを実現するためのやり方を3通り示しましたが、2番目の方法でjpegファイルをドラグアンドドロップすると撮影日時を表示するものを作りました。元のプログラムは、これC++ Builder CE tipsです。 […]