フォーカス

Q
フォーカスの移動によるスクロールバーの位置制御
[内容]
入力内容のリセットや、画面の初期化・遷移時にスクロールバーを上部に戻したい
A
入力内容のリセットや、画面の初期化・遷移時にスクロールバーを上部に戻すといった動作を実現する場合、 フォーカスを画面上部のオブジェクトに移動させる事によって、 スクロールバーが上部に戻るような動作を実現できる事ができます。

[サンプル1]
以下の画面では、「登録日」の横に、フォーカス移動用のButtonオブジェクト(以下、「dummy」ボタン)を 配置しています。
  ※画面上では見えないよう、WidthとHeightを「0」に設定しています。
「削除」ボタン押下時、一度この「dummy」ボタンへフォーカスを移動する事により、 スクロールバーを上部へ戻すような動きを実現できます。


但し、上記の実装方法は、フォーカスの動きに左右されるため、 フォーカスの動くタイミングによっては、スクロールバーが移動できない場合があります。

[サンプル2]

上記のような現象は、「dummy」ボタンのGetFocusイベントが完全に終了する前 (「dummy」ボタンへ完全にフォーカスが移動する前)に、 SetFocusメソッドが実行され「ステータス」へフォーカスが移動しているため発生しています。

■スクロールバーが上部へ移動しない場合(サンプル2)の記述
/* 削除ボタン */
Button del_b {
    X = 206;
    Y = 54;
    Width = 78;
    Height = 26;
    Title = "削除";
    
    Function OnTouch( e ) {
        /* 値のクリア */
        Fcs_005.del_data();
    }
}
/* dummyボタン */
Button dummy {
    X = 6;
    Y = 3;
    Width = 0;
    Height = 0;
    
    /* ★問題箇所★ */    
    Function OnGetFocus( e ) {
       Fcs_005.SplitterFrame1.SplitterForm1.status_l.SetFocus();
    }

}

Function del_data(e) {
    /* データ初期化 */
    Fcs_005.SplitterFrame1.SplitterForm2.user_data.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm2.date_l.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm2.insert_l.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm2.memo.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm1.status_l.Value = "";
    
    /* 「dummy」へSetFocus */
    Fcs_005.SplitterFrame1.SplitterForm2.dummy.SetFocus();
}

スクロールバーを移動させるためには、「dummy」ボタンのGetFocusイベントが完全に終了した後、 「ステータス」へフォーカスが移動が行われるようにする必要があります。
方法としては、Timerイベントを利用して、GetFocusイベントが完全に終了した後、 フォーカス移動する方法があります。

■スクロールバーが上部へ移動する場合(サンプル1)の記述

/* 削除ボタン */
Button del_b {
    X = 206;
    Y = 54;
    Width = 78;
    Height = 26;
    Title = "削除";
    
    Function OnTouch( e ) {
        /* 値のクリア */
        Fcs_005.del_data();
    }
}
/* dummyボタン */
Button dummy {
    X = 6;
    Y = 3;
    Width = 0;
    Height = 0;
    
    /* ★改善箇所★ */  
    Function OnGetFocus( e ) {
        /* Timerをセット */
        SetTimer(0.2);
    }
    Function OnTimer( e ) {
        /* Timerを解除 */
        RemoveTimer();
            
        /* Focusを受けたら、「status_l」へSetFocus */
        Fcs_005.SplitterFrame1.SplitterForm1.status_l.SetFocus();
    }
}

Function del_data(e) {
    /* データ初期化 */
    Fcs_005.SplitterFrame1.SplitterForm2.user_data.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm2.date_l.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm2.insert_l.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm2.memo.Value = "";
    Fcs_005.SplitterFrame1.SplitterForm1.status_l.Value = "";
    
    /* 「dummy」へSetFocus */
    Fcs_005.SplitterFrame1.SplitterForm2.dummy.SetFocus();
}


実際の挙動については、CRSファイル形式のサンプル
   「スクロールバーの位置制御サンプル (Fcs_005.zip)」
をご確認ください。


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