none
「Focus」と「Select」の違いについて RRS feed

  • 質問

  • 以前、VB2017に替えた頃だったでしょうか、インテリセンスでFocusが表示されなくなり、「Focus は、主にカスタム コントロールの作成者が使用するための下位メソッドです。代わりに、アプリケーションプログラマは、子コントロールには Select メソッドまたは ActiveControl プロパティ、フォームには Activate メソッドを使用する必要があります。」ということで古いプログラムのFocus部分をSelectに替えたところ思うように動かなくなりました。原因を探ろうと、次のコードで再現できました。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Button1.Enabled = True
            Button2.Enabled = False
            Button3.Enabled = False
            TextBox1.Enabled = False
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Button1.Enabled = False
            Button2.Enabled = True
            AcceptButton = Button2
            TextBox1.Enabled = True
            TextBox1.Select()
        End Sub

    AcceptButtonが絡んでいますが、この場合TextBox1にフォーカスはあたりません。

    しかし、SelectをFocusにするとTextBox1にフォーカスがあたります。何故なのでしょう。宜しくお願いします。

    2018年7月23日 21:34

回答

  • 一旦全ての(選択可能な)コントロールがEnabled=falseになるのが良くないようですね。この時点でFormからフォーカスが失われてしまいますが、SelectやActiveControlが内部処理でフォーカスを設定する際には、この状態のFormについてはフォーカスを与えないようになっているようです。

    // わざわざそういう処理を入れるのも理由があってのことなんだと思いますが。

    なのでこのケースでは、Button1とButton2のEnabledの設定する順序を逆にするだけでとりあえず回避できます。

    • 回答としてマーク nebokken 2018年7月24日 22:26
    2018年7月24日 8:19

すべての返信

  • 一旦全ての(選択可能な)コントロールがEnabled=falseになるのが良くないようですね。この時点でFormからフォーカスが失われてしまいますが、SelectやActiveControlが内部処理でフォーカスを設定する際には、この状態のFormについてはフォーカスを与えないようになっているようです。

    // わざわざそういう処理を入れるのも理由があってのことなんだと思いますが。

    なのでこのケースでは、Button1とButton2のEnabledの設定する順序を逆にするだけでとりあえず回避できます。

    • 回答としてマーク nebokken 2018年7月24日 22:26
    2018年7月24日 8:19
  • Formにフォーカスがある状態を残して、Select等を設定するということですね。了解しました。ありがとうございました。
    2018年7月24日 22:25