4D v14.3

DRAG AND DROP PROPERTIES

ホーム

 
4D v14.3
DRAG AND DROP PROPERTIES

DRAG AND DROP PROPERTIES 


 

DRAG AND DROP PROPERTIES ( srcObject ; srcElement ; srcProcess ) 
引数   説明
srcObject  ポインター in ドラッグ&ドロップソースオブジェクトのポインタ
srcElement  倍長整数 in ドラッグされた配列要素番号, または ドラッグされたリストボックス行番号, または ドラッグされた階層リスト項目, または ソースオブジェクトが配列でもリストボックスでも 階層リストでもない場合、-1
srcProcess  倍長整数 in ソースプロセス番号

説明   

DRAG AND DROP PROPERTIESコマンドを使用して、On Drag OverイベントやOn Dropイベントが(配列、リストボックス、階層リストなどの)“複合”オブジェクト上で発生した時の、ソースオブジェクトについての情報を取得することができます。

特に、On Drag OverイベントまたはOn Dropイベントが発生するドロップ先オブジェクトのオブジェクトメソッド(またはそこから呼び出されるサブルーチン)の内部からDRAG AND DROP PROPERTIESコマンドを使用します。

重要: フォームオブジェクトは、ドロップ可プロパティが選択されている場合にドロップされたデータを受け付けます。また、そのオブジェクトメソッドは、On Drag OverOn Dropを処理するためにアクティブにする必要があります。

コマンドの呼び出し後:

  • srcObject引数は、ソースオブジェクト(ドラッグ&ドロップするオブジェクト)へのポインタです。このオブジェクトは、ドロップ先オブジェクト(On Drag OverイベントまたはOn Dropイ ベントが発生するオブジェクト)または異なるオブジェクトである可能性がある点に注意してください。同一のオブジェクト間でデータのドラッグとドロップを 実行することは、配列や階層リストでは便利です。これは、ユーザが配列またはリストを手作業でソートする簡単な方法です。
  • ドラッグ&ドロップするデータが配列要素(配列要素のドラッグ)である場合、srcElement引数はその配列の要素番号を返します。リストボックスの行をドラッグされた場合は、srcElement引数はこの行番号を返します。階層リストの項目をドラッグされた場合は、srcElement引数は項目位置番号を返します。上記以外の場合、つまりソースオブジェクトが配列、リストボックスおよび階層リストでもない場合、srcElement引数は-1を返します。
  • ドラッグ&ドロップ処理はプロセス間でも発生します。srcProcess引 数は、ソースオブジェクトが属するプロセス番号と同じです。この引数の値をテストすることが重要です。同一プロセス内のドラッグ&ドロップに応答するのは、単にソースデータからドロップ先オブジェクトにコピーするだけです。一方でプロセス間のドラッグ&ドロップを扱う場合、GET PROCESS VARIABLEコマンドを使用してソースプロセスのオブジェクトインスタンスからソースデータを取得します。通常ドラッグ&ドロップはユーザインタフェース内で配列やリストなどのソース変数から、フィールドや変数などのデータ入力エリアに実装されます。

    互換性に関する注意: 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

以下のようなアクションが可能になります:

 
プロパティ 

プロダクト: 4D
テーマ: ドラッグ&ドロップ
番号: 607

 
履歴 

変更: 4D 2004.2

 
参照 

Drop position
Form event
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER
ドラッグ&ドロップ

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v11 SQL Release 6)
ランゲージリファレンス ( 4D v14 R3)
ランゲージリファレンス ( 4D v14 R2)
ランゲージリファレンス ( 4D v12.4)
ランゲージリファレンス ( 4D v13.5)
ランゲージリファレンス ( 4D v14.3)
ランゲージリファレンス ( 4D v14 R4)