4Dにはフォームやアプリケーションのオブジェクト間で動作する組み込のドラック&ドロップ機能があります。一つのオブジェクトを同一のウインドウ内、または別のウインドウにドラック&ドロップすることが出来ます。言い換えれば、同一のプロセスまたは別のプロセスに対してドラック&ドロップすることが出来ます。
またオブジェクトを4Dフォームと他のアプリケーション間でドラッグ&ドロップできます。例えばGIFピクチャを4Dのピクチャフィールドにドラッグ&ドロップできます。またワードプロセッサアプリケーションでテキストを選択し、4Dのテキスト変数にドロップできます。
そして、フォームが最前面になくとも、アプリケーションに直接オブジェクトをドロップできます。On Dropデータベースメソッド を使用して、このケースのドラッグ&ドロップを管理できます。つまり、例えば、4Dアプリケーションアイコンに4D Writeドキュメントをドロップして開くことができます。
注 : まず最初に、ドラッグ&ドロップアクションがある点から別の点までいくつかのデータを"転送させる"ものとします。あとでドラッグ&ドロップがあらゆるデータタイプの操作メタファである点を見ます。
あるオブジェクトから別のオブジェクトにドラッグ&ドロップを実行するには、プロパティリストウインドウでそのオブジェクト用のドラッグ可 プロパティを選択する必要があります。ドラッグ&ドロップ処理では、ドラッグされるオブジェクトがソースオブジェクト になります。
あるオブジェクトをドラッグ&ドロップ処理のドロップ先にするには、プロパティリストウインドウでそのオブジェクトのドロップ可 プロパティを選択する必要があります。ドラッグ&ドロップ処理では、データを受け取るオブジェクトがドロップ先オブジェクト になります。
自動ドラッグ と自動ドロップ : これら追加のプロパティは、テキストフィールドや変数、コンボボックス、そしてリストボックスで利用できます。自動ドロップオプションはピクチャフィール ドや変数でも利用できます。これらは内容のコピーに基づく自動ドラッグ&ドロップを有効にするために使用できます (4Dフォームイベントによるドラッグ&ドロップアクションの管理は行われなくなります)。この節の最後の"自動ドラッグ&ドロップ"の段落を参照してく ださい。
デフォルトで、新しく作成されたオブジェクトはドラッグもドロップもできません。これらのプロパティを設定するかどうかは開発者に任されています。
入力フォームまたはダイアログのフォームにあるすべてのオブジェクトは、ドラッグまたはドロップの対象にできます。配列の個別の要素(例えば、スク ロール可能エリア)や階層リスト項目、リストボックスの行はドラッグ&ドロップができます。逆に、配列の個別の要素や階層リスト項目、リストボッ クスの行に対してオブジェクトをドラッグ&ドロップすることもできます。ただし、出力フォームの詳細エリアからオブジェクトをドラッグ& ドロップすることはできません。
アプリケーションのフォーム外へのドラッグアンドドロップも、On Dropデータベースメソッド で管理できます。
全ての任意のタイプのアクティブオブジェクト(フィールドや変数)をソースおよびドロップ先として使用できるため、ドラッグ&ドロップのユーザインタフェースは簡単に作成できます。例えば、ボタンをドラッグ&ドロップできます。
注 :
"ドラッグ可"に設定されたテキストやボタンをドラッグするには、まずAlt (Windows) や Option (Mac OS) キーを押します。 デフォルトで、ピクチャフィールドや変数の場合は、ピクチャとその参照は両方ともドラッグされます。変数やフィールドの参照のみをドラッグしたい場合は、Alt ボタン(Windows)またはOption ボタン(Mac OS)を押す必要があります。 リストボックスオブジェクトで“ドラック可”と“行の移動可”が同時に選択されている場合、行が移動された場合は“行の移動可”が優先されます。この場合ドラッグはできません。 ドラッグとドロップの両方ができるオブジェクトは、開発者が禁止しない限り、自分自身にもドロップできます。詳細については、以下の説明を参照してください。
以下の図は、選択したオブジェクトに対してプロパティリストウインドウでドラッグ可プロパティとドロップ可プロパティを設定した状態を示しています:
プログラムによるドラッグ&ドロップの管理は、3つのフォームイベントに基づきます: On Begin Drag Over , On Drag Over そして On Drop 。
On Begin Drag Over イベントはドラッグのソースオブジェクトのコンテキストで生成される 点に注意してください。対してOn Drag Over とOn Drop はドロップ先オブジェクトに送信されます 。
アプリケーションがこれらのイベントを処理するためには、プロパティリストで正しく選択されていなければなりません:
プロパティリスト :
On Begin Drag Over フォームイベントは、ドラッグ可能なすべてのフォームオブジェクトで選択できます。このイベントは、オブジェクトがドラッグ可 プロパティを持っている場合、すべてのケースで生成されます。
On Drag Over フォームイベントと異なり、On Begin Drag Over はドラッグアクションのソースオブジェクトのコンテキストで呼び出されます。ソースオブジェクトのメソッドあるいはソースオブジェクトのフォームメソッドから呼び出されます。 このイベントはドラッグアクションの高度な管理に使用できます。例えば:
ペーストボードから ( GET PASTEBOARD DATA コマンドを使用して) データと署名を取得する。 ペーストボードに ( APPEND DATA TO PASTEBOARD コマンドを使用して) データと署名を追加する。 ドラッグの最中に(SET DRAG ICON コマンドを使用して)カスタムのアイコンを表示する。 ド ラッグされたオブジェクトのメソッドで$0を使用してドラッグを許可/拒否する。ドラッグアクションを受け入れるには、ソースオブジェクトのメソッドは ($0:=0 を実行して) 0 (ゼロ) を返さなければなりません。ドラッグアクションを拒否するには、ソースオブジェクトのメソッドは ( $0:=-1 を実行して) -1 (マイナス1) を返さなければなりません。結果が返されない場合、4Dはドラッグが受け入れられたと判断します。 4Dデータは、イベントが呼び出される前に、ペーストボードに置かれます。例えば、自動ドラッグ アクションなしでドラッグした場合、ドラッグされたテキストは、イベントが呼び出される時にはペーストボードにあります。
On Drag Over イベントは、マウスポインタがオブジェクトの上を移動する時に、繰り返しドロップ先オブジェクトに送られます。このイベントの応答として、開発者は通常、以下のことを行います:
DRAG AND DROP PROPERTIES コマンドを呼び出して、ソースオブジェクトに関する情報を得ます。(現在オブジェクトメソッドが実行されている) ドロップ先オブジェクトとソースオブジェクトの状態やタイプに基づき、ドラッグ&ドロップの受け付け または拒否 を行います。 ドラッグを受け付けるには、ドロップ先のオブジェクトメソッドが ($0:=0 を実行して) 0 (ゼロ) を返さなければなりません。ドラッグを拒否するには、オブジェクトメソッドが ($0:=-1 を実行して) -1 (マイナス1)を返さなければなりません。$0:=-1と記述します。On Drag Over イベント中、4Dはこのオブジェクトメソッドを関数として扱います。結果が返されない場合には、4Dはドラッグが受け付けられたものと認識します。
ドラッグを受け入れると、ドロップ先オブジェクトがハイライトされます。ドラッグを拒否した場合、ドロップ先オブジェクトはハイライトされません。 ドラッグを受け付けることは、ドラッグされたデータがドロップ先オブジェクトに挿入されるという意味ではありません。これは、単にマウスボタンをこの場所 で離したときに、ドラッグされたデータがドロップ先オブジェクトによって受け付けられたことを意味するだけです。
ドロップ可能なオブジェクトに対して開発者がOn Drag Over イベントを処理しない場合には、そのオブジェクトは、ドラッグされたデータの性質やタイプに関係なく、すべてのドラッグ処理に対してハイライトされます。
On Drag Over イベントは、ドラッグ&ドロップ処理の最初の段 階を制御する手段です。ドラッグされたデータがドロップ先オブジェクトと互換性のあるタイプかどうかをテストでき、またドラッグの受け付けや拒否をできる だけでなく、4Dがあなたの判断に基づいてドロップ先オブジェクトをハイライト(または無反応)されるため、この操作が有効であることを操作者にフィード バックすることができます。
On Drag Over イベントはマウスの移動に従って、現在のドロップ先オブジェクトに対して繰り返し送られるため、このイベントのコード処理は短く、短時間で実行されるようにしてください。
警告: 4D v11より、ドラッグ&ドロップがプロセス間のドラッグ&ドロップ である場合、つまりソースオブジェクトがドロップ先オブジェクトのプロセスとは異なるプロセス(ウインドウ)にある場合、On Drag Over イベントに対するドロップ先オブジェクトのオブジェクトメソッドはドロップ先プロセスのコンテキスト内 で実行されます。ドラッグされた要素の値を得るには、プロセス間通信コマンドを使用しなければなりません。通常このケースでは、On Begin Drag Over イベントとペーストボード テーマのコマンドを使用することが推奨されます。
On Drop イベントはマウスポインタがドロップ先オブジェクトに対して離されたときにそのオブジェクトに一度送られます。このイベントはドラッグ&ドロップ処理の第2段階であり、ユーザアクションの応答として処理を実行します。
このイベントは、On Drag Over イベント中にドラッグが受け付けられなかった場合には、オブジェクトに送られません。オブジェクトに対してOn Drag Over イベントを処理し、ドラッグを拒否した場合には、On Drop イベントは発生しません。つまり、On Drag Over イベント中にソースオブジェクトとドロップ先オブジェクト間のデータタイプの互換性をテストして、有効なドロップを受け付けた場合には、On Drop 中にデータの再テストをする必要はありません。データがドロップ先オブジェクトに対して適切であることは既にわかっているためです。
4Dのドラッグ&ドロップを実現する上での興味深い点は、必要なことは何でもできるというところです。例えば:
階層リストの項目がテキストフィールドに対してドロップされる場合、テキストフィールドの最初、最後、または途中にリスト項目のテキストを挿入できます。 フォームにゴミ箱のピクチャボタンを配置します。ピクチャには、2つの状態のピクチャが含まれており、一つはごみ箱が空、もう一方はいっぱいであ るかを表わすものとします。オブジェクトをゴミ箱ボタンにドロップすることは、(ユーザインタフェースの立場からすると)ごみ箱にドラッグされドロップさ れたオブジェクトを削除することです。この時、ドラッグ&ドロップはある場所から別の場所にデータを移動しませんが、その代わりにアクションを実 行します。 顧客リストを表示するフローティングウインドウを作成します。リストは配列をスクロールエリア等として配置します。このリストから別のオブジェクトへドラッグさせ、ドロップした顧客のレコードを表示するということが考えられます。 など 上記の例からもおわかりのように、4Dのドラッグ&ドロップインタフェースは任意のユーザインタフェースメタファを実現できるフレームワークです。
DRAG AND DROP PROPERTIES コマンドは、以下を返します:
ドラッグされたオブジェクト(フィールドまたは変数)へのポインタ ドラッグされたオブジェクトが配列要素またはリスト項目の場合には、配列要素番号または項目番号。 ソースプロセスのプロセス番号 Drop position コマンドは、ドロップ先オブジェクトが配列(スクロール可能エリアなど)、階層リスト、コンボボックスの場合にターゲット要素やリスト項目の項目位置、あるいはリストオブジェクトの場合に列番号を返します。
RESOLVE POINTER やType のようなコマンドは、ソースオブジェクトの属性やタイプを調べる際に有効です。
ドラッグされたデータをコピーする目的でドラッグ&ドラッグ操作が行われた場合、これらのコマンドの機能は関わっているプロセスの数によって変わります:
ドラッグ&ドロップが1つのプロセスに限定されている場合、これらのコマンドを使い、適切な動作を実行します(例えばソースオブジェクトをドロップ先オブジェクトに代入するなど)。 ドラッグ&ドロップがプロセス間のドラッグ&ドロップである場合、ドラッグされたデータへのアクセスには注意が必要です。ソースプロセスのデータインスタンスにアクセスしなくてはなりません。ドラッグされたデータが変数の場合、GET PROCESS VARIABLE を使用して正しい値を取得できます。ドラッグされたデータがフィールドの場合、これら2つのプロセスではテーブルのカレントレコードが異なる可能性が高いということに留意してください。正しいレコードにアクセスする必要があります。通常このケースでは、On Begin Drag Over イベントとペーストボード テーマのコマンドを使用することが推奨されます。 ドラッグ&ドロップがデータを移動を目的としたものではなく、独特な処理のためのユーザインタフェースメタファである場合、希望するいかなる処理もプログラミングすることが出来ます。
ドラッグ&ドロップ操作に、2つの4Dアプリケーション間または4Dアプリケーションとサードパーティーアプリケーション間でのデータやドキュメントの移動が関わる場合、“ペーストボード”テーマのコマンドが必要なツールを提供します。 実 際、これらのコマンドはコピー/ペーストとデータのドラッグ&ドロップ両方の管理に使用できます。4Dは2つのペーストボードを使用します。1つはデータ のコピー (またはカット) に使用される実際のクリップボードで、もう1つはドラッグおよびドロップされるデータのためのものです。これら2つのペーストボードは、同じコマンドを使 用して管理されます。コンテキストによりどちらかにアクセスします。
ドラッグ&ドロップ操作に関する“ペーストボード”テーマのコマンドの詳細は、ペーストボードの管理 を参照してください。
テキストエリア (フィールド, 変数, コンボボックス そしてリストボックス) やピクチャオブジェクトは自動ドラッグ&ドロップをサポートし、シングルクリックであるエリアから他のエリアにテキストやピクチャを移動またはコピーでき ます。これは同じ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 Over と On Drop フォームイベントは生成されません。他方、ドロップ中の On After Edit とオブジェクトがフォーカスを失った時の On Data Change イベントは生成されます。 テキストやピクチャ以外のデータ (他の4Dオブジェクトやファイルなど) や複合データがドロップされた場合、アプリケーションはドロップ可オプションを参照します。オプションがチェックされていれば、On Drag Over と On Drop フォームイベントが生成されます。そうでなければドロップは拒否されます。これは“外部からのドラッグアンドドロップを拒否”オプションの設定も関連します (以下参照)。
バージョン11より、4Dはピクチャファイルなど外部のセレクションやオブジェクト、ファイルのドラッグアンドドロップをサポートするようになりました。これはデータベースコードでサポートされなければなりません。 以前のバージョンの4Dから変換されたデータベースでは、既存のコードが対応していなければおかしな動作につながることになります。このため、環境設定の外部からのドラッグアンドドロップを拒否 オプションでこの機能を無効にできます。このオプションはアプリケーション/互換性のページにあります。変換されたデータベースではデフォルトでこのオプションがチェックされています。
このオプションがチェックされていると、外部オブジェクトの4Dフォームへのドロップは拒否されます。しかし、自動ドロップ オプションにより、外部オブジェクトの挿入が依然可能である点に留意してください。この場合アプリケーションがドロップされたテキストまたはピクチャデータを解釈できます。