| 4D v15.4DRAG AND DROP PROPERTIES | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | 
    4D v15.4
 DRAG AND DROP PROPERTIES 
         | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| DRAG AND DROP PROPERTIES ( srcObject ; srcElement ; srcProcess ) | ||||||||
| 引数 | 型 | 説明 | ||||||
| srcObject | ポインター |   | ドラッグ&ドロップソースオブジェクトのポインタ | |||||
| srcElement | 倍長整数 |   | ドラッグされた配列要素番号, または ドラッグされたリストボックス行番号, または ドラッグされた階層リスト項目, または ソースオブジェクトが配列でもリストボックスでも 階層リストでもない場合、-1 | |||||
| srcProcess | 倍長整数 |   | ソースプロセス番号 | |||||
DRAG AND DROP PROPERTIESコマンドを使用して、On Drag OverイベントやOn Dropイベントが(配列、リストボックス、階層リストなどの)“複合”オブジェクト上で発生した時の、ソースオブジェクトについての情報を取得することができます。
特に、On Drag OverイベントまたはOn Dropイベントが発生するドロップ先オブジェクトのオブジェクトメソッド(またはそこから呼び出されるサブルーチン)の内部からDRAG AND DROP PROPERTIESコマンドを使用します。
重要: フォームオブジェクトは、ドロップ可プロパティが選択されている場合にドロップされたデータを受け付けます。また、そのオブジェクトメソッドは、On Drag OverやOn Dropを処理するためにアクティブにする必要があります。
コマンドの呼び出し後:
互換性に関する注意: 4Dバージョン11より、特にインタープロセス間では、ドラッグ&ドロップを On Begin Drag Over イベントとペーストボードテーマのコマンドを使用して管理することが推奨されます。
ドラッグ&ドロップイベント以外でDRAG AND DROP PROPERTIESコマンドを呼び出すと、引数srcObjectはNILポインタを返し、srcElementは-1を、srcProcessは0を返します。
Tip: 4Dはドラッグ&ドロップのグラフィカルな部分を自動的に処理します。次に開発者は適切な方法でイベントに応答する必要があります。以下の例で は、イベントに応答してドラッグされたデータをコピーしています。別の方法として洗練されたユーザインタフェースをインプリメントできます。例えば、フ ローティングウインドウから配列要素をドラッグ&ドロップすることにより、ドロップ先ウインドウ(ドロップ先オブジェクトが存在するウインドウ) に構造化されたデータ(例: 対象配列要素によって特定されたレコードのいくつかのフィールド)を入れるような処理です。
On Drag Overイベント中にドロップ先オブジェクトがドラッグ&ドロップ処理を受け付けるかどうかをドラッグオブジェクトのタイプや性質(または他の理由)に従って判断するには、DRAG AND DROP PROPERTIESコマンドを使用します。ドラッグ&ドロップを受け付ける場合には、オブジェクトメソッドは$0:=0を返す必要があります。ドラッグ&ドロップを受け付けない場合には、オブジェクトメソッドは$0:=-1を返す必要があります。ドラッグ&ドロップを受け付けたか、拒否したかは、画面に反映されます。つまり、オブジェクトがドラッグ&ドロップ処理のドロップ先となる場合にはハイライトされ、ドロップ先にならない場合にはハイライトされません。
複数のデータベースフォームの中にスクロールエリアがあり、そのスクロールエリアのある部分から別の部分へドラッグ&ドロップするだけで要素の順 序を手作業で変えたい場合があります。それぞれの状況に応じて特定のコードを書くよりも、これらのスクロールエリアを処理する汎用プロジェクトメソッドを 作成することができます。以下のようなコードを作成できます:
  ` Handle self array drag and drop プロジェクトメソッド
  ` Handle self array drag and drop (ポインタ) -> ブール
  ` Handle self array drag and drop ( ->array) -> Is a self array drag and drop
 Case of
    :(Form event=On Drag Over)
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
       If($vpSrcObj=$1)
  ` 自身の配列からのドラッグ&ドロップなら受け付ける
          $0:=0
       Else
          $0:=-1
       End if
    :(Form event=On Drop)
  ` ドラッグ&ドロップソースオブジェクトの情報を取得
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` ドロップ先要素番号を取得
       $vlDstElem:=Drop position
  ` 自身の要素へのドロップでなければ
       If($vlDstElem #$vlSrcElem)
  ` ドラッグされた要素を配列の要素 0 に格納
          $1->{0}:=$1->{$vlSrcElem}
  ` ドラッグされた要素を削除
          DELETE FROM ARRAY($1->;$vlSrcElem)
  ` ドロップ先がソース要素より後なら
          If($vlDstElem>$vlSrcElem)
  ` ドロップ先要素番号をデクリメント
             $vlDstElem:=$vlDstElem-1
          End if
  ` ドラッグアンドドロップが最後の要素より後に発生していたら
          If($vlDstElem=-1)
  ` ドロップ先を配列の新しい最期の要素にセット
             $vlDstElem:=Size of array($1->)+1
          End if
  ` 新しい要素を挿入
          INSERT IN ARRAY($1->;$vlDstElem)
  ` 配列の要素0に格納した値を代入
          $1->{$vlDstElem}:=$1->{0}
  ` この要素を配列の新しい選択要素にする
          $1->:=$vlDstElem
       End if
 End caseこのプロジェクトメソッドを実装したら、以下のように使用できます:
  ` anArray スクロールエリアのオブジェクトメソッド
 
 Case of
  `...
    :(Form event=On Drag Over)
       $0:=Handle self array drag and drop(Self)
    :(Form event=On Drop)
       Handle self array drag and drop(Self)
  ` ...
 End case複数のデータベースフォームで、さまざまなソースからドラッグアンドドロップを受け付けたい入力可テキストエリアがあります。それぞれに特定のコードを書くのではなく、汎用のメソッドを書くことができます。コードは以下のようになります:
  ` Handle dropping to text area プロジェクトメソッド
  ` Handle dropping to text area ( Pointer )
  ` Handle dropping to text area ( -> テキストまたは文字列変数 )
 
 Case of
  ` ドラッグ&ドロップを受け入れまたは拒否するためにこのイベントを使用する
    :(Form event=On Drag Over)
  ` $0を拒否値に初期化する
       $0:=-1
  ` ソースオブジェクトの情報を取得する
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` この例題では、自身のドラッグアンドドロップを許可しない
       If($vpSrcObj #$1)
  ` ドラッグされたデータのタイプを取得
          $vlSrcType:=Type($vpSrcObj->)
          Case of
             :($vlSrcType=Is alpha field)
  ` 文字フィールドは受け入れる
                $0:=0
  ` 変数に値をコピー
                <>vtDraggedData:=$vpSrcObj->
             :($vlSrcType=Is text)
  ` テキストフィールドまたは変数は受け入れる
                $0:=0
                RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum)
  ` フィールドなら
                If(($vlTableNum>0) & ($vlFieldNum>0))
  ` 変数に値をコピー
                   <>vtDraggedData:=$vpSrcObj->
                End if
             :($vlSrcType=Is string var)
  ` 文字列変数は受け入れる
                $0:=0
             :(($vlSrcType=String array)|($vlSrcType=Text array))
  ` 文字またはテキスト配列は受け入れる
                $0:=0
             :(($vlSrcType=Is longint)|($vlSrcType=Is real)
                If(Is a list($vpSrcObj->))
  ` 階層リストは受け入れる
                   $0:=0
                End if
          End case
       End if
 
  ` 実際のドラッグ&ドロップアクションを行うためこのイベントを使用する
    :(Form event=On Drop)
       $vtDraggedData:=""
  ` ソースオブジェクトの情報を取得する
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
       RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum)
  ` フィールドなら
       If(($vlTableNum>0) & ($vlFieldNum>0))
  ` On Drag Over イベントで設定した変数の値を取得
          $vtDraggedData:=<>vtDraggedData
       Else
  ` ドラッグされた変数の型を取得
          $vlSrcType:=Type($vpSrcObj->)
          Case of
  ` 配列なら
             :(($vlSrcType=String array)|($vlSrcType=Text array))
                If($vlPID #Current process)
  ` ソースプロセスの変数インスタンスから要素を取得
                   GET PROCESS VARIABLE($vlPID;$vpSrcObj->{$vlSrcElem};$vtDraggedData)
                Else
  ` 配列要素をコピー
                   $vtDraggedData:=$vpSrcObj->{$vlSrcElem}
                End if
  ` If it is a list
             :(($vlSrcType=Is real)|($vlSrcType=Is longint))
  ` 他のプロセスのリストなら
                If($vlPID #Current process)
  `他のプロセスのリスト参照を取得
                   GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vlList)
                Else
                   $vlList:=$vpSrcObj->
                End if
  ` リストが存在すれば
                If(Is a list($vpSrcObj->))
  `位置が取得された項目のテキストを取得
                   GET LIST ITEM($vlList;$vlSrcElem;$vlItemRef;$vsItemText)
                   $vtDraggedData:=$vsItemText
                End if
             Else
  ` 文字列またはテキスト変数
                If($vlPID #Current process)
                   GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vtDraggedData)
                Else
                   $vtDraggedData:=$vpSrcObj->
                End if
          End case
       End if
  ` 実際ドロップされるものがある場合 (ソースオブジェクトが空の場合がある)
       If($vtDraggedData #"")
  ` テキスト変数の文字長が 32,000 文字を超ないかチェック
          If((Length($1->)+Length($vtDraggedData))<=32000)
             $1->:=$1->+$vtDraggedData
          Else
             BEEP
             ALERT("ドラッグ&ドロップができません。テキストが長すぎます。")
          End if
       End if
 
 End caseこのプロジェクトメソッドを実装したら、以下のように使用できます:
  ` [anyTable]aTextField オブジェクトメソッド
 
 Case of
  ` ...
    :(Form event=On Drag Over)
       $0:=Handle dropping to text area(Self)
 
    :(Form event=On Drop)
       Handle dropping to text area(Self)
  ` ...
 End caseリストボックスからドラッグされたデータをテキストエリアにコピーする。

label1のオブジェクトメソッドは以下のとおりです:
 Case of
    :(Form event=On Drag Over)
       DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
       If($source=Get pointer("list box1"))
          $0:=0 `ドロップを受け入れる
       Else
          $0:=-1 `ドロップを拒否する
       End if
    :(Form event=On Drop)
       DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
       QUERY([Members];[Members]LastName=arrNames{$arrayrow})
       If(Records in selection([Members])#0)
          label1:=[Members]FirstName+" "+[Members]LastName+Char(Carriage return)+[Members]Address
          +Char(Carriage return)+[Members]City+","+" "+[Members]State
          +" "+[Members]ZipCode
       End if
 End case以下のようなアクションが可能になります:

									Drop position
									
									Form event
									
									GET PROCESS VARIABLE
									
									Is a list
									
									RESOLVE POINTER
									
									ドラッグ&ドロップ
									
	プロダクト: 4D
	テーマ: ドラッグ&ドロップ
	番号: 
        607
        
        
        
	
	変更: 4D 2004.2
	
	
	
	
	ランゲージリファレンス ( 4D v15.4)
	
	
	ランゲージリファレンス ( 4D v15)
	
	
	
	
	
	
	
	
	ランゲージリファレンス ( 4D v15.3)
	
	
 コメントを追加
コメントを追加