- PR -

[VB.NET]モーダルフォームの起動時のメッセージ表示について。

投稿者投稿内容
やんやん
会議室デビュー日: 2004/12/08
投稿数: 7
投稿日時: 2004-12-08 22:04
いつも参考にさせていただいております。

WindowsXP SP1,VB.NET 2003
.NET FrameWork1.1 SP1
の環境においてWindowsアプリケーションの開発をしております。

早速質問なのですが、FormAからShowDialogにてFormBを呼出し、
FormBのActivatedイベント内にて、FormAからの引数(グローバル変数を使用)を元にチェック処理をしております。
その際、チェック処理がエラーだった場合に、メッセージボックスを表示しているのですが、そのメッセージボックス表示中に、FormAをクリックすると、FormAがフォーカスを受け取ってしまい、イベントなども発生してしまいます。
Loadイベント内にチェック処理を書いても同じです。
モーダルフォームとしてFormBを開いているのにFormAに制御が戻ってしまうため、どうすればいいのか困っております。

なお、FormBは複数の画面から呼出される画面ですので、できればFormAに制御を書かないで解決をしたいのですが、何かいい方法をご存知の方はいらっしゃいませんでしょうか?
yukitos
会議室デビュー日: 2004/12/09
投稿数: 6
投稿日時: 2004-12-09 04:58
# C#で検証したのでVB.NETとの差異があるかもしれません。

FormAでShowDialog(this)としてOwner設定した上で、
FormBのActivatedイベントハンドラ(の最初の方)で
this.Owner.Enabledプロパティをfalseに、
またClosingイベントハンドラで
this.Owner.Enabledプロパティをtrueに
してやればいいのではないでしょうか。

求めるものと違っていたらすみません。
やんやん
会議室デビュー日: 2004/12/08
投稿数: 7
投稿日時: 2004-12-09 10:42
yukitos様 ご返答ありがとうございます。
早速試してみたのですが、こちらの説明も不十分であったのですが、
FormAは全画面ですが、FormBは小さいダイアログ画面ですので、Enabled=Falseにした際に、FormAのコントロールの色が変わってしまいます。
また、エラーメッセージ表示後はそのままFormBを閉じたいと思うのですが、
Activatedイベント内にMe.Close()を記述しても、FormBは閉じますが、ClosingイベントやClosedイベントが発生していないようなのです。

他によい方法がなければ、このやり方でいこうかと思いますが、
できれば、FormAの色は変わらないようにしたいので、そういった方法をご存知の方がいらっしゃれば、どうぞよろしくお願いします。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-12-09 11:00
MessageBoxの表示後、一旦そのOwner(この場合にはformB)にFocusを移せば良いのではないでしょうか?
_________________
IEEE-CSDP 2004-2007
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-12-09 11:22
よろしければ、現象を再現できるソースをご提示ください。

> FormBは複数の画面から呼出される画面ですので、できればFormAに制御を書かな
> いで解決をしたい

挙動が目的に合わないなら、それを回避することになると思います。

FormBが複数の場所から呼ばれるなら、FormBを呼ぶためのロジックをどこかに1つ
つくってはいかがでしょう。


_________________
たつごろー
codeseek
こみゅぷらす
やんやん
会議室デビュー日: 2004/12/08
投稿数: 7
投稿日時: 2004-12-09 13:06
とりあえず、実ソースではありませんが、同現象の発生するサンプルソースを用意しました。

FormAとFormBの二つの画面を用意します。
FormAには、FormBを呼出すための、Button1と、TextBox1を貼り付けます。
FormBは、特に他のコントロールは必要ありません。

FormAには以下のコードのみ記述します。

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

Dim dlg As New FormB
dlg.ShowDialog()
dlg = Nothing

End Sub

FormBには以下のコードのみを記述します。

Private Sub FormB_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated

MessageBox.Show("テストなので、常にエラー状態としてメッセージ出す")
Me.Close()

End Sub

スタートフォームにはFormAを指定して起動し、Button1をクリックすれば、FormBが表示されてすぐに、MessageBoxが表示されると思います。
MessageBox表示中に、呼出元のFormAをクリックすると、フォーカスが入ってしまいます。TextBox1にも自由に値を入力できてしまいます。ちなみに、FormBには当然フォーカスは移りませんが。
FormAのEnabled=Falseにする方法では、TextBox1やButton1のForeColorがグレー表示に変わってしまうので、できればそれ以外の方法を探しています。
どうぞよろしくお願いします。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2004-12-09 13:22
FormB_Loadでやればできるんじゃないかな。


> TextBox1やButton1のForeColorがグレー表示に変わってしまうので、
> できればそれ以外の方法を探しています。

本筋とは別の話だけど、
触らせたくないところがグレーになっていることは、ユーザインタフェース的に
まっとうです。これがだめな理由があるのですか?
一般的なユーザインタフェースに従うということは、一般的なユーザに対して
誠実であり、推奨されています。


_________________
たつごろー
MCSD.NET、MCDBA、MCSA、MCAD
Oracle Master Platinum 9i、Oracle Master Linux+

[ メッセージ編集済み 編集者: たつごろー 編集日時 2004-12-09 13:29 ]

[ メッセージ編集済み 編集者: たつごろー 編集日時 2004-12-09 13:30 ]
やんやん
会議室デビュー日: 2004/12/08
投稿数: 7
投稿日時: 2004-12-09 13:53
たつごろー様 早々のご回答ありがとうございます。

確かにFormB_Loadのタイミングであれば、MessageBoxは表示されるのですが、FormB自体が表示されないのでちょっと不都合なのです。

またまた説明が不足しておりましたが、実は今回の開発はVB6からVB.NETへのアップグレードを行っておりまして、VB6の時には、Form_Activateイベント内で記述されていても、先のような現象は発生していませんでした。
実際、先ほどのサンプルソースと同等のものをVB6にて試してみましたが、現象は確認できませんでした。
グレー表示の件に関してもそうなのですが、今回は開発依頼元より、VB6の時と動きを同じにしてほしいとの要望を受けており、できれば表示等の動きが変わらないようにしたかったのです。
どうしても方法がなければ、依頼元と相談することにします。

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