4D v16.3

変数

ホーム

 
4D v16.3
変数

変数  


 

 

4Dのデータは、基本的に全く異なる2つの方法で保持されます。フィールドはディスクに永続的にデータを保存するのに対し、変数はメモリ上に一時的にデータを格納します。

データベースを作成する際、フィールドに名前とデータタイプを指定するのと同様に、変数にも名前とデータタイプを指定します。

以下の変数タイプは、各データタイプと一致します:

  • 文字列(*)またはテキスト: 2GBまでの文字列
  • 整数: 整数値 -32768 ~ 32767
  • 倍長整数: 整数値 -2^31 ~ (2^31)-1
  • 実数: ±1.7e±308 (有効数字13桁) までの数値
  • 日付: 1/1/100 ~ 12/31/32767
  • 時間: 00:00:00 ~ 596000:00:00 (24:00までの秒数)
  • ブール: True または False
  • ピクチャ: 任意のWindowsまたはMacintosh ピクチャ
  • オブジェクト:JSON型フォーマットで構築された"プロパティ/値"のセット
  • コレクション: 異なる型の値の並び替えされた一覧
  • BLOB (Binary Large OBject): サイズが2GBまでのバイト列
  • ポインタ: ファイル、フィールド、変数、配列、配列要素のポインタ

(*) Unicodeモードでは、文字列とテキストタイプの変数は同じものです。非Unicodeモード (互換モード) では、文字列は255文字までの固定長文字列です。

(ポインタやBLOBを除く) 変数を画面上に表示したり、その中に入力したり、レポートに印刷したりできます。このとき、入力可や入力不可のエリア変数はフィールドと同様に振舞います。そしてそれらを作成する際には、フィールドと同じ、組み込みのコントロールを使用できます:

  • 表示フォーマット
  • 入力フィルタやデフォルト値などのデータ検証
  • 文字フィルタ
  • 選択リスト (階層リスト)
  • 入力可または入力不可値

また、変数は以下のようなこともできます:

  • ボタン (ボタン、チェックボックス、ラジオボタン、3Dボタン等) のコントロール
  • スライダ (メータ、ルーラ、ダイアル) のコントロール
  • リストボックス、スクロールエリア、ポップアップメニュー、ドロップダウンリストのコントロール
  • 階層リストや階層ポップアップメニューのコントロール
  • ボタングリッド、タブコントロール、ピクチャボタンなどのコントロール
  • 保存する必要のない計算結果の表示

変数は、使用することで作成できます。フィールドで行うように、正式にそれらを定義することは必須ではありません。例えば、今日の日付に30日を加えた日付を保持する変数が必要な場合、以下のように書くことができます:
 

 MyDate:=Current date+30

4DはMyDateを作成し、必要な日付を保持します。コード行は“MyDateに、今日の日付に30日加えたものが代入される”と読むことができます。この後、データベースの必要な個所でMyDateを使用できます。例えば、日付変数を同じタイプのフィールドに格納する場合:

 [MyTable]MyField:=MyDate

しかしながら、通常、変数を明示的に特定のタイプに定義することをお勧めします。コンパイルしようとするデータベースで、変数のタイプを定義する方法については、の節を参照してください。

変数にデータを格納、または変数からデータをコピーすることができます。変数にデータを置くことを、変数にデータを代入すると呼び、それを行うには代入演算子 (:=) を使用します。代入演算子はフィールドに対してデータを代入する場合にも使用します。

代入演算子は、変数を作成し、変数にデータを代入するために使用します。作成する変数名を代入演算子の左側に書きます。例えば:

 MyNumber:=3

は変数MyNumberを作成し、数値 3を置いています。MyNumberが既に存在すれば、単に数値 3が置かれます。

もちろん、変数からデータを取り出すことができなければ、便利とは言えません。再度代入演算子を使用します。[Products]SizeというフィールドにMyNumber変数の値を代入するには、代入演算子の右側にMyNumberを記述します:

 [Products]Size:=MyNumber

この[Products]Size の値は3になります。この例はとても単純ですが、データをある場所から別の場所へ転送する基本的な方法です。

重要: 代入演算子 (:=) と比較演算子 (=) とを混同しないように注意してください。代入演算子と比較演算子はまったく異なる演算子です。比較演算子に関する詳細は、の節を参照してください。

開発者はローカルプロセス、およびインタープロセス、3種類の変数の変数を作成できます。この3種類の変数の違いは使用できるスコープにあります。またそれらを使用することのできるオブジェクトも異なります。

