4D v16.3型指定ガイド |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
型指定ガイド
型指定ガイド
この節では変数型に生じる矛盾の主な原因と問題を解決するための方法について説明します。 単純なデータ型の矛盾には以下のパターンがあります:
最も単純な型の矛盾は、1つの変数名が2つの異なるオブジェクトを示す場合です。例えば、以下のように書いたとします。 Variable:=5 また、同じアプリケーションのどこかで次のように書いたとします。 Variable:=True この記述は、データ型の矛盾を引き起こします。これはどちらか一方の変数名を変えることで解決できます。 例えば、アプリケーション内で以下のように書き、 Variable:=5 また、同じアプリケーション内で、次のように書いたとします。 C_BOOLEAN(Variable) コンパイラ指示子が最初に処理されるので、Variableはブール型に設定されますが、 Variable:=5 というステートメントがあるため、これを型の矛盾と見なします。変数名かコンパイラコマンドのどちらかを変更することで、問題は解決します。 1つの式の中で異なるデータ型の変数を使うと矛盾が生じます。コンパイラはそれを型の不一致として指摘します。簡単な例を紹介します: vBool:=True `コンパイラはvBoolをブール型と推測します。 関数の中には戻り値のデータ型が明確に決まっているものがあります。このような関数の戻り値を不注意に異なった型の変数に代入すると、データ型の矛盾が起ります。 例えば、インタプリタで以下のように書いた場合、 IdentNo:=Request("Identification Number") `IdentNo はテキスト型 この例では、3行目で型の矛盾が生じます。これを解決するためには変数の動作を制御する方法が考えられます。異なる名前の中間変数を作成する必要がある場合や、次の例のようにメソッドの構造を変更することで修正できる場合もあります。 IdentNo:=Num(Request("Identification Number")) `IdentNo は実数型 同じ変数に対して2つの異なるコンパイラ指示子を使用すると、型の再定義になります。例えば、1つのデータベースで次のように書いたとします。 C_BOOLEAN(Variable) この場合、コンパイラによって矛盾が検出され、エラーファイルに出力されます。通常、どちらか一方の変数名を変えることで問題は解決します。 ローカル変数におけるデータ型の矛盾は、プロセス変数やインタープロセス変数とほとんど同じものです。唯一の違いは、指定されたメソッドの中のみ型が一貫していればよいという点です。 $Temp:="Flowers" を記述し、さらに $Temp:=5 を記述することはできません。 しかし、 $Temp:="Flowers" をメソッド1で記述し、 $Temp:=5 をメソッド2で記述することは出来ます。これは、ロカール変数の有効範囲が同じメソッド内のみであり、データベース全体ではないからです。 型の矛盾に配列の要素数は無関係です。コンパイル前のデータベースと同様、配列も動的に管理されます。配列の要素数はメソッドを通して変更可能で、 配列用に最大値を定義する必要はありません。このため、要素数を0にすることも、追加や消去、もしくは内容の削除を行うことも可能です。 コンパイルを前提にデータベースを作る場合は、以下の原則に従ってください。
整数として定義された配列は、データベース全体を通して整数配列でなければなりません。データベース内で、ブール型などの要素を使用することはできません。 ARRAY INTEGER(MyArray;5) と書いた場合、MyArrayの型を決定できません。どちらか一方の配列名を変える必要があります。 コンパイル前のデータベースでは、配列の次元数を変更することができます。コンパイラでシンボルテーブルを作成す る際、1次元配列と2次元配列は別々に管理されます。このため、1次元配列を2次元配列として、もしくは2次元配列を1次元配列として再定義することはで きません。したがって、同じデータベースの中で以下のように定義することはできません。 ARRAY INTEGER(MyArray1;10) ただし、同じアプリケーションの中に次のステートメントを書くことはできます。 ARRAY INTEGER(MyArray1;10) データベース内で配列の次元数を変更することはできませんが、配列のサイズを変更できます。2次元配列の1つの配列のサイズを変更するには次のように書きます。 ARRAY BOOLEAN(MyArray;5) コマンドのCOPY ARRAY、LIST TO ARRAY、ARRAY TO LIST、SELECTION TO ARRAY、SELECTION RANGE TO ARRAY、ARRAY TO SELECTION、またはDISTINCT VALUESの使用により、データ型の要素、もしくは次元数が(意図的にもしくは無意識的に)変更されてしまう場合があります。その場合、前に述べた3つの状況のいずれかに該当します。 ローカル配列(これを生成したメソッドによってのみ見ることができる配列)が含まれるデータベースをコンパイルする場合、使用前に4Dで明示的にこの配列を定義する必要があります。明示的に配列を定義するとは、ARRAY REALコマンドやARRAY INTEGERコマンドなどを使い、配列を定義することをいいます。メソッドにより10要素のローカル整数配列を生成する場合、メソッドの中に次の行が必要です。 ARRAY INTEGER($MyArray;10) フォーム内で作成された変数型(例えば、ボタン、ドロップダウンリストボックスなど)は、すべてプロセスもしくはインタープロセス変数です。 インタプリタのデータベースでは、フォーム変数のデータ型は重要ではありませんが、コンパイルされたアプリケーションの場合は重要です。ただし、規則は非常に明確です。
次のフォーム変数は、デフォルトとして実数型として設定されます。
注:ルーラ、ダイアルおよびサーモメータのフォーム変数については、例えば環境設定のボタン型に倍長整数を選んだとしても、常に実数型に設定されます。 上記いずれかの変数に対して、データ型の矛盾が起こるとすれば、それは同一の変数名がデータベース内に存在する場合です。この場合は、いずれか1つの変数名を変更してください。 プラグインエリアは常に倍長整数型に設定されるので、型の不一致が生じることはありません。もしデータ型の矛盾が起こるとすれば、それは同一の変数名がデータベース内に存在する場合です。この場合は、いずれか1つの変数名を変更してください。 4D Write Proエリアは常にオブジェクト型変数になります。アプリケーションの他の部分で同じ変数名が使用されている場合を除き、型指定の矛盾は起こりません。 テキスト型に設定されるフォーム変数は以下のとおりです。
これらの変数は2つのカテゴリーに分類できます。 - 単純変数:入力可、入力不可の変数- 表示変数:ドロップダウンリスト、メニュー/ドロップダウンリスト、スクロールエリア、ポップアップメニュー、コンボボックス、タブコントロールおよびリストボックスのカラム
それぞれのリストボックスはフォーム内に複数の変数を追加します。これらの変数のデフォルトの型はリストボックスの型によります:
コンパイル時に矛盾が発生しないように、これらの変数と配列を正しく指定するように気をつけて下さい。 ポインタを使うと、4Dツールの強力で多彩な機能を活用することができます。 Variable:=5.3 この例では、ポインタで参照する変数の型は実数です。これにブール値を代入しているので、データ型の矛盾が起こります。 Variable:=5.3 ポ インタは、常に参照するオブジェクトとの関連で定義されています。このため、ポインタによるデータ型の矛盾をコンパイラが検知することはできません。矛盾 があっても、変数設定フェーズやコンパイルフェーズでは、エラーメッセージが出力されません。ただし、ポインタに関係する矛盾を見つける方法がまったくな いわけではありません。コンパイラの環境設定の範囲チェックオプションでポインタの使用状況を確認することができます(詳細はDesign Referenceマニュアルを参照してください)。 コンパイルの際、コンパイラはデータベースで使用されるプラグインコマンドのパラメータの数や型定義などについて解析します。メソッドからのプラグイン呼び出しが、プログラム記述の段階で一致していれば、矛盾が生じる危険はありません。 プラグインは、PlugIns フォルダに入れることでインストールします。フォルダは、4Dに許可されている次のいずれかの場所に置きます。 コンパイラは、これらのファイルを複製しませんが、これらを分析して、これらのルーチンの適切な定義を決定します。 特定のプラグイン(例えば4D Write)コマンドの中には、暗黙に4Dコマンドを呼び出すものがあります。例えば4D Writeの場合、WR ON EVENTコマンドのシンタックスは次のようになります。
コンパイラがこれらの引数の存在を認識し、これらを考慮するためには、引数をコンパイラコマンド、またはメソッド内での使用法によって型設定しなければなりません。メソッドで使用する場合には、型を明確に推測できるように使用する必要がありま 4Dを使い、4Dコンポーネントの作成および管理が可能です。(マトリクスデータベースと呼ばれる) 4Dコンポーネントは一連の4Dオブジェクトで、ストラクチャファイルにいくつかの機能がまとめられています。コンポーネントは他のデータベース (ホストデータベース) にインストールできます。 インタプリタモードで動作するホストデータベースは、インタプリタおよびコンパイル済みのコンポーネントを使用できます。一つのホストデータベース にインタプリタおよびコンパイル済みのコンポーネントを同時にインストールできます。他方、コンパイルモードのホストデータベースは、インタプリタモード のコンポーネントを使用できません。コンパイル済みのコンポーネントのみが使用できます。 インタプリタモードのコンポーネントを含むインタプリタのホストデータベースは、インタプリタモードのコンポーネントメソッドを呼ばない限り、コンパイルできます。もし呼び出している場合は、警告ダイアログが表示され、コンパイルに失敗します。 コンポーネントの共有メソッドがホストデータベースのプロジェクトメソッドと同じ名前の場合、名前の衝突が発生します。この場合、ホストデータベー スのコンテキストでコードが実行される際、ホストデータベースのメソッドが呼び出されます。これはコンポーネントのメソッドをカスタムメソッドでマスクす ることが可能であることを意味します (例えば異なる機能を実装するために)。コンポーネントのコンテキストでコードが実行されるときは、コンポーネントのメソッドが呼び出されます。ホスト データベースをコンパイルする際、このマスクは警告として記録されます。 二つのコンポーネントが同じ名前の共有メソッドを公開している場合は、ホストデータベースのコンパイルの際、エラーが生成されます。 コンポーネントに関する詳細は、Design Referenceマニュアルを参照してください。 ローカル変数の処理はこれまでに述べた規則に従います。他の変数と同様、メソッドの実行中にデータ型を変更することはできません。ここでは、型の矛盾を起こす可能性のある2つのケースについて検証します。
変数型を変更することはできませんが、ポインタを使用して異なるデータ型を参照することはできます。例えば、1次元配列 のメモリサイズを返す関数を考えてみてください。この場合、メモリサイズを数字で表せないテキスト配列とピクチャ配列を除き、実数の結果のみを返します(の節を参照してください)。
MemSize機能のインタプリタモードでのみ動作する例(Macintoshを使用する場合の例) $Size:=Size of array($1->) このメソッドでは、$0のデータ型が$1の配列によって異なるため、コンパイルできません。 MemSize機能のインタプリタモードおよびコンパイルモードで動作可能なバージョン(Macintoshを使用する場合の例) $Size:=Size of array($1->) 2つの関数は、以下の点が違っています。
コンパイラは、引数の間接参照の機能をサポートしています。インタプリタでは、引数のデータ型と数値を自由に設定でき ます。データ型の矛盾を起こさない限り(呼ばれた側でセットされていない引数を使用しないこと)、コンパイルモードでも同様に自由に設定することができま す。 以下は間接参照の例です。数値を合計し、引数として渡されたフォーマットに編集して返すような関数を考えてください。合計される元の数値は、メソッドが呼ばれるたびに変わります。このメソッドでは数値と編集フォーマットを引数としてメソッドに渡さなければなりません。 Result:=MySum("##0.00";125,2;33,5;24) この場合、数値を合計し、指定したフォーマットに編集された"182.70"が返されます。関数の引数は正しい順序で渡してください。最初にフォーマット、次に値です。 以下はMySum関数です。 $Sum:=0 この関数は次の方法で呼び出すことができます。 Result:=MySum("##0.00";125,2;33,5;24) 他のローカル変数と同様、ジェネリックパラメータはコンパイラに指示する必要はありません。ただし、曖昧になりそうな場合や最適化のために必要な場合は以下のシンタックスを使用することができます。 C_LONGINT(${4}) このコマンドは、4番目以降に間接参照されたすべての引数のデータ型が倍長整数であることを意味します。$1、$2、$3には、いかなるデータ型も使用できますが、$2を間接参照した場合には影響を受けます。このため、実数であってもデータ型は倍長整数と見なされます。 注:コンパイラはこのコマンドを変数設定フェーズで使います。定義に使用する数値は変数ではなく、定数でなくてはなりません。 4Dの変数および定数には、コンパイラによってデータ型および識別子が割り当てられているものがあります。このため、ユーザはこれらの変数名や定数 を、新しい変数やメソッド、関数、プラグインコマンドに使用することはできません。インタリタモードで行うのと同じ方法で、これらの値を検証し使用するこ とができます。
クイックレポートで計算用のカラムを作成する際、最初のカラムに変数C1を2番目にはC2を、そして3番目のカラムにはC3をというように4Dが自動的に変数を作成します。この処理はユーザには見えません。 4Dで定義されている定数は定数テーマリストを使用して見つけることができます。4Dの定数は、デザインモードのエクスプローラーにも表示されます。
参照
|
プロパティ
プロダクト: 4D
履歴
変更: 4D v15 R4 ARTICLE USAGE
ランゲージリファレンス ( 4D v16) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||