4D v16.3ポインタ |
||||||||||||||||||||||||||||||||
|
4D v16.3
ポインタ
ポインタ
ポインタは、(プログラミングにおける)データを参照するための高度な方法です。 プログラミング言語を使用する場合、名前を用いてテーブル、フィールド、変数、配列等をアクセスします。通常は、名前によるデータの参照が最も簡単な方法ですが、名前を使用しないでデータを参照する、またはアクセスした方が便利な場合もあります。この場合、ポインタを使用すると実現できます。 ポインタの背景にある概念は、日常生活でもよく用いられています。対象物を正確に知らないで何かを示すことがあります。例えば、友人に対して“登録番号123ABDの車に乗ろう”と言わないで“君の車に乗ろう”という場合があります。つまり、“登録番号123ABDの車”を“君の車”で示したわけです。この場合、“登録番号123ABDの車”はオブジェクトの名前で、“君の車”はオブジェクトを参照するためのポインタと考えることができます。 あるものの対象物を明示しないで参照することができると非常に便利です。例えば友人が新しい車に買い替えても、同じく“君の車”と言うことができます。ポインタも同じように機能します。例えば、ある場合は数値フィールド“Age”を参照したポインタで、別の場合には数値変数“Old Age”を参照することもできます。この場合のポインタは、計算に使用する数値データを参照しています。 テーブル、フィールド、変数、配列、配列要素を参照するためにポインタを使用することができます。以下の表に、各タイプの例を示します。
例題を用いてポインタの使用方法について説明します。以下の例は、ポインタを通して変数にアクセスする方法を示しています。まず、変数の作成から始めます。 MyVar:="Hello" “MyVar”は、文字列“Hello”を含む変数です。“MyVar”に対するポインタを作成します。 MyPointer:=->MyVar ポインタ記号(->)は、“・・・に対するポインタを求める”ことを意味します。ここでは、“MyVar”を参照するポインタを呼び出します。このポインタは、代入演算子(:=)で“MyPointer”に対して割り当てられます。 “MyPointer”は、“MyVar”に対するポインタを含む変数です。“MyPointer”は、“Hello”という“MyVar”の値を含みませんが、“MyVar”に含まれる値を指すことはできます。以下の式は“MyVar”の値を返します。 MyPointer-> 前述の式は、“Hello”という文字列を返します。ポインタ記号(->)をポインタの後につけると、そのポインタの指すオブジェクトの値を示します。 ポインタ記号(->)を後につけたポインタを使用してオブジェクトを参照することの意味を理解することが重要です。つまり、変数“MyVar”を使用することと、式“MyPointer->”を使用することは、全く同じ意味です。 例えば、以下のステートメントはアラートボックスに文字列“Hello”を表示します。 ALERT(MyPointer->) “MyPointer”を使用して“MyVar”の値を変更することもできます。下記のステートメントは、変数“MyVar”に文字列"Goodbye"を代入します。 MyPointer->:="Goodbye" この2つの“MyPointer->”を使用したステートメントのとおり、“MyVar”を使用した場合と全く同じ動作を実行します。以下の2つのステートメントも、全く同じ動作を実行します。両方とも、変数“MyVar”の現在の値をアラートボックスに表示します。 ALERT(MyPointer->) 以下の2つのステートメントも、全く同じ動作を実行します。両方とも“MyVar”に、文字列“Goodbye”を代入します。 MyPointer->:="Goodbye" この節では、ボタンを参照するためのポインタの使用方法について説明します。ボタンは(プログラミング言語の観点から)、変数に属します。この節では、ボタンを参照するためのポインタの例を使用していますが、ここで示す概念は、ポインタで参照できる他のすべての種類のオブジェクトでも同様です。 フォーム上に無効にしたり有効にしたりを切り替える多数のボタンがあります。それぞれのボタンにはTRUEまたはFALSEの状態が割り当てられます。その状態に基づき、ボタンの有効と無効を切り替えます。ボタンの有効/無効を切り替えるたびに以下のテストを行います。 OBJECT SET ENABLED(MyButton;Condition) フォーム中のその他のボタンに対しても、同様の判定を実行する必要があります。さらに効率良く判定処理を実行するためには、各ボタンの参照にポインタを用いて判定を実行するサブルーチンを使用します。 サブルーチンでボタン変数を参照するには、ポインタを使用することができます (他にオブジェクト名を参照する方法もありますが、ここではポインタを使用する方法を紹介します)。例えば、以下のプロジェクトメソッドSet Buttonはポインタを使用してボタンを参照しています。 // SET BUTTON プロジェクトメソッド プロジェクトメソッド“Set Button”は以下のように呼び出します。 ` ... プログラミング言語でテーブルの代わりにポインタを使用することができます。 TablePtr:=->[anyTable] あるいは、以下のようにTableコマンドを使用してテーブルのポインタを得ることができます。 TablePtr:=Table(20) 以下のようにコマンドに対して、ポインタを指定することができます。 DEFAULT TABLE(TablePtr->) 言語がフィールドを期待する場所ではどこでも、フィールドを参照するためにポインタの逆参照を使用できます。以下のようなステートメントで、フィールドのポインタを作成します。 FieldPtr:=->[aTable]ThisField あるいは、以下のようにFieldコマンドを使用してフィールドのポインタを得ることができます。 FieldPtr:=Field(1;2) 以下のようにコマンドに対して、逆参照したポインタを指定することができます。 OBJECT SET FONT(FieldPtr->;"Osaka") この節の最初の例は変数へのポインタの使用を説明しています。 MyVar:="Hello" ポインタは、インタープロセス変数、プロセス変数の他、バージョン2004.1からはローカル変数にも利用できるようになりました。 プロセス変数もしくはローカル変数にポインタを使う場合、参照される変数はポインタが使用される時点で既に定義されていなければなりません。 Note:ローカル変数について;ローカル変数のポインタを使用すると、プロセス変数の使用を控えることができます。ポインタは、同じプロセス内のローカル変数にのみ使用することができます。 $MyVar:="Hello world" Method2で、デバッガは$1を次のように表示します。
$1の値は、次のようになります。
配列要素に対するポインタを作成することができます。以下の例は配列を作成し、配列の最初の要素を指し示すポインタを変数ElemPtrに割り当てます。 ARRAY REAL(anArray;10) ` 配列を作成 以下のように、ポインタの参照先である配列要素に値を代入することができます。 ElemPtr->:=8 配列に対するポインタを作成することができます。以下の例は配列を作成し、配列を指し示すポインタを変数“ArrPtr”に割り当てます。 ARRAY REAL(anArray;10) ` Create an array ポインタが配列をポイントしていることを理解することが重要です。配列要素ではありません。例えば、ポインタの逆参照を以下のように使用できます: SORT ARRAY(ArrPtr->;>) ` 配列のソート 配列のポインタを使用し、例えば4番目の要素にアクセスするには、以下のように記述します。 ArrPtr->{4}:=84 関連するオブジェクトのグループを参照する場合にポインタ配列を使用すると便利な場合があります。 そのようなオブジェクトのグループの例として、フォーム上の変数のグリッドがあります。グリッドのそれぞれの変数には、Var1”、 “Var2”、. . . 、“var10”という連番が付いているとします。間接的にこれらの変数を数字で参照することができます。ポインタの配列を作成し、各変数を指すためにポ インタを初期化すれば、変数を簡単に参照することができます。例えば、配列を作成し各要素を初期化するために、以下のようなステートメントを使用します。 ARRAY POINTER(apPointers;10) ` 10の要素を持つポインタ配列をを作成する。 Get pointer 関数は、指定された変数名で示されるオブジェクトへのポインタを返します。 いくつかの変数への参照が必要な場合は、配列要素を使用します。例えば、変数に10個の日付を代入する場合は(変数が日付タイプであると想定して)、以下のように記述します。 For($i;1;10) ` 各変数に対して1回ずつループする フォーム中に関連する一連のラジオボタンがある場合に、それらを素早く設定しなければならないことがあります。名前を使用して各ラジオボタンを直接参照することは、効率が良くありません。 一連のラジオボタンでは、1つのラジオボタンのみがオンになります。オンになっているラジオボタンの番号は、数値フィールドに記憶されます。例えば、[Preferences]Settingの値が3の場合は、Button3に1を設定します。フォームメソッドは以下のようなプログラムにより、ボタンをセットします。 Case of 上記例では各ラジオボタンごとに判定しなければなりません。フォーム内に多くのラジオボタンがあると、非常に長いメソッドになる場合もあります。この問題を解決するために、ポインタを使用します。 Get pointer 関数を使用して、ラジオボタン(あるいは任意のボタン)のポインタを作成することができます。値を設定する必要のあるラジオボタンを参照するためにポインタを使用します。次に改善されたメソッドの例を示します。 Case of ラジオボタンの番号が、“設定”フィールドに記憶される必要があります。これは、フォームメソッドでOn Clickedイベントに対し以下の行を加えると実現できます。 [Preferences]Setting:=Button1+(Button2*2)+(Button3*3)+(Button4*4)+(Button5*5) ポインタを引数としてメソッドに渡すことができます。メソッド内で、ポインタによって参照されるオブジェクトを修正することができます。 ` TAKE TWO project method 以下のステートメントは、フィールド値を大文字に、変数を小文字に変更するためにメソッド“Take Two”を使用します。 TAKE TWO(->[My Table]My Field;->MyVar) このフィールド[MyTable]MyFieldが“jones”であれば、“JONES”に変更されます。一方変数MyVarが“HELLO”であれば、“hello”に変更されます。 より高度な使い方として、他のポインタを参照するためにポインタを使うことができます。以下の例を考察してください。 MyVar:="Hello" この例はアラートボックスに“Goodbye”を表示します。 各行について見ていきましょう。
以下の例では、変数MyVarに“Hello”が代入されます。 (PointerTwo->)->:="Hello" 以下の例では、変数NewVarに変数MyVarの値である“Hello”が代入されます。 NewVar:=(PointerTwo->)-> 重要: 複数の参照には括弧が必要です。
参照
|
プロパティ
プロダクト: 4D
履歴
ARTICLE USAGE
ランゲージリファレンス ( 4D v16) |
||||||||||||||||||||||||||||||