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に書き加えるだけのコードです。実行例は、

ちゃんと動いていますね。
コメント