複合オブジェクトの構築

概要

VLE 複合オブジェクトの機能により、VLE を使用してグラフィック階層を構築して VLE パレットに追加したり、組み込み VLE オブジェクトのように VLE レイアウトで使用できます。この機能はCurl Pro/IDE でのみ利用可能です。「Curl 及び Curl Pro 製品」を参照してください。VLEでレイアウトを作成するためのすべての手法が複合オブジェクトを作成する際にも利用できます。複合オブジェクトはその他にも スロット という機能を持っています。スロットはコンテナです。スロットは複合オブジェクトの中のコンテナです。複合オブジェクトをインスタンス化したレイアウト内で、そのコンテナの中にあるコンテンツを特定することができます。
複合オブジェクトを利用して、コンポジット コントロールを作成できます。必要なコンテナ、コントロール、およびその他のオブジェクトを含む複合オブジェクトを VLE で構築して、コンポジット コントロールが構築されます。複合オブジェクトの配置と動作を指定すると、結果として複合オブジェクトが作成され、VLE で構築されたアプリケーションで利用できます。このような場合は、スロット機能は通常は必要ありません。
複合オブジェクトを利用すると、各ペインを様々な情報表示に使用できるペイン配列などの、コンポジット コンテナを作成することもできます。このようなコンポジット コンテナは、それぞれのスロットに Frame を使用し、そのフレームの回りにはアイコンまたは他のコンポーネントを配置して構築できます。VLE ユーザーは、こうした複合オブジェクトをインスタンス化して、コンテンツを各フレームにドロップできます。複合オブジェクト定義の一部として指定されたグラフィック要素は、フレームに含まれるコンテンツの回りに自動的に表示されます。
複合オブジェクトを構築後は、VLE 機能拡張エディタを使用して、オブジェクトの VLE パレット機能拡張を構築できます。「VLE 機能拡張エディタ」を参照してください。複合オブジェクトにアクセスするため、VLE ユーザーは機能拡張をロードします。
複合オブジェクトにより、カスタマイズされたコンテナ オブジェクトを VLE パレットに追加できます。ただし、複合オブジェクトには、VLE にコンテナ オブジェクトを追加する汎用メカニズムはありません。複合オブジェクトの作成は、VLE でサポートされているコンテナに限定されます。

複合オブジェクト :プロセスの概要

VLE 複合オブジェクトの構築手順の概要を以下に示します。このプロセスは、VLE レイアウトの構築と似ています。「レイアウト : プロセスの概要」を参照してください。

複合オブジェクト内のスロット

レイアウトと複合オブジェクトの重要な違いの 1 つは、複合オブジェクトではコンテナをスロットとしてマークできることです。スロットとは、VLE ユーザーがレイアウト内で複合オブジェクトをインスタンス化する場合に、そのコンテンツを指定できるコンテナのことです。
レイアウト内の複合オブジェクトのインスタンスではスロットを選択できないことに注意してください。つまり、レイアウトではスロットのどのプロパティも編集できません。複合オブジェクト自体を選択して、そのプロパティを編集し、イベント ハンドラを追加できます。

スロットの作成

スロットを作成するには、複合オブジェクト内のコンテナを選択して、[編集]メニューから [スロットとしてマーク]を選択します。[レイアウト ツリー]ペインでオブジェクトの名前に下線が表示され、オブジェクトがスロットとしてマークされたことを示します。オブジェクトのマークを解除するには、[スロットのマークを解除]を選択します。[スロットとしてマーク]コマンド、[スロットのマークを解除]コマンドは、オブジェクトを右クリックして表示されるコンテキスト メニューからも使用できます。スロットとしてマークされたオブジェクトには、デザイン名が必要です。デザイン名のないオブジェクトは、複合オブジェクトをインスタンス化するときには使用できません。[スロットとしてマーク]コマンドでは、マークしたオブジェクトにデザイン名がない場合に警告が表示されます。
VLE がコンテナとして扱うすべてのオブジェクトをスロットとしてマークできるわけではありません。FrameVBoxCanvasTable など、スロットとして明らかに役立つオブジェクトは、すべてスロットとしてマークできます。コンテナ オブジェクトがスロットとして使用できない場合は、[スロットとしてマーク]コマンドは無効となり、このコマンドを適用できない理由がヒントで示されます。テーブル セルや CommandButton など、一部のオブジェクトは直接スロットとしてマークができませんが、スロットとしてマークできる Frame を追加できます。それ以外のオブジェクトはスロットとしてマークできず、Frame、特にテーブル行、RecordGridMenuBar、およびSubMenuを含めることはできません。また、コンテナがテーブル行またはセルの直接の子である場合は、スロットとしてマークできません。コンテナの親として Frame を作成し、スロットとしてマークします。

