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

<< Click to Display Table of Contents >>

マニュアル > 画面作成ガイド > スクリプト > オブジェクトとは >

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

オブジェクトの階層構造

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

 

fap_script_0020

 

ここで、第1階層にある「root」(ルート。日本語では"根っこ")オブジェクトとは、システム全体にかかわるプロパティやメソッドを持つ、最も重要なオブジェクトです。例えば、Panel Serverとの接続情報など、システム全体に関わる設定はルートオブジェクトに対して行います。ルートオブジェクトが持つプロパティやメソッドにはシステム全体からアクセスすることができます。また、ルートオブジェクトにユーザーがスクリプトで関数(ユーザー定義関数)を記述した場合、その関数はシステム全体から自由に呼び出すことができる汎用ユーザー定義関数として利用できるようになります。

 

続いて、第2階層にはフォームオブジェクトと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の絶対値を求める
}

 

 

hint

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

 

hint

Ver6以降、同一のフォーム名であってもフォルダを分けて管理することが可能となりました。フォルダ名を指定してフォームを開く方法については、「オブジェクト名とフォーム名」の記述を参照してください。

 

attention

フォルダ名を指定してフォームを開いた場合、通常のフォームを参照する書式(「::Form01」など)ではフォームにアクセスすることができません。

フォルダ名を指定した場合のフォームの参照方法については、「オブジェクト名とフォーム名」の記述を参照してください。

 

 

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

 

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

 

 

hint

フォームに貼り付けられた各コントロールオブジェクトの名前(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オブジェクトを指すことになります。尚、フォームオブジェクトは、開いた直後から(つまり、画面やダイアログとして表示した直後から)パス参照が行えるようになります。

 

 

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

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

 

fap_script_0022

 

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

 

attention

グループ化を行うと階層が1つ下に移動します。コントロール内で「parent」キーワードを用いて、以下のようなスクリプトを記述している場合は注意が必要です。

 

   parent.FillColor

 

「parent」は常に自分自身の1階層上の親オブジェクトを指します。つまり、グループ化する前に第三階層にあったオブジェクトの場合だと「parent」はFormオブジェクトを指していましたが、そのオブジェクトがグループ化されると1階層下になり、「parent」はグループコントロールを指すようになります。

 

hint

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

 

オブジェクトのパス参照

PA-Panelのオブジェクト構造はrootを起点とした階層構造となっており、スクリプトから階層構造のオブジェクトを参照するためのキーワードがいくつか用意されています。参照方法には、階層の頂点から参照する「絶対パス参照」と、自分自身のオブジェクトを基準として相対的に参照する「相対パス参照」があります。

 

参照方法

キーワード

解説

絶対パス

参照

::

Rootオブジェクトを指します。「root.」と同意です。コロン2文字で表します。

 

例1)PSUserLevelルートプロパティを参照

if ( ::PSUserLevel == 10 ) {
      ・ ・ ・
}

 

例2)rootメソッドのOpenFormを呼び出す

::OpenForm(“Form01”);

 

例3)Form01に貼り付けられているBtn01ボタンのEnabledを変更

::Form01.Btn01.Enabled = T;

 

絶対パスでオブジェクトを参照する場合、オブジェクトのNameプロパティが設定されている必要があります。

 

相対パス

参照

this

自分自身のオブジェクトを指します。

 

例1)Btn01のスクリプト内から、自分自身のTextを変更

this.Text = “ボタン1”;

 

絶対パスと異なり、必ずしもNameプロパティが設定されている必要はありません。

 


parent

親オブジェクトを表します。

 

例1)Form01上にBtn01とBtn02の2つのボタンが貼り付けられている時、Btn01のスクリプト内から、Btn02のEnabledを変更

parent.Btn02.Enabled = F;

 

 

attention

オブジェクトは、変数に入れることが可能です。但し一度変数に入れた場合、オブジェクト内に定義している変数にはアクセスが出来ない制約があります。

 

例)フォームに変数「vData」を定義してある場合

フォームのスクリプト

var vData = "ABCDEFG";

 

フォーム上のボタンコントロールのスクリプト

event OnMouseUp(button)
{
	// 直接指定では変数へのアクセス可能
	::MsgBox(parent.vData);

	// 一度変数にオブジェクトを入れた場合はアクセス不可
	var vFormObj = parent;
	::MsgBox(vFormObj.vData); // ← 実行時にエラー発生
}

 

オブジェクト内の変数にはアクセス出来ませんが、メソッドにはアクセス出来ます。その為、以下の様にメソッドを作成する事で変数へのアクセスが可能となります。

フォームのスクリプト

var vData = "ABCDEFG";

function fGetData()
{
	return vData;
}
function fSetData(data)
{
	vData = data; 
}

 

フォーム上のボタンコントロールのスクリプト

event OnMouseUp(button)
{
	var vFormObj = parent;
	::MsgBox(vFormObj.fGetData());
}

 

 

 

オブジェクトの親取得/子取得

PA-Panelのオブジェクトの親子関係から相対パスでオブジェクトを取得する方法以外に、「GetParentObj」「GetChildObj」によってオブジェクトを取得する方法があります。

 

GetParentObj

親オブジェクトを取得する。

 

例1)Form01上にBtn01のボタンが貼り付けられている時、Btn01のスクリプト内から、親オブジェクト(フォームオブジェクト)を取得

var vFormObj = this.GetParentObj();

 

GetChildObj

子オブジェクトを取得する。

 

例1)Form01上にBtn01のボタンが貼り付けられている時、Form01のスクリプト内から、子オブジェクト(ボタンオブジェクト)を取得

var vBtnObj = this.GetChildObj("Btn01");

 

hint

GetChildObjは引数として、Nameプロパティによる取得以外に子オブジェクトの0からのIndexによる取得も可能です。子オブジェクトの総数は「GetChildObjCount」で取得できます。