ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com

ホーム

 
4D v20 R7
ドラッグ&ドロップ

ドラッグ&ドロップ  


 

4Dにはフォームやアプリケーションのオブジェクト間で動作する組み込のドラック&ドロップ機能があります。一つのオブジェクトを同一のウインドウ内、または別のウインドウにドラック&ドロップすることが出来ます。言い換えれば、同一のプロセスまたは別のプロセスに対してドラック&ドロップすることが出来ます。

またオブジェクトを4Dフォームと他のアプリケーション間でドラッグ&ドロップできます。例えばPNGピクチャを4Dのピクチャフィールドにドラッグ&ドロップできます。またワードプロセッサアプリケーションでテキストを選択し、4Dのテキスト変数やリストボックスなどにドロップできます。

そして、フォームが最前面になくとも、アプリケーションに直接オブジェクトをドロップできます。On Dropデータベースメソッドを使用して、このケースのドラッグ&ドロップを管理できます。つまり、例えば、4Dアプリケーションアイコンに4D Write Pro ドキュメントをドロップして開くことができます。この特定の実装はOn Dropデータベースメソッド のページに詳細な説明があります。

4D では二つのドラッグ&ドロップモードを提供しています:

  • ドラッグ&ドロップオペレーション全体がプログラマーによって管理されるカスタムモード。このモードではドラッグ&ドロップに基づいたどんなインターフェースも実装することができます。これにはデータの転送を必ずしも伴わないものも含まれ、ファイルを開くや計算をトリガーするなどのどんなアクションも実行することができます。このモードは特定のプロパティ、イベント、“ペーストボード” テーマのコマンド等の組み合わせに基づいています。
  • ドラッグ&ドロップオペレーションによってあるオブジェクトから別のオブジェクトへと。データが自動的にコピーあるいは移動される自動モード。このモードはテキストベースのオブジェクトと(一部の)ピクチャーにおいて利用可能で、プロパティをチェックするだけで有効化されます。このモードの詳細については以下の自動ドラッグ&ドロップ の章に説明があります。

カスタムのドラッグ&ドロップインターフェースを実装するということは、プロパティ、イベント、そして一般的には ペーストボード テーマのコマンドを組み合わせるということを意味します。以下の図ではカスタムのドラッグ&ドロップシークエンスのキーポイントを描写しています:

実装の流れに関しては、以下のようなシナリオに基づいています:

  1. ソースオブジェクト("ドラッグ可"プロパティチェック済み)のOn Begin Drag Over イベントにおいて、APPEND DATA TO PASTEBOARD, SET FILE TO PASTEBOARD あるいは ペーストボード テーマのコマンドなどを用いて適切なデータをペーストボードに入れます。SET DRAG ICON コマンドを使用して特定のカーソルアイコンを定義することもできます。
  2. ドロップ先オブジェクト("ドロップ可"プロパティチェック済み)のOn Drag Over イベントにおいて、GET PASTEBOARD DATA TYPE あるいは GET PASTEBOARD DATA を使用して、ペーストボード内のデータの型、あるいはデータのシグネイチャー取得し、ドロップ先オブジェクトと互換性があるかどうかをチェックします。
    Drop position コマンドは、ドロップ先オブジェクトが配列(つまりスクロール可能なエリア)、改装リスト、テキストあるいはコンボボックスの場合にはターゲット要素のアイテム位置の要素番号を返し、ドロップ先オブジェクトがリストボックスの場合にはカラム番号を返します。
    ドロップ先オブジェクトまたは要素が互換性がある場合、コマンドは$0 に0 を返してドロップを受け付け、そうでない場合には$0 には-1 を返します。
  3. ドロップ先オブジェクト("ドロップ可"プロパティチェック済み)のOn Drop イベントにおいて、ドロップに対応するアクションを実行します。例えばドラッグ&ドロップの操作がドラッグしているデータをコピーする目的であった場合、そのデータをドロップ先オブジェクトへ割り当てます。ドラッグ&ドロップがデータの移動ではなく、特定の操作のためのユーザーインターフェースメタファーであった場合、例えばGet file from pasteboard コマンドを使用してファイルパスを取得するなど、必要な処理を実行します。

