変数
4D のデータは、根本的に異なっている 2つの方法で保持されます。 フィールド はディスクに永続的にデータを保存するのに対し、変数 はメモリ上に一時的にデータを格納します。
データベースを作成する際には、フィールドに名前とデータタイプを指定します。 同様に、変数にも名前と データタイプ を指定します。
いったん作成された変数は、 アプリケーションで必要とされる場所に使用できます。 たとえば、テキスト変数を同じタイプのフィールドに格納するには次のように書きます:
[MyTable]MyField:=MyText
変数はランゲージの要素です。画面上に表示されることのない、裏方に徹した変数を作成・利用することができます。 もちろん、フォーム上に変数の値を表示することもできます (ポインターやBLOBを除く)。また、変数に値を入力したり、変数の値をレポートに印刷したりすることも可能です。 このとき、入力可や入力不可の変数オブジェクトはフィールドオブジェクトと同様に振舞い、提供されるコントロールも類似しています。 フォーム上のボタン、リストボックス、スクロールエリア、ピクチャーボタンなどのオブジェクトも変数を使って制御することができるほか、保存不要な計算結果を表示させることもできます。
変数の宣言
変数の作成は通常、宣言によっておこないます。 4D ランゲージでは、変数の宣言方法は2つあります:
var
キーワードを使った宣言 (推奨、とくにオブジェクトやクラスをコードで使用する場合、このシンタックスによりコードエディターの提案や自動補完機能が強化されます)- "コンパイラー" や "配列" テーマの 4D ランゲージコマンドを使った宣言 (旧シンタックス)。
変数は宣言されると、その型に対応するデフォルト値 に初期化されます。別の値が 代入 されない限り、セッション中はこの値が保持されます。 あるいは、変数を宣言するときに、データ型と値を1行で 初期化 することもできます。
この方法は推奨されませんが、ただ "使用する" ことによって変数を宣言することもできます。 正式にそれらを宣言することは必須ではありません。 たとえば、今日の日付に30日足した値を格納した変数を作成するには、次のように書くことができます:
MyDate:=Current date+30 // MyDateを作成します
// これは日付型の変数であると 4D は推測します
// 30日後の日付が代入されます
宣言前に変数が作成された場合、宣言による初期化はおこなわれません。
変数を宣言するには、次のシンタックスを用います:
var <varName>{; <varName2>;...}{ : <varType>}
例:
var $myText : Text // テキスト変数
var myDate1; myDate2 : Date // 複数の日付変数
var $myFile : 4D.File // File クラスオブジェクト変数
var $myVar // バリアント型変数
varName
に指定する変数名は 4Dの 識別子の命名規則 に従う必要があります。
このシンタックスは ローカル変数とプロセス変数 の宣言のみサポートしています。インタープロセス変数 および 配列 には使用できません。
varType
には次が指定できます:
varType
を省略すると、variant 型の変数が作成されます。
サポートされている varType
値の一覧です:
varType | 内容 |
---|---|
Text | テキスト値 |
Date | 日付値 |
Time | 時間値 |
Boolean | ブール値 |
Integer | 倍長整数値 |
Real | 実数値 |
Pointer | ポインター値 |
Picture | ピクチャー値 |
Blob | スカラーBLOB値 |
Collection | コレクション値 |
Variant | バリアント値 |
Object | デフォルトクラス (4D.Object) のオブジェクト |
4D.<className> | 4Dクラ ス名のオブジェクト |
cs.<className> | ユーザークラス名のオブジェクト |
cs.<namespace><className> | <namespace> コンポーネントクラス名のオブジェクト |
例題
- 基本のデータ型の、ローカル変数およびプロセス変数の宣言:
var $myText; myText; $vt : Text
var myVar //variant
var $o : Object
// 次と同義です:
var $o : 4D.Object
// C_OBJECT($o) とも同義です
- 4Dクラス型のオブジェクト変数の宣言:
var $myFolder : 4D.Folder
var $myFile : 4D.File
- ユーザークラス型のオブジェクト変数の宣言:
var $myClass : cs.MyClass
var $dataclass : cs.Employee
var $entity : cs.EmployeeEntity
宣言と同時に変数を初期化する
変数を宣言する際には、1つのステートメントでデータ型と初期値の両方を指定することができます。 次に例を示します:
var $a : Text:="hello"
var $b : Date:=!2023-09-12!
var $c : Object:=New object()
var $d : cs.Customer:=cs.Customer.new()
変数は、データ型を明示的に指定せずに宣言および初期化することもできます。その場合、変数の型は 4D によって推論されます。 次に例を示します:
var $text:="hello" // テキストと推論されます
var $number:=20 // 実数と推論されます
var $obj:={} // オブジェクトと推論されます
var $mycol:=[] // コレクションと推論されます
値の評価があいまいである場合、推論される型は インタープリターモードとコンパイル済みモード で異なる可能性があります。 この場合、コンパイラーによって警告が生成され、バリアント型が使用されます。 たとえば、次の $a の型はインタープリターモードでは正しくテキスト型と推論されますが、シンタックスチェックを実行すると警告が生成され、$a はコンパイル済みモードでバリアントとして型付けされます。
var $class:={test: "a"}
var $a:=$class.test
4D は最も一般的なタイプを推論しようとします。 たとえば、変数が整数値で初期化される場合、整数型ではなく実数型が使用されます (例: var $a:=10 //実数型が推論されます
)。 このような場合や、クラスのインスタンス化など複雑な型を持つ変数を初期化する場合は、明示的に型を指定することが推奨されます。
ほとんどの場合、変数の型は自動的に決まります。 例外は、プロセス変数やインタープロセス変数に値を代入した場合で、その場合は警告メッセージが 表示されます。
複数同時の代入はサポートされていません:
var $a; $b : Integer:=15 //エラー
変数への代入
変数を対象に、データを格納したり、格納したデータを別の対象にコピーしたりすることができます。 変数にデータを格納することを、変数にデータを代入する と言い、代入演算子 (:=) を使っておこないます。 代入演算子はフィールドに対してデータを代入する場合にも使います。
代入演算子は、変数を作成し、変数にデータを代入するために使用します。 作成する変数名を代入演算子の左側に書きます。 例:
MyNumber:=3
は変数 MyNumber を作成し、数値 3を代入します。 MyNumber が既 に存在していれば、そこに数値 3が代入されます。
データ型の宣言 をせずに変数を作成することは通常推奨されません。
もちろん、変数からデータを取り出すことができなければ、便利とはいえません。 再度代入演算子を使用します。 [Products]Size というフィールドに MyNumber 変数の値を代入するには、代入演算子の右側に MyNumber を書きます:
[Products]Size:=MyNumber
これで、[Products]Size の値は 3 になります。 この例はとても単純ですが、ある場所から別の場所へランゲージによってデータを転送させる基本的な手順を表しています。
配列要素にデータを代入するには中カッコ ({...}) を使用します:
atNames{1}:="Richard"
ローカル、プロセス、およびインタープロセス変数
ローカル、プロセス、および インタープロセス という、3種類の変数の変数を作成することができます。 これらの変数の違いは使用できるスコープにあります。また、それらを使用することのできるオブジェクトも異なります。