ローカル変数はその名のとおりメソッド内でローカルであり、変数が作成されたメソッド内でのみアクセスすることができ、その他のメソッドからはアク セスできません。メソッド内でローカルであるというのは、「そのスコープがローカルである」という意味です。ローカル変数は、その使用範囲をメソッド内に 限定する場合に用います。

ローカル変数は、以下のような目的のために使用されます:

  • 他の変数名との重複を避ける。
  • データを一時的に使用する。
  • プロセス変数の数を減らす。

ローカル変数の名前は必ずドル記号 ($) で始め、この記号を除く31文字までの文字を指定できます。これより長い名前を指定すると、4Dは余分の32文字以降を切り捨てます。

多くのメソッドや変数を持つデータベースで作業する場合、現在作業しているメソッド内でのみ使用可能な変数を必要とする場合がよくあります。この場合、同じ変数名が他で使用していないかどうかを気にすることなくローカル変数を作成することができます。

しばしばデータベースで、ユーザからの小さなデータを必要とする場合があります。Request関数は、ユーザから1つのデータを取得します。Request関数はデータの入力を求めるダイアログボックスを表示し、ユーザがデータを入力した時点で、その入力情報を返します。通常このデータはメソッド内で長期間必要となることはありません。これは、ローカル変数を使用する良い例です。

 $vsID:=Request("Please enter your ID:")
 If(OK=1)
    QUERY([People];[People]ID =$vsID)
 End if
このメソッドは、ユーザに従業員IDを入力するように要求します。ローカル変数$vsIDにレスポンスが代入され、ユーザが入力したIDに基づき検索が行われます。このメソッドが終了した時点で、$vsIDローカル変数はメモリから消去されます。この変数は1回のみ、またこのメソッド内でのみしか必要としないためローカル変数で十分です。

プロセス変数は、プロセス内でだけ使用可能です。この変数はプロセスメソッドと、そのプロセス内で呼び出された他のメソッドで使用することができます。

プロセス変数には名前の前に付ける接頭辞がありません。プロセス変数名の長さは、最大31文字まで指定できます。

インタプリタモードでは、変数は動的にメモリ上に作成、消去されます。これに対してコンパイルモードでは、作成したすべてのプロセス (ユーザプロセス) で同じプロセス変数定義が共有されますが、変数のインスタンスはプロセス毎に異なるものとなります。例えばプロセス変数myVarは、プロセスP_1とプロセスP_2の両方に存在しますが、それぞれ異なるインスタンスとなります。

バージョン6より、GET PROCESS VARIABLESET PROCESS VARIABLEを使用して、あるプロセスから他のプロセスのプロセス変数の値を取り出したり、設定したりできるようになりました。これらのコマンドの利用は、以下のような状況に限定することが、良いプログラミングの作法です:

  • 特定の個所あるいはコードにおけるプロセス間通信
  • プロセス間のドラッグ&ドロップ処理
  • クライアント/サーバにおいて、クライアントマシンプロセスとサバマシン上のストアドプロシージャプロセス間通信

詳細はの章を参照してください。

インタープロセス変数はデータベース全体で使用することができ、すべてのプロセスで共有されます。主としてプロセスの間で情報を共有するために使われます。

インタープロセス変数の名前は、必ずインタープロセス記号(<>)で始めます。記号の後に31バイトまでの名前を指定できます。

: このシンタックスはWindowsとMacintosh両方で使用できます。

クライアント/サーバでは、各マシン(クライアントマシンとサーバマシン)で同じインタープロセス変数定義を共有しますが、マシンごとに各変数のインスタンスが存在します。

フォームエディタで、それぞれのアクティブオブジェクト(ボタン、ラジオボタン、チェックボックス、スクロールエリア、サーモメータ等)はオブジェクト名によって識別され、自動的に変数(あるいは式)と関連付けられます。デフォルトでは、変数はオブジェクトが作成されたときには定義されていません。フォームがロードされたときに動的に作成されます(以下参照)。プロパティリスト内に変数名を入力することで作成することも可能です。例えば、MyButtonという名前のボタンを作成した場合、MyButtonという名前の変数に割り当てることができます(オブジェクトと同じ名前をつけることもできます)。

