- - PR -
[VB.NET]モーダルフォームの起動時のメッセージ表示について。
1|2|3
次のページへ»
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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に制御を書かないで解決をしたいのですが、何かいい方法をご存知の方はいらっしゃいませんでしょうか? |
|
投稿日時: 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-09 10:42
yukitos様 ご返答ありがとうございます。
早速試してみたのですが、こちらの説明も不十分であったのですが、 FormAは全画面ですが、FormBは小さいダイアログ画面ですので、Enabled=Falseにした際に、FormAのコントロールの色が変わってしまいます。 また、エラーメッセージ表示後はそのままFormBを閉じたいと思うのですが、 Activatedイベント内にMe.Close()を記述しても、FormBは閉じますが、ClosingイベントやClosedイベントが発生していないようなのです。 他によい方法がなければ、このやり方でいこうかと思いますが、 できれば、FormAの色は変わらないようにしたいので、そういった方法をご存知の方がいらっしゃれば、どうぞよろしくお願いします。 |
|
投稿日時: 2004-12-09 11:00
MessageBoxの表示後、一旦そのOwner(この場合にはformB)にFocusを移せば良いのではないでしょうか?
_________________ IEEE-CSDP 2004-2007 |
|
投稿日時: 2004-12-09 11:22
よろしければ、現象を再現できるソースをご提示ください。
> FormBは複数の画面から呼出される画面ですので、できればFormAに制御を書かな > いで解決をしたい 挙動が目的に合わないなら、それを回避することになると思います。 FormBが複数の場所から呼ばれるなら、FormBを呼ぶためのロジックをどこかに1つ つくってはいかがでしょう。 _________________ たつごろー codeseek こみゅぷらす |
|
投稿日時: 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-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-09 13:53
たつごろー様 早々のご回答ありがとうございます。
確かにFormB_Loadのタイミングであれば、MessageBoxは表示されるのですが、FormB自体が表示されないのでちょっと不都合なのです。 またまた説明が不足しておりましたが、実は今回の開発はVB6からVB.NETへのアップグレードを行っておりまして、VB6の時には、Form_Activateイベント内で記述されていても、先のような現象は発生していませんでした。 実際、先ほどのサンプルソースと同等のものをVB6にて試してみましたが、現象は確認できませんでした。 グレー表示の件に関してもそうなのですが、今回は開発依頼元より、VB6の時と動きを同じにしてほしいとの要望を受けており、できれば表示等の動きが変わらないようにしたかったのです。 どうしても方法がなければ、依頼元と相談することにします。 |
1|2|3
次のページへ»