これらの全てのプロパティおよびイベントは、以下に詳細な説明があります。

あるオブジェクトから別のオブジェクトにドラッグ&ドロップを実行するには、プロパティリストウインドウでそのオブジェクト用のドラッグ可プロパティを選択する必要があります。ドラッグ&ドロップ処理では、ドラッグされるオブジェクトがソースオブジェクトになります。

あるオブジェクトをドラッグ&ドロップ処理のドロップ先にするには、プロパティリストウインドウでそのオブジェクトのドロップ可プロパティを選択する必要があります。ドラッグ&ドロップ処理では、データを受け取るオブジェクトがドロップ先オブジェクトになります。

注: 自動ドラッグ自動ドロップの追加のプロパティは、テキストフィールドや変数、コンボボックス、そしてリストボックスで利用できます。自動ドロップオプションはピクチャフィール ドや変数でも利用できます。これらは内容のコピーに基づく自動ドラッグ&ドロップを有効にするために使用されます(4Dフォームイベントによるドラッグ&ドロップアクションの管理は行われなくなります)。この節の最後の自動ドラッグ&ドロップ の段落を参照してく ださい。

デフォルトで、新しく作成されたオブジェクトはドラッグもドロップもできません。これらのプロパティを設定するかどうかは開発者に任されています。

入力フォームまたはダイアログのフォームにあるすべてのオブジェクトは、ドラッグまたはドロップの対象にできます。配列の個別の要素(例えば、スク ロール可能エリア)や階層リスト項目、リストボックスの行はドラッグ&ドロップができます。逆に、配列の個別の要素や階層リスト項目、リストボッ クスの行に対してオブジェクトをドラッグ&ドロップすることもできます。ただし、出力フォームの詳細エリアからオブジェクトをドラッグ& ドロップすることはできません。

アプリケーションのフォーム外へのドラッグアンドドロップも、On Dropデータベースメソッドで管理できます。

全ての任意のタイプのアクティブオブジェクト(フィールドや変数)をソースおよびドロップ先として使用できるため、ドラッグ&ドロップのユーザインタフェースは簡単に作成できます。例えば、ボタンをドラッグ&ドロップできます。

:

  • "ドラッグ可"に設定されたテキストやボタンをドラッグするには、まずAlt (Windows) や Option (macOS) キーを押します。
  • デフォルトで、ピクチャフィールドや変数の場合は、ピクチャとその参照は両方ともドラッグされます。変数やフィールドの参照のみをドラッグしたい場合は、Altボタン(Windows)またはOptionボタン(macOS)を押す必要があります。
  • リストボックスオブジェクトで“ドラック可”と“行の移動可”が同時に選択されている場合、行が移動された場合は“行の移動可”が優先されます。この場合ドラッグはできません。

ドラッグとドロップの両方ができるオブジェクトは、開発者が禁止しない限り、自分自身にもドロップできます。詳細については、以下の説明を参照してください。

以下の図は、選択したオブジェクトに対してプロパティリストウインドウでドラッグ可プロパティとドロップ可プロパティを設定した状態を示しています:

プログラムによるドラッグ&ドロップの管理は、3つのフォームイベントに基づきます: On Begin Drag Over, On Drag Over そして On Drop

On Begin Drag Overイベントはドラッグのソースオブジェクトのコンテキストで生成される点に注意してください。対してOn Drag OverOn Dropドロップ先オブジェクトに送信されます

アプリケーションがこれらのイベントを処理するためには、ソースオブジェクトとドロップ先オブジェクトの両方のプロパティリストで正しく選択されていなければなりません:

On Begin Drag Over フォームイベントは、ドラッグ可能なすべてのフォームオブジェクトで選択できます。このイベントは、オブジェクトがドラッグ可プロパティを持っている場合、すべてのケースで生成されます。ソースオブジェクトのメソッドあるいはソースオブジェクトのフォームメソッドから呼び出されます。

注: On Drag Over フォームイベントと異なり、On Begin Drag Over はドラッグアクションのソースオブジェクトのコンテキストで呼び出されます。