フォームオブジェクト変数を使用して、オブジェクトの制御やモニタを実行できます。例えば、このボタンがクリックされると、その変数に1が設定され ます。それ以外の場合はすべて0になります。サーモメータやダイアルに関連付けられた変数では、現在の値を読んだり、あるいは値を変更することができま す。例えばサーモメータをドラッグすると、変数の値は新しい設定値に変更されます。同様にメソッドで変数の値を変更すると、サーモメータは新しい値を表現 するために再描画されます。

フォームと変数のより詳しい情報は、4D Design Referenceマニュアルやフォームイベントの節を参照してください。

(ボタンや入力可能変数、チェックボックス等の) フォームオブジェクトに割り当てる変数を、必要に応じて4Dに動的に作成させることができます。これを行うには、プロパティリストの"変数名"フィールドを空にします:

変数名が与えられていないと、フォームがロードされたとき、4Dはインタープリターのプロセス変数の空間内でユニークな名前を計算し、その名前でオブジェクト用に新しい変数を作成します (このメカニズムはコンパイルモードでも使用することができます)。この一時的な変数はフォームが閉じられるときに破棄されます。
この方式をコンパイルモードで動作させるために、ダイナミック変数の型を明示的に指定しなければなりません。これを行うには2つの方法があります:

  • プロパティリストの"変数タイプ"を使用して型を指定する。
    : 変数に名前が与えられている場合、"変数タイプ"は実際には変数の型を指定しません。プロパティリストのオプション表示を更新するだけです (ピクチャー変数を除く)。名前付き変数の型を指定するには、 コンパイラテーマのコマンドを使用しなければなりません。
  • フォームがロードされるときにVARIABLE TO VARIABLE等を使用する特別な初期化コードを実行する。
     If(Form event=On Load)
        C_TEXT($init)
        $Ptr_object:=OBJECT Get pointer(Object named;"comments")
        $init:=""
        VARIABLE TO VARIABLE(Current process;$Ptr_object->;$init)
     End if
: ダイナミック変数を指定し (名前なし変数を作成し)、"変数タイプ"でなしを選択、そして初期化コードを実行しない場合、コンパイラが型指定エラーを返します。

4Dコード中で、ダイナミック変数にはOBJECT Get pointerコマンドで取得できるポインターを通してアクセスできます。例えば:

  // "tstart"オブジェクトの変数に時刻12:00:00を代入する
 $p :=OBJECT Get pointer(Object named;"tstart")
 $p->:=?12:00:00?

このメカニズムを使用する利点は2つあります:

  • ひとつのホストフォーム上で複数個配置することの可能なサブフォームタイプのコンポーネント開発を可能にします。例えば開始日と終了日を表す日付ピッカーオブジェクトをホストフォーム上に配置するケースを考えてみましょう。このサブフォームでは日付を選択するためのオブジェクトが使用されます。このオブジェクトは開始日と終了日されぞれで異なる日付を選択できなければなりません。4Dにダイナミック変数を生成させることでユニークな変数を得ることができ、この問題を解決できます。
  • またメモリの利用を減少させることができます。フォームオブジェクトではプロセス変数とインタープロセス変数しか使用できません。しかしコンパイルモードでは、各プロセス変数のインスタンスが (サーバープロセスを含め) すべてのプロセスに対して作成されます。このインスタンスはセッション中にフォームが使用されない場合でもメモリを消費します。フォームのロード時、4Dにダイナミック変数を作成させることで、メモリを節約できます。

注: 変数名が指定されていない場合、フォームエディター上にはクォーテーションマークだ囲まれたオブジェクト名が表示されます (デフォルトでオブジェクトに変数名が表示される場合)。

4Dは、システム変数と呼ばれる多くの変数を保守します。これらの変数を使用して、多くの処理をモニタすることができます。すべてのシステム変数がプロセス変数であり、プロセスの中でのみアクセスできます。

最も重要なシステム変数はOKシステム変数です。名前が示すように、特定のプロセスで、何かの事象がOKかどうかを通知します。例え ば、レコードは保存されたか、重要な処理が終了したか、ユーザがOKボタンをクリックしたか等を判断できます。システム変数OKは、処理が正常に完了した 場合1が設定され、そうでない場合0が設定されます。

システム変数に関する詳細は、の節を参照してください。



参照 

データタイプ
ポインタ
メソッド
制御フロー
定数
演算子
識別子
配列

 
プロパティ 

プロダクト: 4D
テーマ: プログラミング言語の構成要素

 
履歴 

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v16)
ランゲージリファレンス ( 4D v16.1)
ランゲージリファレンス ( 4D v16.2)
ランゲージリファレンス ( 4D v16.3)