Biz/Browser Tips002 var変数とarrayオブジェクトの使いこなし (gooブログBackup)

・var変数を使う場合
[1]一時的なオブジェクト
String wrk_str = "hogehoge";
などの場合、オブジェクトツリーに接続されるため余計な処理が生じるということと、オブジェクトツリーは再計算対象になるので常にスキャンされてしまうためです。

[2]実オブジェクト名の代わり
たとえば

Function OnTouch(e){
var wrk_textbox = ^.^.TabFrame1.TabForm1.TextBox1;
wrk_textbox.vlue = "hogehoge";
wrk_textbox.FgColor=$RED;
}

長い実オブジェクト名を使わずにすむのと、もう一つは、オブジェクト名が変わった場合、最初の1行のみの修正ですむためです。
もし、全部に実オブジェクト名を記述すると、全ての箇所の変更が必要になります。

・var変数の注意点 -- 暗黙のオブジェクト生成に注意する
var変数が指し示すオブジェクトの値を変えたければ、必ず.valueをつかって代入します。
var wrk_textbox = ^.TextBox1;
wrk_textbox.value = "hoge2";
たとえば次のようにすると
var wrk_textbox = ^.TextBox1;
wrk_textbox = "hoge2";
これだと、^.TextBox1の値は変化せず、var変数が指し示すオブジェクトが"hoge2"という文字列に変わるだけです。
しかし、
^.TextBox1="hoge2";
は ^.TextBox1の値が変化します。これは、^.TextBoxのデフォルトプロパティが.valueになっているので、CRSスクリプトが暗黙的に ^.TextBox1.value = "hoge2"; と解釈するのです。
var変数と実オブジェクトの扱いが違うので、初心者は混乱しやすいポイントです。

・arrayオブジェクトの本当の価値
arrayオブジェクトはオブジェクトツリーに接続し、リファレンスの配列が格納できる唯一のものです。
CV.netの初期段階(Biz Ver3の頃)において、カーソルがとまっている項目でF5ボタンを押すとダイアログを出すという処理がありました。
しかし、KeydownイベントはFormオブジェクトでしか補足できないため、どう工夫したかというと、

Form form1{
Array cur_pos;
TextBox TextBox1{
..............
}
..............
Function OnGetFocus(e){
cur_pos[0] = e.from;
}
}

という形で、カーソルが止まっているオブジェクトを判断させたのです。
イベントの伝搬とarrayオブジェクトをうまく組み合わせると、Formに定義するこの数行のみで、必ずcur_pos[0]には現在のオブジェクトのリファレンスが格納されています。(Biz Ver4 の段階ではClassに定義することで汎用的に使えるようになりました)
たとえばBiz初心者の場合、カーソルが止まっているオブジェクトの判断は
Form form1{
Number cur_pos;
TextBox TextBox1{
Function OnGetFocus(e){
^.cur_pos[0] = 1;
}
TextBox TextBox2{
Function OnGetFocus(e){
^.cur_pos[0] = 2;
}
..............
TextBox TextBox5{
Function OnGetFocus(e){
^.cur_pos[0] = 5;
}
..............
}
}
というコードを書いたりします。こんなコードでは全然ダメです!CRSスクリプトでこのような書き方を見つけたら、是非arrayオブジェクトを使う方法を教えてあげてください。
また、arrayオブジェクトの配列には自動拡張という暗黙の拡張があるため、例えば

if (array1[2]==null){
array1[0]="hogehoge";
}

とすると、array配列はarray1[0]だけではなく、すでにarray1[0],array1[1],array1[2]まで拡張されています
なので配列を勝手に増やしたくない場合には

if (array1.length<3){
}

などという書き方にする必要があります。