コンポーネント
4D のコンポーネントとは、他のデータベースにインストール可能な、1つ以上の機能を持つ 4D メソッドやフォームの一式です。 たとえば、メールの送受信を おこない、それらを 4D データベースに格納するための機能を持ったコンポーネントを作成できます。
4D コンポーネントの作成とインストールは直接 4D を使用しておこないます。 4D では、コンポーネントは プラグイン のように扱われ、以下の原則が適用されます:
- コンポーネントは、標準のアーキテクチャーまたはパッケージ (.4dbase 拡張子) の形をしたストラクチャーファイル ( コンパイルまたは非コンパイル) で構成されます。
- データベースにコンポーネントをインストールするには、データベースのストラクチャーファイルと同階層の "Components" フォルダーにコンポーネントをコピーします。
- コンポーネントは次の 4D の要素を呼び出すことができます: プロジェクトメソッド、プロジェクトフォーム、メニューバー、選択リスト、ライブラリピクチャーなど。 反面、コンポーネントが呼び出せないものは、データベースメソッドとトリガーです。
- コンポーネント内で標準のテーブルやデータファイルを使用することはできません。 しかし、外部データベースのメカニズムを使用すればテーブルやフィールドを作成し、そこにデータを格納したり読み出したりすることができます。 外部データベースは、メインの 4D データベースとは独立して存在し、SQLコマンドでアクセスします。
定義
4D のコンポーネント管理メカニズムでは、以下の用語とコンセプトを 使います:
- マトリクスデータベース: コンポーネント開発に使用する4D データベース。 マトリクスデータベースは特別な属性を持たない標準のデータベースです。 マトリクスデータベースはひとつのコンポーネントを構成します。 マトリクスデータベースは、コンポーネントを使用するデータベース (ホストデータベース) の Components フォルダーにコピーして使います。コンパイルされていてもいなくてもかまいません。
- ホストデータベース: コンポーネントがインストールされ、それを使用するデータベース。
- コンポーネント: ホストデータベースによって使用される目的で、同データベースの Components フォルダーにコピーされたマトリクスデータベース (コンパイル済みまたは非コンパイル)。
データベースは "マトリクス" にも "ホスト" にもなりえます。言い換えれば、マトリクスデータベース自体も1 つ以上のコンポーネントを使用できます。 しかしコンポーネントが "サブコンポーネント" を使用することはできません。
コンポーネントの保護: コンパイル
コンポーネントとしてインストールされたマトリクスデータベースのプロジェクトメソッドは、ホストデータベースからデフォルトでアクセス可能です。 特に:
- エクスプローラーのメソッドページに存在する共有のプロ ジェクトメソッドは、ホストデータベースのメソッドから呼び出し可能です。 エクスプローラーのプレビューエリアでそれらの内容を選択してコピーすることが可能です。 また、その内容はデバッガーで見ることもできます。 しかし、それらをメソッドエディター上で開いたり編集したりすることはできません。
- マトリクスデータベースの他のプロジェクトメソッドはエクスプローラーに現れません。しかし、ホストデータベースのデバッガーには内容が表示されます。
コンポーネントのプロジェクトメソッドを効果的に保護するには、マトリクスデータベースをコンパイルして、インタープリターコードを含まない .4dc ファイルとして提供します。 コンパイルされたマトリクスデータベースがコンポーネントとしてインストールされると:
- エクスプローラーのメソッドページに存在する共有のプロジェクトメソッドは、ホストデータベースのメソッドから呼び出し可能です。 しかし、その内容はプレビューエリアにもデバッガーにも表示されません。
- マトリクスデータベースの他のプロジェクトメソッドは一切表示されません。
プロジェクトメソッドの共有
マトリクスデータベースのすべてのプロジェクトメソッドは 、コンポーネントに含まれます。つまり、マトリクスデータベースをコンポーネント化しても、これらのプロジェクトメソッドは同コンポーネントにて呼び出して実行することができます。
他方、デフォルトでは、これらのプロジェクトメソッドはホストデータベースに表示されず、呼び出すこともできません。 プロジェクトメソッドをホストデータベースと共有するには、 マトリクスデータベース側でそのメソッドをそのように明示的に設定しなければなりません。 設定することで、それらのプロジェクトメソッドはホストデータベースにて呼び出せるようになります (しかしホストデータベースのメソッドエディターで編集することはできません)。 これらのメソッドはコンポーネントの エントリーポイント となります。
注: セキュリティのため、デフォルトでは、コンポーネントはホストデータベースのプロジェクトメソッドを実行することはできません。 特定の場合に、ホストデータベースのプロジェクトメソッドにコンポーネントがアクセスできるようにする必要があるかもしれません。 そうするには、ホストデータベースのプロジェクトメソッド側で、コンポーネントからのアクセスを可能にするよう明示的に指定しなければなりません。
変数の渡し方
ローカル、プロセス、インタープロセス変数は、コンポーネントとホストデータベース間で共有されません。 ホストデータベ ースからコンポーネントの変数、またはその逆にアクセスする唯一の方法はポインターを使用することです。
配列を使用した例:
// ホストデータベース側:
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 を返します