On Begin Drag Over イベントはドラッグアクションの高度な管理に使用できます。以下のようなことに使用できます:

  • ペーストボードに ( APPEND DATA TO PASTEBOARD コマンドを使用して) データと署名を追加する。
  • ドラッグの最中に(SET DRAG ICON コマンドを使用して)カスタムのアイコンを表示する。
  • ド ラッグされたオブジェクトのメソッドで$0を使用してドラッグを許可/拒否する。ドラッグアクションを受け入れるには、ソースオブジェクトのメソッドは ($0:=0を実行して) 0 (ゼロ) を返さなければなりません。ドラッグアクションを拒否するには、ソースオブジェクトのメソッドは ( $0:=-1を実行して) -1 (マイナス1) を返さなければなりません。結果が返されない場合、4Dはドラッグが受け入れられたと判断します。

4Dデータは、イベントが呼び出される前に、ペーストボードに置かれます。例えば、自動ドラッグアクションなしでドラッグした場合、ドラッグされたテキストは、イベントが呼び出される時にはペーストボードにあります。

On Drag Overイベントは、マウスポインタがオブジェクトの上を移動する時に、繰り返しドロップ先オブジェクトに送られます。このイベントの応答として、開発者は通常、以下のことを行います:

  • ペーストボード内にあるデータと署名を(GET PASTEBOARD DATA コマンドを使用して)取得する。
  • ソースオブジェクトの状態や型に基づき、ドラッグ&ドロップの受け付けまたは拒否を行います。

ドラッグを受け付けるには、ドロップ先のオブジェクトメソッドが ($0:=0を実行して) 0 (ゼロ) を返さなければなりません。ドラッグを拒否するには、オブジェクトメソッドが ($0:=-1を実行して) -1 (マイナス1)を返さなければなりません。$0:=-1と記述します。On Drag Overイベント中、4Dはこのオブジェクトメソッドを関数として扱います。結果が返されない場合には、4Dはドラッグが受け付けられたものと認識します。

ドラッグを受け入れると、ドロップ先オブジェクトがハイライトされます。ドラッグを拒否した場合、ドロップ先オブジェクトはハイライトされません。 ドラッグを受け付けることは、ドラッグされたデータがドロップ先オブジェクトに挿入されるという意味ではありません。これは、単にマウスボタンをこの場所 で離したときに、ドラッグされたデータがドロップ先オブジェクトによって受け付けられ、On Drop イベントが動くということを意味するだけです。

ドロップ可能なオブジェクトに対して開発者がOn Drag Overイベントを処理しない場合には、そのオブジェクトは、ドラッグされたデータの性質やタイプに関係なく、すべてのドラッグ処理に対してハイライトされます。

On Drag Overイベントは、ドラッグ&ドロップ処理の最初の段 階を制御する手段です。ドラッグされたデータがドロップ先オブジェクトと互換性のあるタイプかどうかをテストでき、またドラッグの受け付けや拒否をできる だけでなく、4Dがあなたの判断に基づいてドロップ先オブジェクトをハイライト(または無反応)されるため、この操作が有効であることを操作者にフィード バックすることができます。

On Drag Overイベントはマウスの移動に従って、現在のドロップ先オブジェクトに対して繰り返し送られるため、このイベントのコード処理は短く、短時間で実行されるようにしてください。

On Drop  

On Dropイベントはマウスポインタがドロップ先オブジェクトに対して離されたときにそのオブジェクトに一度送られます。このイベントはドラッグ&ドロップ処理の第2段階であり、ユーザアクションの応答として処理を実行します。

このイベントは、On Drag Overイベント中にドラッグが受け付けられなかった場合には、オブジェクトに送られません。オブジェクトに対してOn Drag Overイベントを処理し、ドラッグを拒否した場合には、On Dropイベントは発生しません。つまり、On Drag Overイベント中にソースオブジェクトとドロップ先オブジェクト間のデータタイプの互換性をテストして、有効なドロップを受け付けた場合には、On Drop中にデータの再テストをする必要はありません。データがドロップ先オブジェクトに対して適切であることは既にわかっているためです。

