C++ Builder CE クラス拡張

fmxでファイルエクスプローラーからファイルをDrag and Drop

Win32ぽいやり方もありますが、fmx限定ですけど、もっと簡単に実現する方法をnewsgroupで細川淳さん(Radstudio界隈のfame)に教えていただきましたので、C++ Builderへ移植というかtranslateします。まずオリジナルは、Delphiのソース

TForm1 = class(TForm)
public
   procedure DragOver(const Data: TDragObject;const Point: TPointF;var Operation: TDragOperation); override;
   procedure DragDrop(const Data: TDragObject; const Point: TPointF); override;
end;

procedure TForm1.DragDrop(const Data: TDragObject; const Point: TPointF);
  begin
  inherited;

// ドロップされたファイルの一覧を表示
  for var F in Data.Files do
      Memo1.Lines.Add(F);
   end;

procedure TForm1.DragOver(const Data: TDragObject;const Point: TPointF; var Operation: TDragOperation);
begin
 inherited;

// TDragOperation.None 以外を指定する
  Operation := TDragOperation.Copy;
end;

High Lighting Code Blockには言語としてDelphiやらObjective pascalがないので、C++にしました。なので構造というか、indentは適当です。

さて、Delphiからline by lineでC++ Builder CEへ変換ないし翻訳するのですが、classがらみは珍しいですね。ネット上の情報量は圧倒的にDelphi優位なので、C++ Builder CEプログラマもDelphiのコードは書けなくてもいいけど、読めるのが吉です。御託はいいので、結果を載せますかね。まず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 DragDrop(const Fmx::Types::TDragObject &Data, const System::Types::TPointF &Point);
	virtual void __fastcall DragOver(const Fmx::Types::TDragObject &Data, const System::Types::TPointF &Point, Fmx::Types::TDragOperation &Operation);

};
//---------------------------------------------------------------------------
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::DragDrop(const Fmx::Types::TDragObject &Data, const System::Types::TPointF &Point)
{
	TForm::DragDrop(Data,Point);
	for( int i = 0 ; i < Data.Files.Length ; i ++ )
		Memo1->Lines->Add(Data.Files[i]);


}

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;

}

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

	Memo1->Lines->Add("working....");

}
//---------------------------------------------------------------------------

Drag and Dropされたファイルの名前をフルパスでMemo1に書き加えるだけのコードです。実行例は、

ちゃんと動いていますね。

コメント