パッケージには、クラス、ファンクション、オブジェクトを含めることができます。
パッケージはpackageステートメントを使用して定義します。
package パッケージ名 { : }
パッケージ例 (MyPackage.crs)
package MyPackage { /* クラス */ class MyButton extends Button { Title = "MyButton"; Function OnTouch(e) { MessageBox("Hello"); } } /* ファンクション */ Function MyFunction(text) { return MessageBox(text); } /* オブジェクト */ String MyData = "sample"; }
現在のCRSはパッケージの概念は限定的で、Javaなどのほかの言語のようにパッケージ名がクラスの識別に影響することはありません。例えば多くの言語でパッケージ名でクラス名を修飾することができますが、CRSではそうした修飾を指定することはできません。従って、クラス名はBiz/Browserにロードされる全てのCRSで一意に定義する必要があります。
上記例のMyButtonを利用する場合、次のように記述します。
MyButton btn { X = 10; Y = 10; Width = 100; Height = 30; }
パッケージに含めたファンクションは、パッケージ名で修飾して任意のスコープから呼び出すことができます。上記例のMyFunctionを利用する場合、次のように記述します。
MyPackage.MyFunction("sample");
パッケージに含めたオブジェクトも同様に、パッケージ名で修飾して任意のスコープから参照することができます。上記例のMyDataを利用する場合、次のように記述します。
MessageBox(MyPackage.MyData);
パッケージ内のファンクションやデータは、ver3.0のRecordを使ったグローバル名前空間へのimportと同じように利用することができます。
通常は、パッケージはFormなどを定義したアプリケーション画面とは別のCRSファイルとして作成します。アプリケーション固有のクラス、ファンクションや定数などをパッケージに定義してimportすることにより、他のCRSプログラムからライブラリのように利用することができます。以下は、MyPackageを利用する画面の例です。
利用例 (Form1.crs)
import "MyPackage.crs"; Form Form1 { Width = 800; Height = 600; MyButton btn { X = 10; Y = 10; Width = 120; Height = 30; } }
このように、パッケージを定義したCRSファイルをimportすることで効率よく開発を行うことができます。importでパッケージをロードする場合、必ずファイル名はパッケージ名に拡張子".crs"を付加した名前にする必要があることに注意してください。
importするパッケージのファイル名は、パッケージ名に".crs"を付加しなければなりません。ファイル名とパッケージ名が不一致の場合、importはエラーとなりますのでご注意ください。
importステートメントの動作は、指定したURLのファイル名に一致するパッケージが既にメモリ上にロードされている場合、パッケージを再ロードせずに即復帰します。この動作はGETメソッドとは異なり、キャッシュ、通信、コンパイルおよびスクリプト実行の動作を伴わないため、2回目以降のimportは非常に高速に完了します。
この特性により、複数の画面で同じパッケージをそれぞれimportしても常に最初の1回目だけが実行されるため、画面切り替え時にも、ほとんどオーバーヘッドを伴わずに共通処理を実装することが可能です。
パッケージは、一度Biz/Browserにロードされると//.login()メソッドや//.logout()メソッドによりセッションがリセットされるまでメモリ上に常駐します。パッケージ内にあまり大きなデータや非常に多くのファンクションを定義すると多くのメモリを消費することに注意してください。
パッケージ内にあまり大きなデータや非常に多くのファンクションを定義すると動作速度が低下することがあるので注意してください。多くのデータを定義する必要がある場合、パッケージを細分化するか、パッケージ内にRecordオブジェクトなどを利用して階層化して定義したほうが動作速度に対する影響は少なくなります。
package MyPackage { Record dataRec1 { String Data1 = "sample1"; String Data2 = "sample2"; : } Record dataRec2 { String Data3 = "sample3"; String Data4 = "sample4"; : } :
アプリケーションの先頭で、アプリケーションに用意されている全てのパッケージをimportする必要はありません。いつでもimportは可能ですのでCRSファイルごとに本当に必要なパッケージをimportするほうが効率よく動作します。一度に全てのパッケージをimportした方がプログラムの開発は容易ですが、実際には使われないパッケージもロードされてしまうため、起動に時間がかかったりアプリケーションの動作速度が低下する弊害があることに注意してください。