AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX]ドロップ先(DropTarget)2013/10/15
 
前頁で[Additional]内の「CalendarEdit」(カレンダーエディット)について書きましたので次は、同じく[Additional]内の「DropTarget」(ドロップ先)について見ていきます。
 
Delphi2010・VCLアプリケーションで、これを専門に行うコンポーネントは無いと思われます(というよりもプログラミングでドロップ先に指定してしまえるコンポーネントは幾つかあります)。
 
 


(ヘルプより)
Filter(※1)
ファイル名フィルタの文字列を表します。
Filterは、ドラッグされているオブジェクトが、TDropTargetコントロールによって許容されるかどうかを判断するために使用される、ファイル名フィルタのリストを表します。
FilterIndex
現在アクティブなフィルタのインデックスを表します。
FilterIndexは、Filterプロパティによって定義されるフィルタの1つを選択するために使用することができます。
たとえば、Filterプロパティの値が 'アプリケーション (*.exe)|*.EXE|テキスト ファイル (*.txt)|*.TXT'で、FilterIndexプロパティの値が2であった場合、*.txtファイルがTDropTargetコントロールによって許容されます。
メモ: FilterIndex プロパティの値が1より低いか、ファイル名フィルタの数を超えていた場合、いずれのフィルタも適用されません。
OpenDialog、SaveDialog等で使用する Filter、FilterIndexと同じ、と思っておけば簡単でしょう。
 
OnDragDrop
ドラッグされたコントロールがドロップされた際に、発生します。
OnDragDrop はまた、DragDrop が呼び出された際にも発生します。
OnDragEnd
コントロールのドラッグが終了した際に、発生します。
ドラッグのセッションは、コントロールをドロップするか、ドロップをキャンセルすることで終了します。
OnDragEnd はまた、DragEnd が呼び出された際にも発生します。
OnDragEnter
ドラッグされたオブジェクトが、現在のコントロールの領域に入った際に、発生します。
OnDragEnter はまた、DragEnter が呼び出された際にも発生します。
OnDragLeave
ドラッグされたオブジェクトが、現在のコントロールの領域から出た際に、発生します。
OnDragLeave はまた、DragLeave が呼び出された際にも発生します。
OnDragOver
ドラッグされたオブジェクトが、現在のコントロールの領域上にある際に、発生します。
OnDragOver はまた、DragOver が呼び出された際にも発生します。
OnDropped
ドラッグしているオブジェクトが TDropTarget コントロール上にドロップされた際に、発生します。
OnDropped イベント ハンドラを記述すると、ドラッグしていたオブジェクトが TDropTarget コントロールにドロップされた際に、特別な処理を実行させることができます。
メモ: OnDropped は、ドラッグしていたオブジェクトが TDropTarget コントロールによって受け入れられた場合にのみ、発生します。
 
※1 Filter(ヘルプより)
ファイル名フィルタの文字列を表します。
Filterは、ドラッグされているオブジェクトが、TDropTargetコントロールによって許容されるかどうかを判断するために使用される、ファイル名フィルタのリストを表します。
 
FilterIndex プロパティの値によって示されるフィルタが、ドラッグされているオブジェクトのファイル名の少なくとも 1 つに一致した場合にのみ、ドラッグされているオブジェクトは許容されます。Filter の値が空文字列だった場合、何も許容されません。すべてのタイプのドロップされたオブジェクトを許容するには、Filter プロパティに空文字列を設定し、次の行を OnDragOver イベント ハンドラに追加します:
Accept:=true;
Filter が正しく動作するようにするには、割り当てる文字列が、TOpenDialog コントロールの Filter と同じ形式でなければなりません。形式は次の通りです:
'<1番目のフィルタ名>|<1番目のフィルタ値>|<2番目のフィルタ名>|<2番目のフィルタ値>|...|<n番目のフィルタ名>|<n番目のフィルタ値>'
たとえば、次のコード サンプルでは、テキストおよび実行可能ファイルに対するフィルタを追加しています:
DropTarget1.Filter := 'アプリケーション (*.exe)|*.EXE|テキスト ファイル (*.txt)|*.TXT';
 
(ヘルプより)
TDragObject のドロップ先を表します。
 
TDragObjectの型で定義済みのフィルタが渡される場合は、TDropTargetに対するドラッグアンドドロップ操作の結果、その OnDropped イベントがトリガされます。
 
Filter プロパティおよび FilterIndex プロパティを指定することで、OnDragDrop イベントおよび OnDropped イベントをトリガする TDragObject の種類を限定できます。
 
まずは、下記のように配置を行います。

隣に ListBox1 を配置しています。
DropTarget1 の OnDragOver イベントハンドラを下記のように記述します。
procedure TForm1.DropTarget1DragOver(Sender: TObject;
 const Data: TDragObject; const Point: TPointF; var Accept: Boolean);
begin
 Accept := True ;
end;
次に、DropTarget1 の OnDragDrop イベントハンドラを下記のように記述します。
procedure TForm1.DropTarget1DragDrop(Sender: TObject;
 const Data: TDragObject; const Point: TPointF);
var
 i : integer ;
begin
 for i := 0 to Length(Data.Files)-1 do
  ListBox1.Items.Add(Data.Files[i]);
end;
OnDroppedイベントハンドラでも同様に書けますが、どちらに書いた方がいいのかは分かりませんが、OnDroppedよりも OnDraDrop の方が先に処理されるようです。
 
保存・コンパイル・実行してみます。

 
Windowsのエクスプローラを起動し、
ドラッグしたいファイルを選択します


作成したテストプログラムのDragTarget1 へ
ドラッグ&ドロップを行います


ListBox1にドロップしたファイル一覧が表示されます

 
さて、次は、Filter、FilterIndex です。
オブジェクトインスペクタにて、Filterの内容を、ヘルプ記載のように
「アプリケーション (*.exe)|*.EXE|テキストファイル (*.txt)|*.TXT」
としてみます。
FilterIndex は「1」のままにしておきます。
 
保存・コンパイル・実行をして、上記と同様、エクスプローラからドラッグ&ドロップを行なってみます。

禁止マークが出ていますね


ドロップ処理は行われませんでした
 
OnDragOver イベントハンドラ内を消しても同様です。
他にそれらしきプロパティも見当たりませんし、ヘルプの DropTarget ページにも特別何も書いていない様子です。正直、よく分かりません。
 
ですが、そういったプロパティで制約せずとも、プログラム内で、ファイルの拡張子を確認させて、受け入れる・受け入れない、といった事を行えばいいだけですので別段問題は無いでしょう。
(複数のファイルをドラッグ&ドロップする場合、マウスで大きく範囲選択をして無関係なファイルも一緒にドラッグ&ドロップしてしまう際には、どのみち、プロパティでの制約は行いにくい場合も有り得ますからプログラミングで対応すれば良いと思われます)
 
 
それでは各スタイルでの画面状態を確認しておきます。
なし
Air.Style
Amakrits.Style
AquaGraphite.style
Blend.Style
Dark.Style
GoldenGraphite.Style
Light.Style
MetropolisUIBlack.Style
MetropolisUIBlue.Style
MetropolisUIDark.Style
MetropolisUIGreen.Style
RubyGraphite.style
Transparent.Style
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
>DelphiXE3
▲2013/10/14
 2013/10/15
▼2013/10/15
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.