フォーカス

Q
MoveFocusメソッド、SetFocusメソッドが効かない

A
FocusObjectクラスのSetFocusメソッドとMoveFocusメソッドは以下のケースでは動作
しない仕様となっております。
(MoveFocusメソッドはver4.1より追加されました。)

SetFocusメソッドが動作しないケース

■オブジェクトがフォーカスを受け取れない状態になっている

オブジェクトが非アクティブになっているなど、フォーカスを受け取れない状態にある
場合は、SetFocusメソッドが無効になります。
SetFocusメソッドの処理を記述する際には、オブジェクトがフォーカスを受け取れる
状態にあるか事前に考察しておく必要があります。

Form Form1 {
    Button Button1 {
        Title = "非アクティブのオブジェクトにSetFocus";
        Function OnTouch( e ) {
            ^.TextBox1.SetFocus();
        }
    }
    TextBox TextBox1 {
        Active = $FALSE;
    }
}


■複数オブジェクトに一度にSetFocusメソッドを実施している

 同一画面の複数オブジェクトに一度にSetFocusした場合、最後に実行したSetFocus
 メソッドのみが有効です。

Form Form1 {
    Button Button2 {
        Title = "複数オブジェクトに一度にSetFocus";

        Function OnTouch( e ) {
            ^.TextBox2.SetFocus();
            ^.TextBox3.SetFocus();
            ^.TextBox4.SetFocus();
        }
    }
    TextBox TextBox2;
    TextBox TextBox3;
    TextBox TextBox4;
}



MoveFocusメソッドが動作しないケース

■MoveFocusを呼び出したオブジェクト以外にキーボードフォーカスが設定されている場合

 フォーカスの当たっていないオブジェクトからMoveFocusを実行することはできません。

Form Form1 {
    Button Button1 {
        TabIndex = 1;
    }
    TextBox TextBox1 {
        TabIndex = 2;
    }
    DateEdit DateEdit1 {
        TabIndex = 3;
        Value = "2000/12/12";
    }

    if ( !$DESIGNTIME ) {
        Button1.SetFocus();
        
        /* フォーカスの当たっていないオブジェクト(TextBox1)からMoveFocus
           しようとしても無効です */
        TextBox1.MoveFocus();
    }
}


■選択されていないOptionItemなど、本来フォーカスを受け取らない状態にあるオブジェクトに
  MoveFocusしようとした場合

Form Form1 {
    Button Button1 {
        Title = "(1)";
        TabIndex = 1;
        AutoTabFocus = $FALSE;
        Function OnFocusOperation( e ) {
            MoveFocus();
        }
    }
    OptionButton OptionButton1 {
        TabIndex = 2;

        OptionItem OptionItem1[3] {
            AutoTabFocus = $FALSE;
            Function OnFocusOperation( e ) {
                MoveFocus();
            }
            this[0].Title = "(2)";
            this[1].Title = "(3)";
            this[2].Title = "(4)";

            this[0].TabIndex = 3;
            this[1].TabIndex = 4;
            this[2].TabIndex = 5;
        }
        Value = 0;
    }
    TextBox TextBox1 {
        TabIndex = 6;
        Value = "(5)";
        Function OnFocusOperation( e ) {
            MoveFocus();
        }
    }
}


■ダイアログに隠れている非アクティブのWindow内のオブジェクトの場合

 ダイアログが呼び出されている状態での呼出元のフォームなど、非アクティブWindow内の
 オブジェクトでMoveFocusすることはできません。
 ダイアログを閉じるなどの方法で、MoveFocusを行いたいオブジェクトのWindowが
 アクティブになるよう処理を記述してください。


Form Form1 {
    Button Button1 {
        Title = "Dialog呼出";
        TabIndex = 1;
        Function OnTouch( e ) {
            ^.Get("Dialog.crs");
        }
    }
    TextBox TextBox1 {
        TabIndex = 2;
    }
    TextBox TextBox2 {
        TabIndex = 3;
    }
    TextBox TextBox3 {
        TabIndex = 4;
    }

}


Dialog Dialog1 {
    Form Form1 {
        Button Button1 {
            Title = "ボタン";
            Function OnTouch( e ) {

                /* 呼び出し元のフォームが非アクティブなため、
                   テキストボックスにフォーカスは移動しません */
                ^.^.^.Button1.MoveFocus();
            }
        }
    }
}




管理番号:Fcs_004
  Biz-Collections Bizの宝箱 トップへ
  Biz/Browser・Biz/Designer TIPS集 トップへ