ホストデータベースにコンポーネントがインストールされると、ホストデータベースのエキスプローラーのメソッドページ内、コンポーネントメソッドテーマにコンポーネント名が表示されます。共有プロジェクトメソッドが階層リストとして表示され、コンポーネントがインタプリターであれば、プリビューエリアに内容が表示されます。
共有メソッドの宣言についてはプロジェクト メソッドの共有 を参照してください。
コンポーネントで定義される特定のタイプのオブジェクトは、自身の実行空間で展開されます。これによりホストデータベースや他のコンポーネントのオブジェクトとのコンフリクトの可能性を取り除いています。これらのオブジェクトは" 非共有または" 分割された" オブジェクトと呼びます。例えば変数は分割されたオブジェクトであり、あるコンポーネントにおける倍長整数タイプの<>Myvar 変数と、ホストデータベースや他のコンポーネントで使用されるテキストタイプの<>Myvar 変数とを同時に使用することができます。
他方のオブジェクトはホストデータベースとコンポーネントで同じ実行空間を共有します。これらのオブジェクトを使用する際にはより注意が必要となりますが、他方ホストデータベースとコンポーネント間で通信を行うことが可能です。これらのオブジェクトは" 共有" または" 分割されない" オブジェクトと呼ばれます。
例えばセットは分割されないオブジェクトであり、コンポーネントが作成した"mySet" を、ホストデータベースで実行される以下のコードで消去することが可能です:
CLEAR SET ("mySet")
以下は非共有(分割された) オブジェクトです:
スタイルシート ヘルプTips 選択リスト ライブラリピクチャー メニューエディターで作成されたメニューやメニューバー " コンポーネントとホストデータベースで共有する" 属性を持たないプロジェクトメソッド セマフォー プロセス 変数 (ローカル, プロセス, インタープロセス) システム変数 (OK, Document, など) テーブルフォーム サブフォームとして公開属性を持たないプロジェクトフォーム リソースと開いたリソースファイルの参照
以下は共有( 分割されない) オブジェクトです:
注: もちろん、マトリクスデータベース内で見つかった利用できないオブジェクトは、ホストデータベース側で無視されます (利用可能又は利用不可能なオブジェクト 参照)。
マトリクスデータベースのすべてのプロジェクトメソッドは 、コンポーネントに含まれます。つまり、マトリクスデータベースのプロジェクトメソッドは、すべて自身のコンポーネントから呼び出して実行することができます。
他方、デフォルトで、これらのプロジェクトメソッドはホストデータベースに表示されず、呼び出すこともできません。ホストデータベースでもプロジェクトメソッドを共有するためには、 マトリクスデータベース側でそのメソッドを共有されるよう設定しなければなりません。設定することで、それらのプロジェクトメソッドはホストデータベースのエクスプローラのメソッドページ に表示され、呼び出すことができるようになります ( しかしホストデータベースのメソッドエディタで編集することはできません)。これらのメソッドはコンポーネントのエントリーポイントとなります。
セキュリティのため、デフォルトでコンポーネントはホストデータベースのプロジェクトメソッドを実行することはできません。特定のケースで、コンポーネントがホストデータベースのプロジェクトメソッドにアクセスできるようにする必要があるかもしれません。そうするためには、ホストデータベースのプロジェクトメソッドで、コンポーネントからのアクセスを可能にするよう明示的に指定しなければなりません。
これはメソッドプロパティダイアログボックスの、コンポーネントとホストデータベースで共有する で設定します:
メソッド属性の一括設定ダイアログを使用して、複数のメソッドに対し一気にこの属性を設定することもできます (属性一括設定 参照)
このオプションの効果は、データベースがどのように使用されるかにより異なります: データベースがコンポーネントとして利用される場合、メソッドはホストデータベースからアクセス可能で、エクスプローラで見ることができます。データベースがホストデータベースの場合、メソッドはコンポーネントから利用可能です。
ホストのメソッドをコンポーネント側から実行するには、EXECUTE FORMULA または EXECUTE METHOD コマンドを使用します。使用例:
component_method ("host_method_name")
C_TEXT ($1 )
EXECUTE METHOD ($1 )
マトリクスデータベースのフォームを共有し、ホストデータベース中でサブフォームとして利用できます。
コンポーネント側 (マトリクスデータベース側) で、プロジェクトフォームのみを公開設定できます。
ホストデータベース中でサブフォームとしてコンポーネントフォームを選択するためには、フォームプロパティダイアログボックス内で明示的に公開フォームとして定義しなければなりません。:
注: このダイアログボックスはコンテキストメニューまたはエクスプローラーのフォームアクションメニュー内、フォームプロパティ... からアクセスできます (フォームプロパティ (エクスプローラー) 参照)。
サブフォームとホストデータベースの親フォーム間の相互作用は開発者が管理します。このメカニズムについてはページサブフォーム で説明しています。
ホストデータベース側ではコンポーネント由来のサブフォームをページモードで利用しなければなりません。フォームエディターで親フォームを開きサブフォームオブジェクトを選択したら、プロパティリストのサブフォームテーマから出力サブフォーム の選択を解除します。
そしてテーブルメニューから<なし>を選択します。するとコンポーネントから公開されたフォームが詳細フォームメニューにリストされます。フォーム名の後ろには括弧内にコンポーネント名が現れます。このリストからサブフォームとして使用するコンポーネントフォームを選択します。
すると選択されたフォームの新しいインスタンスが即座にフォーム中に作成されます。
注: コンポーネントのコンテキストにおいては、参照されるプロジェクトフォームは全てコンポーネント内に存在している必要があります。例えば、コンポーネント内において、DIALOG または Open form window コマンドを使用してホスト側のプロジェクトフォームを参照しようとした場合にはエラーが生成されます。その一方で、テーブルフォームへの参照はすべてホスト側のテーブルへの参照だと4D はみなします(コンポーネントはテーブルを持つことができないからです)。
ローカル、プロセス、インタープロセス変数は、コンポーネントとホストデータベース間で共有されません。ホストデータベースからコンポーネントの変数、またはその逆の変数を編集する唯一の方法はポインターを使用することです。
配列を使用した例:
変数を使用した例:
C_TEXT (myvariable )
component_method1 (->myvariable)
C_POINTER ($p )
$p :=component_method2 (...)
ポインターを使用しない場合でも、コンポーネント側からホストデータベースの(変数そのものではなく)変数の値にアクセスすること自体は可能ですしその逆も可能です:
C_TEXT ($input_t )
$input_t :="DoSomething"
component_method ($input_t )
ホストデータベースとコンポーネント間でポインターを使用して通信を行うには、以下の点を考慮する必要があります:
Get pointer をコンポーネントで使用した場合、このコマンドはホストデータベースの変数へのポインターを返しません。また逆にこのコマンドをホストデータベースで使用した場合も同様です。 新しいコンポーネントアーキテクチャーでは、インタープリターデータベースで、インタープリター及びコンパイル済み両方のコンポーネントを利用できます。(コンパイル済みデータベースでは、コンパイルされたコンポーネントしか使用できません)。この場合、ポインターの利用は以下の原則を守らなければなりません: インタープリター版では、コンパイルモードにビルトインされたポインターを解釈できます。逆にコンパイルモードではインタープリターモードにビルトインされたポインターを解釈することはできません。 以下の例でこの原則を説明します: 同じホストデータベースにインストールされた2 つのコンポーネントC ( コンパイル済) と I ( インタープリタ)があります: コンポーネントC が定義する変数myCvar があるとき、コンポーネントI はポインター->myCvar を使用して変数の値にアクセスすることができます。 コンポーネントI が定義する変数myIvar があるとき、コンポーネントC はポインター->myIvar を使用しても変数の値にアクセスすることはできません。このシンタックスは実行時エラーを起こします。
コンポーネントでテーブルを使用することはできませんが、以下のコマンドをコンポーネントの中で呼び出すことはできます:
DEFAULT TABLE NO DEFAULT TABLE Current default table
実際、コンポーネントがホストデータベースのテーブルを使用する必要がある場合に、これらのコマンドはとても便利です。この方法で、ホストデータベースとコンポーネントはポインターを使用して通信を行うことができます。例えば、以下はコンポーネントで実行可能なメソッドです:
C_LONGINT ($1 )
$tablepointer :=Table ($1 )
DEFAULT TABLE ($tablepointer ->)
CREATE RECORD
$fieldpointer :=Field ($1 ;1)
$fieldpointer ->:="value"
SAVE RECORD
使用できないコマンド を除き、コンポーネントではすべての4D ランゲージコマンドが使用できます。
コマンドがコンポーネントから呼ばれると、コマンドはコンポーネントのコンテキストで実行されます。ただし EXECUTE METHOD コマンドは除きます。このコマンドはコマンドで指定されたメソッドのコンテキストを使用します。またユーザ&グループ テーマの読み出しコマンドをコンポーネントで使用することができますが、ホストデータベースのユーザ&グループ情報を読み出すことに注意してください ( コンポーネントに固有のユーザ&グループはありません)。
SET DATABASE PARAMETER とGet database parameter コマンドは例外となります: これらのコマンドのスコープはグローバルです。 これらのコマンドがコンポーネントから呼び出されると、結果はホストデータベースに適用されます。
さらにStructure file とGet 4D folder コマンドは、コンポーネントで使用できるように変更が行われています。
COMPONENT LIST コマンドを使用して、ホストデータベースにロードされたコンポーネントのリストを取得できます。
コンパイルされていないコンポーネントを使用すると、コードの内容がホストデータベースの標準デバッガーに表示されます。
デバッガーは分割されたオブジェクトの実行空間を考慮します。カスタムウォッチペインでホストデータベースの変数var1 の値を表示し、同じくvar1 変数を含むコンポーネントのコードを実行しても、表示される値は更新されません。カレントコンテキストの変数値を表示させるためには、変数のインスタンスを別にカスタムウォッチペインに登録しなければなりません。