# オブジェクトの階層構造と参照

マニュアル > 画面作成ガイド > スクリプト > オブジェクトとスクリプト > # オブジェクトの階層構造と参照 |

オブジェクトの階層構造

オブジェクトは階層構造を持っています。階層構造とはオブジェクトの親子の関係のことです。例えば、フォームは複数のコントロールを持ちますが、フォームはコントロールの親オブジェクトであり、コントロールはフォームの子オブジェクトです。すべてのオブジェクトはプロパティ、メソッド、イベントを持っています。

ここで、第１階層にある「root」（ルート。日本語では"根っこ"）オブジェクトとは、システム全体にかかわるプロパティやメソッドを持つ、最も重要なオブジェクトです。ルートオブジェクトはMathオブジェクトとフォームオブジェクトを子として持ち、ルートオブジェクトが持つプロパティやメソッドにはシステム全体からアクセスすることができます。また、ルートオブジェクトにユーザーがスクリプトで関数（ユーザー定義関数）を記述した場合、その関数はシステム全体から自由に呼び出すことができる汎用ユーザー定義関数として利用できるようになります。

続いて、第２階層にはフォームオブジェクトとMathオブジェクトがあります。

フォームオブジェクトとは、コントロールを貼り付ける画面そのものであり、通常の画面としての表示のほか、画面上にダイアログ（ポップアップ）として重ねて開くこともできます。フォームオブジェクトにアクセスするには、ルートを表す「::」の横にフォーム名を指定し、「.」（ピリオド）で区切ってメソッド名やプロパティ名を指定します。

    event OnMouseUp(button)
    {
    	::Form01.FillColor = "#FF0000";	// Form01のFillColor（背景色）プロパティを赤にする
    	::Form02.FillColor = "#00FF00";	// Form02のFillColor（背景色）プロパティを緑にする
    }

Mathオブジェクトとは、平均値、合計値などの算術演算を行うためのメソッドが集められた特別なオブジェクトです。Mathオブジェクトの利用にあたっては、下記のように「::Math.」のあとにメソッド名をつなげて記述することで、いつでもMathのメソッドを呼び出すことができます。

    event OnMouseUp(button)
    {
    	var a = 12.34;
    	var b = ::Math.Abs(a);	// 12.34の絶対値を求める
    }

| フォームオブジェクトを操作する場合、ターゲットのフォームは現在開かれた状態である必要があります。現在表示中のフォームであれば、どの階層からでもそのフォームのメソッドやプロパティの操作を行うことができます。例えばForm01の上にForm02がダイアログとして開かれている場合、Form01のコントロールからForm02のメソッドやForm02に貼り付けられたコントロールにアクセスすることができます。フォームオブジェクトはOpenFormやOpenDialogメソッドを呼び出した直後から有効になります。

| Ver6以降、同一のフォーム名であってもフォルダを分けて管理することが可能となりました。フォルダ名を指定してフォームを開く際には、以下のようにフォルダ名とフォーム名を「.」（ピリオド）で区切って指定します。
    event OnMouseUp(button)
    {
    	::OpenForm("Folder01.Form01");
    }
また、上記のようにフォルダ名を指定してフォームを開いた場合、スクリプトからのオブジェクト参照の方法は以下のように行う必要があります。
    event OnMouseUp(button)
    {
    	//GetChildObjメソッドを使い、「.」を「_」で置き換えてFormオブジェクトを取得する
    	var vObj = ::GetChilObj("Folder01_Form01");

    	//Folder01のForm01オブジェクトのコメントプロパティにアクセスした例
    	::OpenMsg(vObj.Comment);
    }

また、第３階層のコントロールオブジェクトとは、フォーム上あるエディットコントロールやラベルコントロールなど、フォームに貼り付けたコントロールそのものです。「::」のあとにフォーム名及びコントロール名を付加して、「.」（ピリオド）区切りでメソッド名やプロパティ名を指定します。

    event OnMouseUp(button)
    {
    	::Form01.Control1.FillColor = "#FF0000";  // Control1のFillColor（背景色）プロパティを赤にする
    	::Form01.Control2.FillColor = "#00FF00";  // Control2のFillColor（背景色）プロパティを緑にする
    }

