スコープと限定子
オブジェクト モデルの利用:インデックス への移動
スコープによって,オブジェクトのフィールド,プロパティ,およびメソッドのアクセス可能性が決まります。クラスで宣言されたすべてのメンバーは,そのクラスで利用可能です。また,この後に説明がありますが,多くの場合,その下位クラスでも利用可能です。メソッドの実装コードはクラス宣言の外にありますが,クラス宣言の中でメソッドが宣言されるので,やはりメソッドもそのクラスのスコープ内にあります。
クラスのプロパティ,メソッド,またはフィールドを参照するメソッドの実装コードを書く場合,そのメソッドが宣言されているクラス内では,各識別子の前にクラス名を指定する必要はありません。たとえば,新しいフォームにボタンを 1 つ挿入したとすると,このボタンの OnClick イベントのイベントハンドラは次のように記述できます。
procedure TForm1.Button1Click(Sender: TObject); begin Color := clFuchsia; Button1.Color := clLime; end;
上の 1 番めの文は次の文と同等です。
Form1.Color := clFuchsia
Color プロパティの前に限定子 Form1 を置く必要はありません。Button1Click メソッドは TForm1 オブジェクトのスコープ内にあるからです。つまり,呼び出したメソッド本体の中にある限定子は,TForm1 インスタンスのスコープの範囲内にあります。これに対して,2 番めの文はボタンオブジェクトの色(イベントハンドラを宣言したフォームの色ではない)を参照しているので,限定子を付ける必要があります。
IDE は,各フォームごとに個別のユニット(ソースコード)ファイルを作成します。あるフォームのユニットファイルから別のフォームにアクセスする場合は,次の例に示すように,コンポーネント名に限定子を付ける必要があります。
Form2.Edit1.Color := clLime;
同じ方法で,ほかのフォームからもコンポーネントのメソッドにアクセスできます。次に例を示します。
Form2.Edit1.Clear;
Form1 のユニットファイルから Form2 のコンポーネントにアクセスするには,Form1 ユニットの uses 節に Form2 のユニットを追加します。
クラスのスコープは,その下位クラスにまで拡張されます。ただし,下位クラスの中でフィールド,プロパティ,またはメソッドを再宣言することもできます。下位オブジェクトの中で再宣言すると,継承したメンバーが隠蔽またはオーバーライドされます。