ドラック&ドロップ

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

version 11 (Modified)


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

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

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

Note: まず最初に、ドラッグ&ドロップアクションがある点から別の点までいくつかのデータを"転送させる"ものとします。あとでドラッグ&ドロップがあらゆるデータタイプの操作メタファである点を見ます。

ドラック&ドロップオブジェクトプロパティ


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

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

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

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

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

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

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

Notes:

・ドラッグ可になっているテキストやボタンをドラッグするには、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 OverOn Dropドロップ先オブジェクトに送信されます

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

・プロパティリスト:

On Begin Drag Over

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

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

このイベントはドラッグアクションの高度な管理に使用できます。例えば:

・ペーストボードから (GET PASTEBOARD DATA コマンドを使用して) データと署名を取得する。

・ペーストボードに (APPEND DATA TO PASTEBOARD コマンドを使用して) データと署名を追加する。

・ドラッグされたオブジェクトのメソッドで$0を使用してドラッグを許可/拒否する。ドラッグアクションを受け入れるには、ソースオブジェクトのメソッドは ($0:=0を実行して) 0 (ゼロ) を返さなければなりません。ドラッグアクションを拒否するには、ソースオブジェクトのメソッドは ($0:=-1を実行して) -1 (マイナス1) を返さなければなりません。結果が返されない場合、4Dはドラッグが受け入れられたと判断します。

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

On Drag Over

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

警告: ドラッグ&ドロップがプロセス間のドラッグ&ドロップである場合、つまり、ソースオブジェクトがドロップ先オブジェクトのプロセス(ウインドウ)とは異なるプロセス(ウインドウ)にある場合は、On Drag Overイベントに対するドロップ先オブジェクトのオブジェクトメソッドはソースプロセスコンテキスト内(ソースオブジェクトのプロセス)で実行され、ドロップ先オブジェクトのプロセスでは実行されません。これは、このような実行が発生する唯一のケースです。このような実行の長所については、この章の最後で説明します。

On Drop

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 POINTERTypeのようなコマンドは、ソースオブジェクトの属性やタイプを調べる際に有効です。

ドラッグされたデータをコピーする目的でドラッグ&ドラッグ操作が行われた場合、これらのコマンドの機能は関わっているプロセスの数によって変わります:

・ ドラッグ&ドロップが1つのプロセスに限定されている場合、これらのコマンドを使い、適切な動作を実行します(例えばソースオブジェクトをドロップ先オブジェクトに代入するなど)。

・ ドラッグ&ドロップがプロセス間のドラッグ&ドロップである場合、ドラッグされたデータへのアクセスには注意が必要です。ソースプロセスのデータインスタンスにアクセスしなくてはなりません。ドラッグされたデータが変数の場合、GET PROCESS VARIABLEを使用して正しい値を取得できます。ドラッグされたデータがフィールドの場合、これら2つのプロセスではテーブルのカレントレコードが異なる可能性が高いということに留意してください。正しいレコードにアクセスする必要があります。

この場合、解決策が複数あります:

・On Drag Overイベントが発生すると、ドロップ先のオブジェクトメソッドはソースプロセスのコンテキスト内で実行されます。この時に、フィールドデータやレコード番号をインタープロセス変数にコピーし、On Dropイベントでこれを再利用するようにします。

・ソースプロセスのコンテキストで、ドロップ先オブジェクトメソッドのOn Drag Overイベントが実行されたら、フィールドデータやレコード番号をインタープロセス変数にコピーし、あとでOn Dropイベントで再利用します。

On Dropイベントでプロセス間通信を開始して、必要なデータを取得することができます。

ドラッグ&ドロップがデータを移動を目的としたものではなく、独特な処理のためのユーザインタフェースメタファである場合、希望するいかなる処理もプログラミングすることが出来ます。

ペーストボードテーマのコマンド


ドラッグ&ドロップ操作に、2つの4Dアプリケーション間または4Dアプリケーションとサードパーティーアプリケーション間でのデータやドキュメントの移動が関わる場合、“ペーストボード”テーマのコマンドが必要なツールを提供します。

実際、これらのコマンドはコピー/ペーストとデータのドラッグ&ドロップ両方の管理に使用できます。4Dは2つのペーストボードを使用します。1つはデータのコピー (またはカット) に使用される実際のクリップボードで、もう1つはドラッグおよびドロップされるデータのためのものです。これら2つのペーストボードは、同じコマンドを使用して管理されます。コンテキストによりどちらかにアクセスします。

ドラッグ&ドロップ操作に関する“ペーストボード”テーマのコマンドの詳細は、ペーストボードの管理の節を参照してください。

自動ドラッグ&ドロップ


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

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

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

自動ドラッグ: このオプションにチェックされていると、オブジェクトの自動ドラッグモードが有効になります。ピクチャでは、ドラッグ可オプションがチェックされていても、このモードが優先されます。このモードでは、On Begin Dragフォームイベントは生成されません。

標準のドラッグを強制したい場合、アクションの間Alt (Windows) または Option (Mac OS) キーを押します。

自動ドロップ: このオプションは自動ドロップモードを有効にするために使用します。4Dは可能な限り自動で、オブジェクトにドロップされたテキストやピクチャ型データの挿入を管理します (データはオブジェクトにペーストされます)。この場合On Drag OverOn Drop フォームイベントは生成されません。他方、ドロップ中の On After Edit とオブジェクトがフォーカスを失った時の On Data Change イベントは生成されます。

テキストやピクチャ以外のデータ (他の4Dオブジェクトやファイルなど) や複合データがドロップされた場合、アプリケーションはドロップ可オプションを参照します。オプションがチェックされていれば、On Drag OverOn Drop フォームイベントが生成されます。そうでなければドロップは拒否されます。これは“外部からのドラッグアンドドロップを拒否”オプションの設定も関連します (以下参照)。

外部からのドラッグアンドドロップを拒否 (互換性)


バージョン11より、4Dはピクチャファイルなど外部のセレクションやオブジェクト、ファイルのドラッグアンドドロップをサポートするようになりました。これはデータベースコードでサポートされなければなりません。

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

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

参照

DRAG AND DROP PROPERTIES, Drop position, Form event, GET PROCESS VARIABLE, Is a list, RESOLVE POINTER, Type.


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