- PR -

アクティブフォームの取得

1
投稿者投稿内容
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-08-01 20:35
vs2005 vb win xp

いつも拝見しております。

1つご教授願いたいことがあります。

今、子フォームを何画面も開けるような仕様になっています。その場合に、アクティブなフォームだけのつもりでF4キーを押下すると、すべて開いている子フォームのF4キーKeyPressイベントが発生してしまいます。

それなので、各子画面でアクティブかどうかの判定で、アクティブ以外はその処理をぬける
感じでつくりたいのですが、そういうことは可能でしょうか。

親から現在アクティブな子フォームを取得とかは、記載があったのですが、子自身がアクティブかどうかの判定っているのはできないのでしょうか??

わかる方がいましたら、ご教授お願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-01 22:07
Form.ActiveForm プロパティ
引用:

アプリケーションで現在アクティブなフォームを取得します。

どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-08-02 09:26
Jittaさん、ありがとうございます。

子フォームの、KeyPressイベントのところに、
Dim currentForm As Form = Form.ActiveForm
をいれてみて、アクティブのフォーム名を取得してみようと思ったのですが、nothingになってしまいます。

nothingだったので、アクティブじゃないのかな思い
親フォームで、Dim tempChild As Form = Me.ActiveMdiChild を使うと、アクティブな子フォームは取得できました。

でも、子のKeyPressイベントに処理を入れたいので、子の方で取得したいのですが、何か根本的に違うのでしょうか?

ご教授お願いいたします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-08-02 09:47
引用:

どらさんの書き込み (2006-08-02 09:26) より:
Dim currentForm As Form = Form.ActiveForm
をいれてみて、アクティブのフォーム名を取得してみようと思ったのですが、nothingになってしまいます。


リファレンスマニュアルぐらいは読みましょう。「アクティブなフォームがない場合は null 参照 (Visual Basic では Nothing) 」だそうです。

どの様にして値を確認していますか?もしかしてデバッガがアクティブになっているとか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-02 09:53
引用:

どらさんの書き込み (2006-08-01 20:35) より:

それなので、各子画面でアクティブかどうかの判定で、アクティブ以外はその処理をぬける
感じでつくりたいのですが、そういうことは可能でしょうか。


解決するにあたり '順番' が違うのではないでしょうか?
下記引用部分が、今回のような事態を招いたわけですよね?

なぜ、こちらの原因を究明しようと思わなかったのでしょうか...
私は、1 人の技術者として下記の原因を知りたいと思っています。

引用:

今、子フォームを何画面も開けるような仕様になっています。その場合に、アクティブなフォームだけのつもりでF4キーを押下すると、すべて開いている子フォームのF4キーKeyPressイベントが発生してしまいます。


このような事態は、普通の実装をしていれば起こらないでしょう。
どらさんは NCL の仕様だと思っているようですが、私は単なる実装ミスではないかと思っています。

MDI 子フォームには、フォーカス絡みの不具合は確かにありますが、
今回のようなケースはちょっと想定できないですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-08-02 10:06
甕星さん、じゃんぬねっとさん、ありがとうございます。

引用:

リファレンスマニュアルぐらいは読みましょう。「アクティブなフォームがない場合は null 参照 (Visual Basic では Nothing) 」だそうです。



こっちの、文章不足ですいません。NOTHINGだとアクティブフォームがないのはヘルプで調べてました。それだったので、親フォームで子フォームのアクティブを調べて、アクティブフォームがあることを確認したのです。
(Dim tempChild As Form = Me.ActiveMdiChild)

値の確認は、Dim currentForm As Form = Form.ActiveFormで、currentFormの値を確認してます。


引用:

このような事態は、普通の実装をしていれば起こらないでしょう。
どらさんは NCL の仕様だと思っているようですが、私は単なる実装ミスではないかと思っています。
MDI 子フォームには、フォーカス絡みの不具合は確かにありますが、
今回のようなケースはちょっと想定できないですね。



確かにそうですよね。根本的にすべてのキーイベント自体、発生してしまうのがおかしいですよね^^;

もう一度、その辺を含めて調べてみます。

原因がわかりましたら、報告します。
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-08-02 17:01
結果報告します。

結果は、Inputman for .NET4.0のファンクションコントロールを使っていたためでした。

確認したところ、すべての画面でイベント発生してしまうのは仕様どおりということでした。

解決策としては

Enterイベントのときに、 fnkファンクションキー.Enabled = Trueとし

Leaveイベントのときに、fnkファンクションキー.Enabled = falseとする感じでした。

仕様ツールを最初に記載してなかったのが、皆さんを混乱させてしまった原因ですよね。以後気をつけます。

ちなみに、子フォームがアクティブかどうかをみるのは、

If Not Me.MdiParent.ActiveMdiChild Is Me Then
'*処理
End If

でした。

またよろしくお願いいたします。

1

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