DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームアクティブイベントについて

環境/言語:[VB2005 ]
分類:[.NET]

おせわになります

フォームを親画面、子画面2つ作っていて、親画面を入力し、画面残したまま、子画面を表示させ入力するものを作っております。

親画面と子画面を入力し終わると、子画面をクローズして、残った親画面から
また入力できるように作ったのですが、子画面から戻った際、親画面のカーソル位置が制御できず、前回入力の位置にカーソルがいます。

子画面のクローズイベントで、(親画面).ActiveControl = (親画面).TextBox
としているのですが、全くカーソルが動きません。
子画面側から制御できないものなのでしょうか?
> 子画面のクローズイベントで、(親画面).ActiveControl = (親画面).TextBox
> としているのですが、全くカーソルが動きません。
> 子画面側から制御できないものなのでしょうか?

できると思いますが、どのようなコードをお書きでしょうか?
お世話になります 管理人様

実際は下記のようにコードを書いております。
******************************************************
'子画面終了処理
Private Sub Ko_Form_FormClosed(ByVal sender As System.Object, ByVal e   As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
'親画面の他社品番をクリア
Oya_Form.TextBoxThinb.Text = ""
'親画面の他社品番の入力エリアをクリア
Oya_Form.LabelThinb.Visible = False
Oya_Form.TextBoxThinb.Visible = False
'親画面のカーソル位置を先頭に☆☆☆
Oya_Form.ActiveControl = Oya_Form.TextBoxTyyyy(親画面のカーソルを    セットしたい項目)
End Sub
******************************************************
☆の部分がうまく動作しません。
お示しいただいたコードではちょっと分かりませんので、
次のようなコードを書いて試したところ、問題なくできました。
ここでは、Form1とForm2があり、Form1にTextBox1があるとします。

*Form1のコード

Public Shared MainForm As Form1

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

    MainForm = Me
    Dim f = New Form2
    f.Show()

End Sub

*Form2のコード

Private Sub Form2_FormClosed(ByVal sender As System.Object, _
    ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed

    Form1.MainForm.ActiveControl = Form1.MainForm.TextBox1

End Sub
管理人さん わざわざコードまで頂いてありがとうございます。

自分も同じことをやったのですが、FORM2を閉じた後にFORM1のTEXTBOXにカーソルがありました。

伝えられてなかったのかもしれませんが、FORM1に複数のTEXTBOXがあり、戻った際、FORM1の入力時のカーソル位置が最後のTEXTBOXにあるので、それを最初のTEXTBOXに戻す方法を知りたいのです。

頂いたコードでFORM1にTEXTBOXを増やして試してみましたが、最初のTEXTBOXに戻すことはできませんでした。
> 頂いたコードでFORM1にTEXTBOXを増やして試してみましたが、最初のTEXTBOXに戻すことはできませんでした。

もちろんForm1に複数のTextBoxを配置して試しています。その結果、問題なく動作しました。私がKYOUさんのおっしゃっていることの意味を全く理解していないのかもしれませんが...。
■No24372に返信(KYOUさんの記事)
> 頂いたコードでFORM1にTEXTBOXを増やして試してみましたが、最初のTEXTBOXに戻すことはできませんでした。

今、ご自分で作成なさっているプログラムとは別で新しくプロジェクトを作成して試してみましたか?
もし今作成中のプログラムに管理人さまのコードを追加して実装しているのであれば、Closed イベント中のコードが正しく動作していないかどうかさえわからないので問題の切り分けとしては不十分ですね。

これはあくまで 'たとえば' なのですが、Leave、GotFocus、LostFocus イベントなどでフォーカスの制御に関するコードがあると正しく動作しないことがあります。
今回の場合だとそれが Form1 に実装されていても Form2 に実装されていても起こり得ます。

まあ情報がないところをいろいろ考えても、答えに辿りつくのは難しいですね。
■No24380に返信(管理人さんの記事)
>>頂いたコードでFORM1にTEXTBOXを増やして試してみましたが、最初のTEXTBOXに戻すことはできませんでした。
>
> もちろんForm1に複数のTextBoxを配置して試しています。その結果、問題なく動作しました。私がKYOUさんのおっしゃっていることの意味を全く理解していないのかもしれませんが...。

管理人さんありがとうございます。
前回教えて頂いた時も、新規でつくったのですが、もう一度確認したところ
正しく動きました。
ですが、実際のソースがその通りやってもうまくいきません。
確かにいろいろ試した中でGotfocusはやりましたが、ソースからは消しています。
■No24382に返信(じゃんぬねっとさんの記事)
> ■No24372に返信(KYOUさんの記事)
>>頂いたコードでFORM1にTEXTBOXを増やして試してみましたが、最初のTEXTBOXに戻すことはできませんでした。
>
> 今、ご自分で作成なさっているプログラムとは別で新しくプロジェクトを作成して試してみましたか?
> もし今作成中のプログラムに管理人さまのコードを追加して実装しているのであれば、Closed イベント中のコードが正しく動作していないかどうかさえわからないので問題の切り分けとしては不十分ですね。
>
> これはあくまで 'たとえば' なのですが、Leave、GotFocus、LostFocus イベントなどでフォーカスの制御に関するコードがあると正しく動作しないことがあります。
> 今回の場合だとそれが Form1 に実装されていても Form2 に実装されていても起こり得ます。
>
> まあ情報がないところをいろいろ考えても、答えに辿りつくのは難しいですね。

じゃんぬねっとさんアドバイスありがとうございます。
前回も新規プロジェクトで試していたのですが、今回試したところうまく動きました。
今作成中のソースは同様にやっているはずですが、うまくいきません。
GotFocusは以前ためしましたが、削除しています。

親FORMに戻った時に、FORMACTIVEを検知してみようと思うのですが、これもうまく
動きません。
Private Sub 親Form_Activated(ByVal sender As System.Object, ByVal     e As System.EventArgs) Handles MyBase.Activated
Me.ActiveControl = TextBoxTyyyy
End Sub
子FORMが閉じて、親FORMが残ったような状態でもACTIVEとして検知してくれるものでしょうか?
■No24384に返信(KYOUさんの記事)
> 前回も新規プロジェクトで試していたのですが、今回試したところうまく動きました。
> 今作成中のソースは同様にやっているはずですが、うまくいきません。

"同様に" がどの程度かわかりませんが管理人さまのコードとまったく同じ実装でやってもダメだったということでしょうか?
もしそうであるなら、やはりこの掲示板で言及されていないどこかに原因がある可能性が高いのではないでしょうか。

> GotFocusは以前ためしましたが、削除しています。
> 親FORMに戻った時に、FORMACTIVEを検知してみようと思うのですが、これもうまく
> 動きません。

一般的にはこんなコードになるかなと思います。

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Dim form2 = New Form2()
        form2.Show(Me)
        AddHandler form2.FormClosed, AddressOf Form2_Closed
    End Sub

    Private Sub Form2_Closed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
        Me.TextBox4.Focus()
    End Sub

これでもダメであれば次は ShowDialog メソッドで試してみてください。

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Using form2 = New Form2()
            form2.ShowDialog()
        End Using

        Me.TextBox4.Focus()
    End Sub

どうでしょうか。
■No24385に返信(じゃんぬねっとさんの記事)
> ■No24384に返信(KYOUさんの記事)
>>前回も新規プロジェクトで試していたのですが、今回試したところうまく動きました。
>>今作成中のソースは同様にやっているはずですが、うまくいきません。
>
> "同様に" がどの程度かわかりませんが管理人さまのコードとまったく同じ実装でやってもダメだったということでしょうか?
> もしそうであるなら、やはりこの掲示板で言及されていないどこかに原因がある可能性が高いのではないでしょうか。
>
>>GotFocusは以前ためしましたが、削除しています。
>>親FORMに戻った時に、FORMACTIVEを検知してみようと思うのですが、これもうまく
>>動きません。
>
> 一般的にはこんなコードになるかなと思います。
>
> Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
> Dim form2 = New Form2()
> form2.Show(Me)
> AddHandler form2.FormClosed, AddressOf Form2_Closed
> End Sub
>
> Private Sub Form2_Closed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
> Me.TextBox4.Focus()
> End Sub
>
> これでもダメであれば次は ShowDialog メソッドで試してみてください。
>
> Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
> Using form2 = New Form2()
> form2.ShowDialog()
> End Using
>
> Me.TextBox4.Focus()
> End Sub
>
> どうでしょうか。

じゃんぬねっとさん ありがとうございます。
ちょうど私もUsingを使った文献を見つけて、思った通りに動かすことができました。

文献はじゃんぬねっとさんが書かれたものでした^^
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32944&forum=7

ありがとうございました
解決済み!
■No24386に返信(KYOUさんの記事)
> じゃんぬねっとさん ありがとうございます。
> ちょうど私もUsingを使った文献を見つけて、思った通りに動かすことができました。

Using ステートメントがあるから正しくフォーカスが設定できたわけではないと思います。
Using ステートメントは System.IDisposable.Dispose メソッドを自動的に呼んでいるのであって、少なくとも今回のその他動作には影響しません。

正しく動くようになったのは ShowDialog メソッドを使ったからではないでしょうか?
ShowDialog メソッドは Show メソッドと違って Form2 がモーダル表示になりますがその点も考慮する必要があるのではないでしょうか?
(モーダル表示で良いのであれば、問題ないとは思いますけど)

# 一応、解決済みのままにしておきます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板