2 返信 最新の回答 日時: Jan 27, 2016 6:28 PM ユーザー:nekokichi

    スクリプトステップ「次のフィールドへ移動」で不可視フィールドに移動(?)する

    nekokichi

      製品名とバージョン FileMaker Pro Advanced 14.0.4

      OSとバージョン OSX 10.11.2

      説明

      「次のフィールドへ移動」スクリプトを使って、レイアウト上でフィールドを移動する際、

      「次の場合にオブジェクトを隠す」を使ってフィールドを不可視にしたところ、

      移動の順番が不可視のフィールドに該当するとき、フォーカスが消えて、

      あたかも不可視のフィールドへフォーカス移動するような挙動になっている。

       

      同様の状況で、タブキーでフィールドを移動した場合は、不可視フィールドはスキップされ、

      その次の順番のフィールドへ移動することができる。

       

      まず、非表示のフィールドにフォーカスが移ることが、不自然である。

      「次のフィールドへ移動」で移動する先の制御は、「タブ順設定」に従う仕様なのだから、

      タブキーでの動作と同様になるべきだと思う。

       

      再現の方法

      (1) 新規にデータベースをつくる。

      (2) 4つのテキストフィールド、フィールドA、フィールドB、フィールドC、フィールドDを定義する。

      (3) フォーム形式画面で(3)の4つのフィールドを配置する。

      (4) フィールドBの「次の場合にフィールドを隠す」に対して、True を指定する。(常に隠す)

      (5) 「タブ順設定」で、フィールドAにタブ順「1」、フィールドDにタブ順「2」を設定し、他のタブ順は消す。

      (6) スクリプトAを作り、内容は「次のフィールドへ移動」ステップのみとしておく。

       

      この設定により、スクリプトAを実行すると、フォーカスは、フィールドA → フィールドD → フィールドA...

      のように移動することが期待される。


       

      しかし、実際にスクリプトAを実行すると、フォーカスは、フィールドA → フィールドB → フィールドD → フィールドA...

      というように移動する。

       

      タブキーを押下した場合は、フォーカスは、フィールドA → フィールドD → フィールドA... となる。

       

      一時的解決法

      人間が操作している前提で、単純に移動するだけなら、タブキーで移動すればよいが、

      実際の障害が起きているのはスクリプトを使った一連の処理の途中であるため代替方法が見当たらない。

        • 1. Re: スクリプトステップ「次のフィールドへ移動」で不可視フィールドに移動(?)する
          user14047

          [次のフィールドへ移動] スクリプトステップで非表示フィールドへ移動の是非はおいておくとして解決法の一例を。

           

          全てのフィールドに、"FLD_フィールドA" のように フィールド名 を利用した規則に則ったオブジェクト名をつけることが条件ですが、

          こんな形の計算式で判別することができます。(非表示オブジェクトなら 1 が返ってきます)

          GetLayoutObjectAttribute ( "FLD_" & Get ( アクティブフィールド名 ) ; "isobjecthidden" )
          

          この値で条件を分岐させ、True ならなにも処理をせずに即座に [次のフィールドへ移動] スクリプトステップを実行するようにすれば、抱えている問題は解決しそうですね。

          FileMaker Pro ヘルプ : GetLayoutObjectAttribute

          • 2. Re: スクリプトステップ「次のフィールドへ移動」で不可視フィールドに移動(?)する
            nekokichi

            user14047さま

             

            情報ありがとうございました。

            確かに、それで回避できました。

             

            表の列を部分的に入れ替えて入力する UI を作っていたので、同じフィールドを

            画面に2つ以上配置する箇所があり、"FLD_フィールドA 2"のような名前も使っていたため、

             

            GetLayoutObjectAttribute ( Get ( アクティブオブジェクト名 ) ; "isobjecthidden" ) 

             

            で解決しました。

             

            Get ( アクティブオブジェクト名 ) で名前が取得できたということは、

            画面上にないオブジェクトが内部状態でアクティブになっているということですね。

             

            申し訳ありませんが、障害と思われるので「回答」はクリックせずに未回答のままとさせていただきます。