4Dのドラッグ&ドロップを実現する上での興味深い点は、必要なことは何でもできるというところです。例えば:

  • 階層リストの項目がテキストフィールドに対してドロップされる場合、テキストフィールドの最初、最後、または途中にリスト項目のテキストを挿入できます。
  • フォームにゴミ箱のピクチャボタンを配置します。ピクチャには、2つの状態のピクチャが含まれており、一つはごみ箱が空、もう一方はいっぱいであ るかを表わすものとします。オブジェクトをゴミ箱ボタンにドロップすることは、(ユーザインタフェースの立場からすると)ごみ箱にドラッグされドロップさ れたオブジェクトを削除することです。この時、ドラッグ&ドロップはある場所から別の場所にデータを移動しませんが、その代わりにアクションを実 行します。
  • 顧客リストを表示するフローティングウインドウを作成します。リストは配列をスクロールエリア等として配置します。このリストから別のオブジェクトへドラッグさせ、ドロップした顧客のレコードを表示するということが考えられます。
  • など

上記の例からもおわかりのように、4Dのドラッグ&ドロップインタフェースは任意のユーザインタフェースメタファを実現できるフレームワークです。

テキストエリア (フィールド, 変数, コンボボックス そしてリストボックス) やピクチャオブジェクトは自動ドラッグ&ドロップをサポートし、シングルクリックであるエリアから他のエリアにテキストやピクチャを移動またはコピーでき ます。これは同じ4Dエリア、2つの4Dエリア、4Dと他のアプリケーション間で使用できます。

Note: 2つの4Dエリア間の自動ドラッグ&ドロップの場合データは移動されます。言い換えれば、データはソースエリアから削除されます。データをコピーしたい場合、アクションの間Ctrl (Windows) または Option (Mac OS) を押します(OS Xの場合、ドラッグを開始した後Optionを押す必要があります)。

自動ドラッグ&ドロップはフォームオブジェクトごとに、プロパティリストの2つのオプション、自動ドラッグ自動ドロップで個別に設定できます:

  • 自動ドラッグ (テキスト型オブジェクトのみ): このオプションがをチェックすると、オブジェクトの自動ドラッグモードが有効になります。このモードでは、On Begin Dragフォームイベントは生成されません。
    自動ドラッグが有効のときに標準のドラッグを強制したい場合、アクションの間Alt (Windows) または Option (Mac OS) キーを押しながら操作します(OS Xの場合、ドラッグを開始する前Optionを押す必要があります)。このオプションはピクチャでは利用できません。
  • 自動ドロップ: このオプションは自動ドロップモードを有効にするために使用します。4Dは可能な限り自動で、オブジェクトにドロップされたテキストやピクチャ型データの挿入を管理します (データはオブジェクトにペーストされます)。この場合On Drag OverOn Drop フォームイベントは生成されません。他方、ドロップ中の On After Edit とオブジェクトがフォーカスを失った時の On Data Change イベントは生成されます。
    テキストやピクチャ以外のデータ (他の4Dオブジェクトやファイルなど) や複合データがドロップされた場合、アプリケーションはドロップ可オプションを参照します。オプションがチェックされていれば、On Drag OverOn Drop フォームイベントが生成されます。そうでなければドロップは拒否されます。これは“外部からのドラッグアンドドロップを拒否”オプションの設定も関連します (以下参照)。

バージョン11より、4Dはピクチャファイルなど外部のセレクションやオブジェクト、ファイルのドラッグアンドドロップをサポートするようになりました。これはデータベースコードでサポートされなければなりません。
以前のバージョンの4Dから変換されたデータベースでは、既存のコードが対応していなければおかしな動作につながることになります。このため、環境設定の外部からのドラッグアンドドロップを拒否オプションでこの機能を無効にできます。このオプションはアプリケーション/互換性のページにあります。変換されたデータベースではデフォルトでこのオプションがチェックされています。

このオプションがチェックされていると、外部オブジェクトの4Dフォームへのドロップは拒否されます。しかし、自動ドロップオプションにより、外部オブジェクトの挿入が依然可能である点に留意してください。この場合アプリケーションがドロップされたテキストまたはピクチャデータを解釈できます。

このシンプルな例題では、配列型リストボックスからドラッグしてきたデータをテキストエリアに入れたい場合を考えます:

