ドラッグ・アンド・ドロップ操作は、オブジェクトをある場所から別の場所に移動またはコピーするために使用されます。

ドラッグ・アンド・ドロップ操作は、マウスの左ボタンをクリックしてマウスでオブジェクトを選択すると開始します。それからマウスの左ボタンを押さえたままオブジェクトをドラッグし、最後にマウスの左ボタンを離してオブジェクトをドロップします。

ドラッグ・アンド・ドロップ操作は、4つのイベントで構成されます。

ドラッグ・アンド・ドロップされるオブジェクトは、Payloadです。

LANSAコントロールで、ドラッグ・オーバーまたはドラッグ・アンド・ドロップ・イベント中に Windows Explorer からのファイル・パスを受け入れるようにするには、Sys_Appln で (例えば) 次のプロパティを有効にします。 #com_owner.Initialize.

#SYS_APPLN.AllowWindowsDragDrop := True

ファイルをドラッグすると、イベント・ハンドラーのPayloadパラメータに、タイプ #PRIM_APPL.IDragDropFilePaths のコンポーネント・インターフェースが含まれます。

このインターフェースは、2つのメソッドを公開します。

FileCount

ドラッグされたファイルの数を確認する

FilePath<インデックス>

位置インデックスのファイル・パスを取得する

 
以下は、この機能を使用して、ListViewコントロールにドラッグ・アンド・ドロップされるファイル・パスのリストを取得できるようにする方法の例を示しています。

新しいフォームを作成し、ソースを次のコードで置き換えます。
 

*
**************************************************
*
*  COMPONENT:  STD_FORM
*
*
**************************************************
Function Options(*DIRECT)
Begin_Com Role(*EXTENDS #PRIM_FORM) Clientheight(374) Clientwidth(449) Dragstyle(Aggregated) Height(410) Left(513) Top(151) Width(465)
 
Define_Com Class(#PRIM_LTVW) Name(#ListView) Columnbuttonheight(20) Componentversion(2) Displayposition(1) Dragstyle(Automatic) Enforceminimumsize(True) Fullrowselect(True) Height(289) Keyboardpositioning(SortColumn) Left(16) Parent(#COM_OWNER) Showsortarrow(True) Tabposition(1) Top(8) Width(420)
Define_Com Class(#PRIM_LVCL) Name(#LVCL_1) Caption('Items') Captiontype(Caption) Displayposition(1) Minimumwidth(10) Parent(#ListView) Source(#STD_NUM) Width(10)
Define_Com Class(#PRIM_LVCL) Name(#LVCL_2) Caption('File Path') Captiontype(Caption) Displayposition(2) Minimumwidth(10) Parent(#ListView) Source(#VF_INSDTA) Width(93)

* Initialisation
Evtroutine Handling(#com_owner.Initialize)
#SYS_APPLN.AllowWindowsDragDrop := True
Set Com(#com_owner) Caption(*component_desc)
Endroutine
 
Evtroutine Handling(#ListView.DragOver) Options(*NOCLEARMESSAGES *NOCLEARERRORS) Payload(#draggedData) Acceptdrop(#acceptDrop) Dragstate(#dragState)
If (#dragState *NE Exit)
If (#draggedData *Is #PRIM_APPL.IDragDropFilePaths)
#STD_NUM := (#draggedData *As #PRIM_APPL.IDragDropFilePaths).FileCount
#VF_INSDTA := ''
 
Clr_List Named(#ListView)
 
Add_Entry To_List(#ListView)
 
#acceptDrop := True
Endif
Endif
Endroutine
 
Evtroutine Handling(#ListView.DragDrop) Options(*NOCLEARMESSAGES *NOCLEARERRORS) Payload(#draggedData)
Clr_List Named(#ListView)
 
If (#draggedData *Is #PRIM_APPL.IDragDropFilePaths)
Define Field(#NumFiles) Reffld(#STD_NUM)
#NumFiles := (#draggedData *As #PRIM_APPL.IDragDropFilePaths).FileCount
#STD_NUM := 1
 
Dowhile Cond(#STD_NUM <= #NumFiles)
#VF_INSDTA := (#draggedData *As #PRIM_APPL.IDragDropFilePaths).FilePath<#STD_NUM>
Add_Entry To_List(#ListView)
#STD_NUM += 1
Endwhile
Endif
Endroutine
End_Com


Windows Explorerを使用してファイルを選択します。ファイルをListViewの上にドラッグし、選択したファイルの数が「Items」列に表示されるのを確認します。ファイルをListViewの上にドロップし、ファイル・パスが2列目に表示されるのを確認します。

警告:DragOver イベント・ハンドラーでドラッグ状態をチェックするコードに注意してください。DragDrop が完了した後、別の DragOver イベントが、dragState  Exit に設定して発生します。こうすることで、コントロールでドラッグ完了時に必要な任意の最終処理を実行できるようになります。



次のトピックも参照してください。

2.23.1 Payload

2.23.2 例1: ツリー内で社員を移動

2.23.3 例2: 2つのフォーム間で社員を移動