“3.3.2章”でフレームの用途と簡単な使用法を説明しました。この章では、フォームの相互関係をもう少し具体的に図式化して説明します。
表記法
フレームの相互関係を図式化する際に使用する表記法を説明します。
ボックス
コレクション上の項目です。ここの’Item’という文字は実際の名前とは関係ありません。
連結線
1:1接続を表記します。円形の接続アイコンがある部分がChildになります。
1:N接続を表記します。カラスの足(Crow's foot)接続アイコンがある部分がChildになります。
説明
アイテム間のスクリプト構文は、接続線上に表記します。
ParentsからChildへのスクリプトは、接続線上に表記します。
ChildからParentsへのスクリプトは、接続線下に表記します。
上の表記は以下のような意味です。
parentとchildが1:Nの関係です。
parents.id
スクリプトでchildにアクセスできます。parents.child[index]
スクリプトでchildにアクセスできます。child.parent
スクリプトでparentにアクセスできます。
用語の定義
用語 | 説明 |
---|---|
エレメント | コンポーネントのプロパティ、メソッド、イベントを総称してコンポーネントのエレメントと言います。 |
共通で使用するSyntax
'[', ']'の内には、indexまたは'id'を入れることができます。
つまり、 this.all[0]とthis.all['btn0']は全て同じコンポーネントを指すことができます。
フォーム
関係図
一般のフォームの場合
コンテナコンポーネントの場合
スクリプトの例示画面
インデックスの順序はdtset1、btn0、btn1、cmb0、div0、div1、bind1でと仮定します。
一般的なフォームでインデックスの順序は、Datasetが最初に来て、残りコンポーネントは、配置された順に決まって、Bindオブジェクトが最後に指定されます。
1つのフォームの中の同レベルでは、idが重複してはなりません。しかし、btn0とdiv0_btn0とdiv2_btnは同レベルではないので、同じidで指定しても差し支えありません。
コンポーネント / invisibleオブジェクト / bindのスクリプトアクセス
this.classname == "frm0" this.name == "frm0"
// btn0へのアクセス this.all["btn0"].name == "btn0" this.all[1].name == "btn0" this.btn0.name == "btn0" this.components[0].name == "btn0" this.components["btn0"].name == "btn0"
// dtset1へのアクセス this.all["dtset1"].name == "dtset1" this.all[0].name == "dtset1" this.dtset1.name == "dtset1" this.objects[0].name == "dtset1" this.objects["dtset1"].name == "dtset1"
// コンポーネント / invisibleオブジェクト / bindの個数 this.all.length == 7 this.components.length == 5 //btn0, btn1, comb0, div0, div1 this.binds.length == 1
コンテナコンポーネントへのスクリプトアプローチ
フォームを接続していないcontainerコンポーネントも動的にinvisible object/ bindを持つことができます。
// div0内のdiv0_btn0へのアプローチ this.div0.div0_btn0.name == "div0_btn0" this.div0.all[0].name == "div0_btn0" this.components[3].components[0].name == "div0_btn0"
// div2内のdiv2_btn0へのアプローチ this.div0.div2.div2_btn0.name == "div2_btn0" this.all["div0"].all["div2"].all["div2_btn0"].name == "div2_btn0" this.components["div0"].components["div2"].components["div2_btn0"].name == "div2_btn0"
フォームを乗せたコンテナコンポーネントへのスクリプトアプローチ
// (frm1内のスクリプトである場合) frm1にあるbtn0のアプローチ this.name == "div1" this.btn0.name == "btn0" this.all["btn0"].name == "btn0"
// (frm0内のスクリプトからアプローチする場合) frm1にあるbtn0のアプローチ this.name == "frm0" this.div1.btn0.name == "btn0" //"frm1"を含んでいる“div1”でのみアクセスすることができます。
親スクリプトの使用
this.div1.dtset2.parent.parent.classname == "frm0" this.div1.dtset2.parent.name == "div1" // frm1はdiv1に乗ることによってその特性を失います。 this.div1.dtset2.parent.classname == undefined // frm1はdiv1に乗せながらその特性を失い、classnameが存在しなくなります。 this.div1.dtset2.parent.name == "div1"
コンテナコンポーネントのエレメントの使用
フォームを持ったコンテナコンポーネントは、フォームのようにコンポーネント、invisibleオブジェクト、bind(以下、エレメント)を持つことができます
フォームを持たないコンテナコンポーネントはinvisibleオブジェクトとbindを持つことができず、コンポーネントのみ持つことができます。
コンテナ機能のないコンポーネント、invisibleオブジェクト、bindはエレメントを持つことができません。
コンテナコンポーネントは乗せられたフォームの特性を持つようになります。
フォームスクリプトにてthisでアクセスする場合には、フォーム内部のエレメントのみならずコンテナコンポーネントのエレメントにもアクセスすることができます。
コンテナコンポーネントが属するフォームにthis.コンポーネント名でアクセスする場合に乗っているフォームの全てのエレメントにアクセスすることができます。
アプリケーション
関係図
フォーム内のコンポーネント / bind / invisibleオブジドェクトは.getOwnerFrame()ですが、.getOwnerForm()はありません。
スクリプトの例示画面
applicationからフォームのスクリプトアクセス
// frm0へのアクセス(ChildFrameの場合) application.mainframe.frame.form.name =="frm0" application.mframe0.frame.form.name == "frm0" application.mframe0.chdframe0.form.name == "frm0" application.all[0].all[0].form.name == "frm0" application.all["mframe0"].all["chdframe0"].form.name == "frm0" this.mainframe.frame.form.name == "frm0"
formからapplicationのスクリプトアクセス
// frm0からapplicationにアクセス(ChildFrameの場合) this.parent.name == "chdframe0" this.parent.parent.name == "mframe0" this.getOwnerFrame().getOwnerFrame().name == "mframe0" this.getOwnerFrame().getOwnerFrame().parent.mainframe.name == "mframe0"