ホルダの内容をスロットに配置

複合オブジェクト内でスロットとしてマークされたコンテナは、"既定のコンテンツ" として機能する子オブジェクトを持つことができます。こうした子オブジェクトは [レイアウト ツリー]ペインに一覧表示され、複合オブジェクトの編集中に [レイアウト]ペインに表示されます。複合オブジェクトが最初に VLE レイアウトでインスタンス化される場合にも表示されます。ただし、VLE ユーザーがオブジェクトをインスタンス化された複合オブジェクト内のスロットにドロップすると、そのスロットに表示されていた子オブジェクトはすべて非表示になり、代わりにドロップされたオブジェクトが表示されます。スロットがもう一度空になると、複合オブジェクトの定義にある子オブジェクトがもう一度表示されます。実行時、子オブジェクトが置き換えられていないスロットには、複合オブジェクト定義で指定されたオブジェクトが表示されます。
この機能を利用すると、実際にスロットにドロップされるオブジェクトと同様のエラスティックを持つ Fill オブジェクトを最初の時点でそのスロットに入れることができるので、複合オブジェクトのレイアウトをより簡単に視覚化できます。この機能を利用してスロットに既定のコンテンツを入れることもできます。このコンテンツは、複合オブジェクトの一部の用法では他のオブジェクトに置き換えられ、その他の用法ではそのままになります。
この機能のため、既に祖先または子孫のオブジェクトがスロットとしてマークされているコンテナは、スロットとしてマークできません。

貼り付けとドロップ

スロットが含まれるグラフィック階層では、切り取りと貼り付け、およびドラッグ アンド ドロップ操作を実行できます。ただし、1 つ以上のスロットが含まれるグラフィック階層は、レイアウト クラス、または先祖が既にスロットであるなど、スロットが許可されない場所には貼り付けもドロップもできません。このような場合に貼り付けまたはドロップ操作を行うと、ドロップされたオブジェクト内でスロットとしてマークされたオブジェクトは、自動的にマークが解除されます。

例 :複合オブジェクトのスロット

Curl IDE ドキュメントには、複合オブジェクトでスロットを使用する拡張例があります。これらの使用については、「 拡張例」を参照してください。
このファイルには次の拡張例が含まれています。
d:\automated-build-temp\build\win32-atom\docs\default\examples\layout-editor\CompoundObject.zip
アーカイブ ファイルにはいくつかのディレクトリが含まれています。display-panes ディレクトリには、DISPLAY-PANES というプロジェクトがあり、DOC.DISPLAY.PANES パッケージ内の複合オブジェクトを定義しています。VLE でこのパッケージを開いて、複合オブジェクトを調べます。
これらのオブジェクトは、HBox および VBox を使用してレイアウトを提供し、ボーダー幅、色、スタイルのオプションを設定します。これらには、スロットとしてマークされる Frame が含まれています。フレームには、複合オブジェクトがレイアウト内で使用される場合に追加されるコンテンツのプレース ホルダとして機能する Fill オブジェクトが含まれています。次のリストにこのようなオブジェクトを示します。
このプロジェクトには、DOC.DISPLAY.PANES 内の複合オブジェクト用のパレット機能拡張も含まれます。パッケージ DOC.DISPLAY.PANES.EXT には、機能拡張エディタによって生成された設計時刻コードが含まれます。VLE 機能拡張エディタでファイル display-panes-ext.scurl を開き、機能拡張ファイルが DOC.DISPLAY.PANES をインポートしていること、3 つの複合オブジェクトのそれぞれにボタンを定義していることに注目してください。こうした複合オブジェクトにより構築された例を確認するには、VLE で [表示]メニューの [パレット機能拡張]から、display-panes-ext.scurl をロードする必要があります。
ディレクトリ display-panes-example には、DISPLAY-PANES-EXAMPLE という例があります。これは、display-panes で定義された複合オブジェクトを使用しています。ブラウザでこのアプレットを実行し、VLE レイアウトを表示できます。このプロジェクトは、複合オブジェクトを定義するプロジェクトのマニフェストにデリゲートします。2 つのプロジェクトの相対位置を変更した場合は、デリゲート先 を置き換える必要があります。「レイアウトにおける複合オブジェクトの使用」セクションには、レイアウトで複合オブジェクトを使用する場合についての説明があります。

