4D v14.3

コンポーネントとホストデータベースの相互作用

ホーム

 
4D v14.3
コンポーネントとホストデータベースの相互作用

コンポーネントとホストデータベースの相互作用  


 

ホストデータベースにコンポーネントがインストールされると、ホストデータベースのエキスプローラーのメソッドページ内、コンポーネントメソッドテーマにコンポーネント名が表示されます。共有プロジェクトメソッドが階層リストとして表示され、コンポーネントがインタプリターであれば、プリビューエリアに内容が表示されます。

共有メソッドの宣言についてはプロジェクト メソッドの共有を参照してください。

コンポーネントで定義される特定のタイプのオブジェクトは、自身の実行空間で展開されます。これによりホストデータベースや他のコンポーネントのオブジェクトとのコンフリクトの可能性を取り除いています。これらのオブジェクトは" 非共有または" 分割された" オブジェクトと呼びます。例えば変数は分割されたオブジェクトであり、あるコンポーネントにおける倍長整数タイプの<>Myvar 変数と、ホストデータベースや他のコンポーネントで使用されるテキストタイプの<>Myvar 変数とを同時に使用することができます。

他方のオブジェクトはホストデータベースとコンポーネントで同じ実行空間を共有します。これらのオブジェクトを使用する際にはより注意が必要となりますが、他方ホストデータベースとコンポーネント間で通信を行うことが可能です。これらのオブジェクトは" 共有" または" 分割されない" オブジェクトと呼ばれます。

例えばセットは分割されないオブジェクトであり、コンポーネントが作成した"mySet" を、ホストデータベースで実行される以下のコードで消去することが可能です:

 CLEAR SET("mySet")

以下は非共有(分割された) オブジェクトです:

  • スタイルシート
  • ヘルプTips
  • 選択リスト
  • ライブラリピクチャー
  • メニューエディターで作成されたメニューやメニューバー
  • " コンポーネントとホストデータベースで共有する" 属性を持たないプロジェクトメソッド
  • セマフォー
  • プロセス
  • 変数 (ローカル, プロセス, インタープロセス)
  • システム変数 (OK, Document, など)
  • テーブルフォーム
  • サブフォームとして公開属性を持たないプロジェクトフォーム
  • リソースと開いたリソースファイルの参照

以下は共有( 分割されない) オブジェクトです:

  • セット
  • 命名セレクション
  • 参照を使用した階層リストe (New listLoad listCopy listまたはBLOB to listコマンドを使用して作成)
  • Create menuコマンドから返されるID を使用したメニューやメニューバー
  • " コンポーネントとホストデータベースで共有する" 属性を持つプロジェクトメソッド
  • ホストデータベースにサブフォームとして公開属性を持つプロジェクトフォーム
  • XMLストラクチャー参照
  • ファイル参照 (リソースファイルを除く)
  • ポインター

注: もちろん、マトリクスデータベース内で見つかった利用できないオブジェクトは、ホストデータベース側で無視されます (利用可能又は利用不可能なオブジェクト参照)。

マトリクスデータベースのすべてのプロジェクトメソッドは 、コンポーネントに含まれます。つまり、マトリクスデータベースのプロジェクトメソッドは、すべて自身のコンポーネントから呼び出して実行することができます。

他方、デフォルトで、これらのプロジェクトメソッドはホストデータベースに表示されず、呼び出すこともできません。ホストデータベースでもプロジェクトメソッドを共有するためには、 マトリクスデータベース側でそのメソッドを共有されるよう設定しなければなりません。設定することで、それらのプロジェクトメソッドはホストデータベースのエクスプローラのCurrent form tableに表示され、呼び出すことができるようになります ( しかしホストデータベースのメソッドエディタで編集することはできません)。これらのメソッドはコンポーネントのエントリーポイントとなります。

セキュリティのため、デフォルトでコンポーネントはホストデータベースのプロジェクトメソッドを実行することはできません。特定のケースで、コンポーネントがホストデータベースのプロジェクトメソッドにアクセスできるようにする必要があるかもしれません。そうするためには、ホストデータベースのプロジェクトメソッドで、コンポーネントからのアクセスを可能にするよう明示的に指定しなければなりません。

これはメソッドプロパティダイアログボックスの、コンポーネントとホストデータベースで共有するで設定します:

メソッド属性の一括設定ダイアログを使用して、複数のメソッドに対し一気にこの属性を設定することもできます (属性一括設定参照)

このオプションの効果は、データベースがどのように使用されるかにより異なります: データベースがコンポーネントとして利用される場合、メソッドはホストデータベースからアクセス可能で、エクスプローラで見ることができます。データベースがホストデータベースの場合、メソッドはコンポーネントから利用可能です。

マトリクスデータベースのフォームを共有し、ホストデータベース中でサブフォームとして利用できます。

コンポーネント側 (マトリクスデータベース側) で、プロジェクトフォームのみを公開設定できます。

ホストデータベース中でサブフォームとしてコンポーネントフォームを選択するためには、フォームプロパティダイアログボックス内で明示的に公開フォームとして定義しなければなりません。:

注: このダイアログボックスはコンテキストメニューまたはエクスプローラーのフォームアクションメニュー内、フォームプロパティ...からアクセスできます (フォームプロパティ (エクスプローラー)参照)。

サブフォームとホストデータベースの親フォーム間の相互作用は開発者が管理します。このメカニズムについてはページサブフォームで説明しています。

ホストデータベース側ではコンポーネント由来のサブフォームをページモードで利用しなければなりません。フォームエディターで親フォームを開きサブフォームオブジェクトを選択したら、プロパティリストのサブフォームテーマから出力サブフォームの選択を解除します。

そしてテーブルメニューから<なし>を選択します。するとコンポーネントから公開されたフォームが詳細フォームメニューにリストされます。フォーム名の後ろには括弧内にコンポーネント名が現れます。このリストからサブフォームとして使用するコンポーネントフォームを選択します。

すると選択されたフォームの新しいインスタンスが即座にフォーム中に作成されます。

ローカル、プロセス、インタープロセス変数は、コンポーネントとホストデータベース間で共有されません。ホストデータベースからコンポーネントの変数、またはその逆の変数にアクセスする唯一の方法はポインターを使用することです。

配列を使用した例:

  • ホストデータベース側:
     ARRAY INTEGER(MyArray;10)
     AMethod(->MyArray)
  • コンポーネント側で AMethod プロジェクトメソッドは以下の通りです:
     APPEND TO ARRAY($1->;2)

変数を使用した例:

 C_TEXT(myvariable)
 component_method1(->myvariable)
 C_POINTER($p)
 $p:=component_method2(...)

ホストデータベースとコンポーネント間でポインターを使用して通信を行うには、以下の点を考慮する必要があります:

  • Get pointer をコンポーネントで使用した場合、このコマンドはホストデータベースの変数へのポインターを返しません。また逆にこのコマンドをホストデータベースで使用した場合も同様です。
  • 新しいコンポーネントアーキテクチャーでは、インタープリターデータベースで、インタープリター及びコンパイル済み両方のコンポーネントを利用できます。(コンパイル済みデータベースでは、コンパイルされたコンポーネントしか使用できません)。この場合、ポインターの利用は以下の原則を守らなければなりません: インタープリター版では、コンパイルモードにビルトインされたポインターを解釈できます。逆にコンパイルモードではインタープリターモードにビルトインされたポインターを解釈することはできません。
    以下の例でこの原則を説明します: 同じホストデータベースにインストールされた2 つのコンポーネントC ( コンパイル済) と I ( インタープリタ)があります:
    • コンポーネントC が定義する変数myCvar があるとき、コンポーネントI はポインター->myCvar を使用して変数の値にアクセスすることができます。
    • コンポーネントI が定義する変数myIvar があるとき、コンポーネントC はポインター->myIvar を使用しても変数の値にアクセスすることはできません。このシンタックスは実行時エラーを起こします。
  • RESOLVE POINTERを使用したポインターの比較はお勧めできません。 変数の分割の原則により、ホストデータベースとコンポーネント ( あるいは他のコンポーネント) で同じ名前を持つ変数が存在することができますが、根本的にそれらは異なる内容を持ちます。両コンテキストで、変数のタイプが違うことさえありえます。
    ポインターmyptr1 と myptr2 がそれぞれ変数を指すとき、以下の比較は正しくない結果となるかもしれません:
     RESOLVE POINTER(myptr1;vVarName1;vtablenum1;vfieldnum1)
     RESOLVE POINTER(myptr2;vVarName2;vtablenum2;vfieldnum2)
     If(vVarName1=vVarName2)
      //変数が異なっているにもかかわらず、このテストはTrue を返します

    このような比較を行うためには、ポインターを比較しなければなりません:
     If(myptr1=myptr2) //このテストはFalse を返します

コンポーネントでテーブルを使用することはできませんが、以下のコマンドをコンポーネントの中で呼び出すことはできます:

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 PARAMETERGet database parameterコマンドは例外となります: これらのコマンドのスコープはグローバルです。 これらのコマンドがコンポーネントから呼び出されると、結果はホストデータベースに適用されます。

さらにStructure fileGet 4D folderコマンドは、コンポーネントで使用できるように変更が行われています。

COMPONENT LISTコマンドを使用して、ホストデータベースにロードされたコンポーネントのリストを取得できます。

コンパイルされていないコンポーネントを使用すると、コードの内容がホストデータベースの標準デバッガーに表示されます。

デバッガーは分割されたオブジェクトの実行空間を考慮します。カスタムウォッチペインでホストデータベースの変数var1 の値を表示し、同じくvar1 変数を含むコンポーネントのコードを実行しても、表示される値は更新されません。カレントコンテキストの変数値を表示させるためには、変数のインスタンスを別にカスタムウォッチペインに登録しなければなりません。

 
プロパティ 

プロダクト: 4D
テーマ: 4Dコンポーネントの開発とインストール

 
ARTICLE USAGE

デザインリファレンス ( 4D v14 R2)
デザインリファレンス ( 4D v12.4)
デザインリファレンス ( 4D v13.4)
デザインリファレンス ( 4D v14 R3)
デザインリファレンス ( 4D v14.3)
デザインリファレンス ( 4D v14 R4)