DRAG AND DROP PROPERTIES

4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次

version 2004.2 (Modified)


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 OverOn Dropを処理するためにアクティブにする必要があります。

コマンドの呼び出し後:

srcObject引数は、ソースオブジェクト(ドラッグ&ドロップするオブジェクト)へのポインタです。このオブジェクトは、ドロップ先オブジェクト(On Drag OverイベントまたはOn Dropイベントが発生するオブジェクト)または異なるオブジェクトである可能性がある点に注意してください。同一のオブジェクト間でデータのドラッグとドロップを実行することは、配列や階層リストでは便利です。これは、ユーザが配列またはリストを手作業でソートする簡単な方法です。

・ドラッグ&ドロップするデータが配列要素(配列要素のドラッグ)である場合、srcElement引数はその配列の要素番号を返します。リストボックスの行をドラッグされた場合は、srcElement引数はこの行番号を返します。階層リストの項目をドラッグされた場合は、srcElement引数は項目位置番号を返します。上記以外の場合、つまりソースオブジェクトが配列、リストボックスおよび階層リストでもない場合、srcElement引数は-1を返します。

・ドラッグ&ドロップ処理はプロセス間でも発生します。srcProcess引数は、ソースオブジェクトが属するプロセス番号と同じです。この引数の値をテストすることが重要です。同一プロセス内のドラッグ&ドロップに応答するのは、単にソースデータからドロップ先オブジェクトにコピーするだけです。一方で、プロセス間のドラッグ&ドロップを扱う場合、GET PROCESS VARIABLEコマンドを使用してソースプロセスのオブジェクトのインスタンスからソースデータを取得します。ソースオブジェクトがフィールドの場合、プロセス間通信によりソースプロセスから値を取得するか、またはOn 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を返す必要があります。ドラッグ&ドロップを受け付けたか、拒否したかは、画面に反映されます。つまり、オブジェクトがドラッグ&ドロップ処理のドロップ先となる場合にはハイライトされ、ドロップ先にならない場合にはハイライトされません。

Tip: On Drag Overイベント中に、ドロップ先オブジェクトのオブジェクトメソッドは、ソースオブジェクトのプロセスのコンテキストで実行されます。プロセス間のドラッグ&ドロップのドラッグオブジェクトがフィールドである場合には、このイベントの機会を利用してソースデータをインタープロセス変数にコピーできます。そうすることによって、後で、On Dropイベント中に、ドラッグされたフィールドの値を取得するためにソースプロセスとのプロセス間通信を開始する必要がなくなります。プロセス間ドラッグ&ドロップにドラッグオブジェクトが変数の場合には、On Dropイベント中にGET PROCESS VARIABLEコマンドを使用できます。

例題

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

   Caes 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 スクロールエリアのオブジェクトメソッド

   Caes 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 

2. 複数のデータベースフォームで、さまざまなソースからドラッグアンドドロップを受け付けたい入力可テキストエリアがあります。それぞれに特定のコードを書くのではなく、汎用のメソッドを書くことができます。コードは以下のようになります:

      ` Handle dropping to text area プロジェクトメソッド
      ` Handle dropping to text area ( Pointer )
      ` Handle dropping to text area ( -> キストまたは文字列変数 )

   Caes of 
         ` ドラッグ&ドロップを受け入れまたは拒否するためにこのイベントを使用する
      : (Form event=On Drag Over)
            ` $0を拒否値に初期化する 
         $0:=-1
            ` ソースオブジェクトの情報を取得する
         DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
            ` この例題では、自身のドラッグアンドドロップを許可しない
         If ($vpSrcObj # $1)
               ` ドラッグされたデータのタイプを取得 
            $vlSrcType:=Type ($vpSrcObj->)
            Caes 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->)
            Caes 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 オブジェクトメソッド

   Caes 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 

3. リストボックスからドラッグされたデータをテキストエリアにコピーする。

label1のオブジェクトメソッドは以下のとおりです:

   Caes 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 - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次