| フォームに貼り付けられた各コントロールオブジェクトの名前（Nameプロパティ）は、初期値は空欄となっています。各コントロールの名前は必須ではなく、必要となる場合のみ付与してください。例えば、スクリプトから上記の方法でオブジェクトにアクセスしたい場合には、オブジェクトを参照するための名前が必要になるため、対象のコントロールオブジェクトのNameプロパティに名前を定義してください。また、名前は同一階層内で重複しない名称としてください。

絶対パスと相対パス

オブジェクトの階層構造の解説では、ルート（「::」）から順に下位オブジェクトをたどっていく方法について述べました。この参照方法のことを「絶対パス参照」と呼びます。

    //絶対パス参照
    event OnMouseUp(button)
    {
    	::Form01.Control1.FillColor = "#FF0000";  // Control1のFillColor（背景色）プロパティを赤にする
    	::Form01.Control2.FillColor = "#00FF00";  // Control2のFillColor（背景色）プロパティを緑にする
    }

これに対して、現在スクリプトが書かれているオブジェクト自身を参照の基点として、相対的に階層をたどっていく参照方法のことを「相対パス参照」と呼びます。下記は、Form01内のControl1コントロールのOnMouseUpイベントにスクリプトを記述した場合の相対パス参照の例です。

    // 相対パス参照
    event OnMouseUp(button)
    {
    	this.FillColor = "#FF0000"; 	// Control1のFillColor（背景色）プロパティを赤にする
    	parent.Control2.FillColor = "#00FF00";	// Control2のFillColor（背景色）プロパティを緑にする
    }

相対パスでは「this」及び「parent」キーワードが重要な役割を担います。

「this」とは自分自身のオブジェクトのことを指します。上記の場合、Control1自身を表します。この方法はコントロールオブジェクト自身のプロパティやメソッドにアクセスしたい場合の最もスマートな方法です。尚、絶対パス参照の場合はコントロールオブジェクト自身に名前をつける必要がありましたが、thisを使う場合には必ずしもコントロールオブジェクトに名前をつける必要はありません。

「parent」とは親オブジェクトのことを指します。上記の場合、フォームオブジェクトForm01を指します。従って「parent.Control2」とは、Form01内のControl2オブジェクトを指すことになります。尚、フォームオブジェクトは、開いた直後から（つまり、画面やダイアログとして表示した直後から）パス参照が行えるようになります。

オブジェクトのグループ化と階層

オブジェクトはグループ化することができます。グループ化を行うと、グループコントロールとしてオブジェクトが１つ作成されます。グループ化された複数のコントロールは、そのグループコントロールの子オブジェクトとして１つ下の階層に移動します。

グループ化によって生成されたグループオブジェクトには、スクリプトを記述することも可能です。また、グループの構成要素である各子オブジェクトについても、同様にスクリプトの記述が可能です。

| グループ化を行うと階層が１つ下に移動します。コントロール内で「parent」キーワードを用いて、下記のようなスクリプトを記述している場合は注意が必要です。 parent.FillColor 「parent」は常に自分自身の１階層上の親オブジェクトを指します。つまり、グループ化する前に第三階層にあったオブジェクトの場合だと「parent」はFormオブジェクトを指していましたが、そのオブジェクトがグループ化されると１階層下になり、「parent」はグループコントロールを指すようになります。

| グループオブジェクトは、さらにグループ化することもできます。その場合、グループに含まれるコントロールは、４階層から、５階層、６階層と、さらに下層になります。スクリプトからオブジェクトを参照する際には、オブジェクトの親子関係を意識し、適切なオブジェクトパスとなるように注意してください。