- PR -

VB2003と2005で挙動が違う(ActiveControl)

1
投稿者投稿内容
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-08-18 11:28
XP Pro SP2

VB2003とVB2005でActivecontrolの設定時の挙動が違います

--- VB2003 -----------------------------------------------------
新規Windowsアプリケーションプロジェクト作成
form1 と form2 2つ作る
それぞれ textbox1,textbox2,button1 を置く

form1のコード
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim frm2 As New Form2(Me)
frm2.ShowDialog()

End Sub

form2のコード
Public Sub New(ByRef _frm1 As Form1)
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
frm1 = _frm1
End Sub

Dim frm1 As Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

frm1.ActiveControl = frm1.TextBox1
Me.Close()
End Sub
--------------------------------------------------------------------------
form1で textbox2 にフォーカス移動してから button1 をクリックし、
form2を表示。
form2で button1をクリックし form1 へ戻ると form1 の textbox1 が フォーカスを
持った状態になります。

これをウィザードでVB2005へコンバートして実行すると form1 へ戻ってもフォーカスが button1
のままです。

VB2005でもちゃんとフォーカス移動するにはどうすればいいでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-18 12:05
引用:

めだかさんの書き込み (2006-08-18 11:28) より:

VB2003とVB2005でActivecontrolの設定時の挙動が違います


正しくは、「.NET Framework 1.1 と 2.0 で」 だと思います。

個人的には、1.1 までの挙動にも違和感を感じます。
が、検証した結果、2.0 での挙動にはさらに違和感を感じました。(;_ _)

ActiveControl を設定すると、確かに ActiveControl は設定したコントロールに置き換わっています。
実際に、フォーカスが動いているのが見えます。

ここまでは、1.1 でも 2.0 でも同じです。
ただし、2.0 の場合は、呼び出し元のフォームに制御が移ると '元に戻される' ようです。
最初から無視しておけばいいわけですから、これは気持ち悪いです。

引用:

VB2005でもちゃんとフォーカス移動するにはどうすればいいでしょうか?


ActiveControl を設定するタイミングが今のままですと、Modal 表示をやめる必要が出てきます。
となると、タイミングを変えることになるでしょう。

そもそも、別のフォームから、他のフォームに対して直接何かをするというのは避けるべきです。
しかも今回は、'呼び出し先' が '呼び出し元' を制御しようとしています。
これは、構造化言語時代から忌み嫌われていることです。

私ならば、以下のような感じでスッキリさせます。

コード:

    Public Class Form1
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Using oForm2 As New Form2()
                If oForm2.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then
                    Me.TextBox1.Focus()
                End If
            End Using
        End Sub
    End Class

    Public Class Form2
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.DialogResult = System.Windows.Forms.DialogResult.OK
        End Sub
    End Class


どうでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-08-18 12:48
ありがとうございます。
ご提示いただいたコードで実現できました。
なぜこんな事をしたかったのかというと、条件によってform1側に戻った時に
フォーカスのセット先を変えたかったからです。

DialogResult自体使ったことなかったので勉強になりました。
サードパーティー製のコンポーネントがやっと.net2.0対応したので
2005にソース修正しているのですが、挙動が変わるのはやめてほしいですね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-18 13:00
引用:

めだかさんの書き込み (2006-08-18 12:48) より:

サードパーティー製のコンポーネントがやっと.net2.0対応したので
2005にソース修正しているのですが、挙動が変わるのはやめてほしいですね。


いえ、止むを得ないでしょう。
それを嫌って、古いバージョンのままというところもあります。(そういう選択肢もあります)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)