リストボックスのオブジェクトメソッドには以下のようなコードが書かれています:

  //Object Method: ListBox
 If(Form event code=On Begin Drag Over)
    SET TEXT TO PASTEBOARD(arrFirstname{arrFirstname}+" "+arrLastname{arrFirstname})
 End if

テキストエリアのオブジェクトメソッドには以下のようなコードが書かれています:

  // Object Method: label1
 If(Form even codet=On Drop//プロパティリストにおいてドロップ可が有効化されている必要あり
    ARRAY TEXT($signatures_at;0)
    ARRAY TEXT($nativeTypes_at;0)
    ARRAY TEXT($formatNames_at;0)
    GET PASTEBOARD DATA TYPE($signatures_at;$nativeTypes_at;$formatNames_at)
    If(Find in array($signatures_at;"com.4d.private.text.native")#-1) // 4D テキストがペーストボードにある
       OBJECT Get pointer(Object current)->:=Get text from pasteboard
    End if
 End if

カスタムモード・自動モードの両方のドラッグ&ドロップ機構を組み合わせることで、シンプルで強力なインターフェースを作成することができます。この例題ではリストボックスからドラッグしてきたデータをテキストエリアに入れたい場合を考えます:

  • リストボックス側: "ドラッグ可"プロパティと"On Begin Drag Over" イベントがチェックされている
  • テキストエリア側: "自動ドロップ"プロパティがチェックされている

  //リストボックスのオブジェクトメソッド
 Case of
    :(Form event code=On Begin Drag Over)
       LOAD RECORD([Clients])
       $label:=[Clients]Name+Char(CR ASCII code)+[Clients]Contact+Char(CR ASCII code)+\
       [Clients]Address1+Char(CR ASCII code)+[Clients]City+", "+[Clients]State+" "+[Clients]ZipCode)
       SET TEXT TO PASTEBOARD($label)
 End case

データの移動と整形は、ドラッグ&ドロップを通して行われます:

ユーザーがディスク上のファイルを選択し、入力可能な(オブジェクト型の)変数にドラッグ&ドロップしたときにそのjson ファイル詳細を表示するようにしたい場合を考えます。

変数のオブジェクトメソッドに、以下のように書くだけです:

 C_LONGINT($0)
 Case of
 
    :(Form event code=On Drag Over)
  // ペーストボードにファイルが格納されている場合にのみOn Dropイベントを受け入れ、それ以外は拒否する
       If(Get file from pasteboard(1)="") //ペーストボードにファイルがない
          $0:=-1 //ドロップを拒否
       End if
 
    :(Form event code=On Drop//プロパティリストにてドロップ可アクションが有効化されている必要あり
       C_TEXT($path_t)
       C_OBJECT(path_o)
       $path_t:=Get file from pasteboard(1)
       If($path_t#"")
          path_o:=Path to object($path_t)
       End if
 
 End case

ユーザーがディスク上のファイルを選択し、リストボックス上にドラッグ&ドロップしたときにそのファイルのパスを表示するようにしたい場合を考えます。

リストボックスのオブジェクトメソッドに、以下のように書くだけです:

 C_LONGINT($0)
 Case of
 
    :(Form event code=On Drag Over)
  // ペーストボードにファイルが格納されている婆にのみOn Drop イベントを受け入れ、それ以外は拒否する
       If(Get file from pasteboard(1)#"") //少なくとも1つのファイルがドロップされた
          $0:=0 //ドロップを受け入れる
       Else //ペーストボードにファイルがない
          $0:=-1 //ドロップを拒否
       End if
 
    :(Form event code=On Drop//プロパティリストにてドロップ可アクションが有効化されている必要あり
       ARRAY TEXT(importedPath_at;0)
       C_TEXT($path_t)
       C_LONGINT($index_l)
       $index_l:=1
       Repeat
          $path_t:=Get file from pasteboard($index_l)
          If($path_t#"")
             APPEND TO ARRAY(importedPath_at;$path_t)
          End if
          $index_l:=$index_l+1
       Until($path_t="")
 End case



参照 

_o_DRAG AND DROP PROPERTIES
Drop position
Form event code
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER
Type

 
プロパティ 

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

 
ページの目次 
 
履歴 

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v20 R7)