複合オブジェクトにクラス メンバを追加

VLE は、複合オブジェクトのレイアウトの作成に役立ちますが、オブジェクトの動作は IDE ソース エディタを使用して実装する必要があります。必要とする動作を継承できない場合には、コントロールの動作を行うためのプロパティやメソッドなどのクラス メンバを追加する必要があります。
Curl IDE ドキュメントには、一般的なコントロール実装の拡張例があります。この例では、ユーザーは、左のリストに表示されたアイテムを右に移すと選択でき、もう一度左に移すと選択解除できます。拡張例の使用法については、「 拡張例」を参照してください。
このファイルには次の拡張例が含まれています。
d:\automated-build-temp\build\win32-atom\docs\default\examples\layout-editor\CompoundObject.zip
アーカイブ ファイルにはいくつかのディレクトリが含まれています。ディレクトリ left-right-control には、コントロールの例とそのためのパレット機能拡張ファイルがあります。ディレクトリ left-right-example には、このコントロールを使用するアプレットがあります。アプレット コードでの左右移動コントロールを表示するか、自身のアプレットでそれを使用するには、パレット機能拡張ファイル extensions.scurl をインストールする必要があります。拡張したサンプルを参照してください。
アーカイブからファイルを取得したら、ディレクトリ left-right-examplestart.curl を実行して、コントロールの動作を確認します。
このコントロールの構成を理解するには、IDE で left-right-control 内のプロジェクトを開きます。パッケージ COM.CURL.EXAMPLES.LEFT-RIGHT-CONTROL を右クリックして、IDE エディタで開きます。このパッケージには複合オブジェクトが含まれているため、パッケージ名をダブルクリックすると、既定では VLE エディタで開かれます。
複合オブジェクトを作成すると、レイアウトの作成の場合と同様にクラスが作成されます。この例では、クラス名は LeftRightControl です。この複合オブジェクトには、leftright という ListBox が含まれています。左矢印と右矢印のついた 2 つの CommandButton も含まれています。この例には、次のクラス メンバも含まれています。
左右移動コントロールの機能は、左右のコマンド ボタンのイベント ハンドラによります。右矢印ボタンのイベント ハンドラは、左 (未選択) のリスト ボックスで返される配列をループし、配列内の要素ごとに select-items を呼び出します。左矢印のコマンド ボタンは、右リスト ボックスと類似したタスクを実行します。
ディレクトリ left-right-example には、LeftRightControl を使用するアプレットがあります。ファイル vle-container.scurl には、LeftRightControl のインスタンスを含む VLE レイアウトがあります。VLE で LeftRightControl を表示するには、VLE の [表示]メニューから [パレット機能拡張]を選択し、最終結果をクリックして、機能拡張ファイル extension.scurl を選択する必要があります。
ファイル start.curl は、VLE レイアウト コンテナ MyContainer のインスタンスを作成し、それを使用して、文字列のリストを左 (未選択) のリスト ボックスにロードします。リストを右のリスト ボックスにロードするには、selected? = true を設定します。
ユーザーがコマンド ボタンをクリックすると、コントロールがポップアップ ダイアログに表示されます。ユーザーが [OK]をクリックしてポップアップを閉じると、この例では、ゲッター selected-itemunselected-items が使用され、選択結果が表示されます。