質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1280閲覧

Form1以外が開いている時、操作出来ない様にしたい(Form3を自作メッセージボックスとして使用したい)

sin777

総合スコア20

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/03/13 02:52

編集2021/03/13 07:32

下記の3つの事がしたいと思っています。
⑴ Form1・Form2・Form3が開いている場合は、Form1・Form2を操作出来ない様にする
⑵ Form1・Form2が開いている場合は、Form1を操作出来ない様にする
⑶ Form1・Form3が開いている場合は、Form1を操作出来ない様にする

Form1からForm2を開き、Form2からForm3を開くと
Form3の方のPrivate Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Loadの

'オーナーフォームを取得
_frm = CType(Me.Owner, Form1)で

ハンドルされていない例外
System.InvalidCastException:'型'Form_form2.Form2'の
オブジェクトを型'form_fom2.Form1'キャストできません。'

とエラーになってしまい困っています。
どなたか教えていただけないでしょうか。宜しくお願い致します。

Windows10でvisual studio 2019 for Windows Version 16.8.6を使用
Windows フォームアプリケーション(.NET Framework) VisualBasicより
プロジェクト名 form-form2として新規作成しました。

参考にしたサイト

Vb

1' Form1 2Public Class Form1 3 Private _showingForm2 As Boolean = False 4 Private _showingForm3 As Boolean = False 5 6 ' -------「Form2 Open」ボタン 7 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 8 Dim frm2 As Form2 = New Form2() 9 frm2.Owner = Me 10 frm2.Show() 11 End Sub 12 13 ' -------「Form3 Open」ボタン 14 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 15 Dim frm3 As Form3 = New Form3() 16 frm3.Owner = Me 17 frm3.Show() 18 End Sub 19 20 Public Property ShowingForm2() As Boolean 21 Get 22 Return _showingForm2 23 End Get 24 Set(ByVal value As Boolean) 25 _showingForm2 = value 26 If _showingForm3 = False And _showingForm2 = False Then 27 '子フォームのいずれも表示されていなかったら、 28 'このフォームを有効にする 29 Me.Enabled = True 30 ElseIf _showingForm3 = True Or _showingForm2 = True Then 31 '子フォームのいずれかが表示されていたら、 32 'このフォームを無効にする 33 Me.Enabled = False 34 End If 35 End Set 36 End Property 37 38 Public Property ShowingForm3() As Boolean 39 Get 40 Return _showingForm3 41 End Get 42 Set(ByVal value As Boolean) 43 _showingForm3 = value 44 '子フォームが表示されているかどうかをチェック 45 If _showingForm3 = False Then 46 '子フォームが表示されていなかったら、 47 'このフォームを有効にする 48 Me.Enabled = True 49 Else 50 '子フォームが表示されていたら、 51 'このフォームを無効にする 52 Me.Enabled = False 53 End If 54 End Set 55 End Property 56End Class 57---------------------------------------------------------------------------------------------------- 58' Form2 59Public Class Form2 60 Private _frm As Form1 61 62 Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 63 'オーナーフォームを取得 64 _frm = CType(Me.Owner, Form1) 65 'フォーム2が表示されていると設定 66 _frm.ShowingForm2 = True 67 End Sub 68 69 ' -------「Form3 Open」ボタン 70 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 71 Dim frm3 As Form3 = New Form3() 72 frm3.Owner = Me 73 frm3.Show() 74 End Sub 75 76 ' -------「Form2 Close」ボタン 77 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 78 'フォーム2が非表示になると設定 79 _frm.ShowingForm2 = False 80 Me.Close() 81 End Sub 82End Class 83---------------------------------------------------------------------------------------------------- 84' Form3 85Public Class Form3 86 Private _frm As Form1 87 88 Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load 89 'オーナーフォームを取得 90 _frm = CType(Me.Owner, Form1) 91 'フォーム3が表示されていると設定 92 _frm.ShowingForm3 = True 93 End Sub 94 95 ' -------「Form3 Close」ボタン 96 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 97 'フォーム3が非表示になると設定 98 _frm.ShowingForm3 = False 99 Me.Close() 100 End Sub 101End Class

Form1には「Form2 Open」ボタン「Form3 Open」ボタン、
Form2には「Form2 Close」ボタン「Form3 Open」ボタン、
Form3には「Form3 Close」ボタンを作成しています。
※「Form3 Open」ボタンは自作メッセージボックス表示テスト用の為、実際には使用しません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/03/13 02:58

> エラーになってしまい困っています。 エラーメッセージを提示しましょう
退会済みユーザー

退会済みユーザー

2021/03/13 03:03 編集

参考にしたサイトは url も文字列を書くだけでなくリンクを張ってください。 エラーメッセージをコピペして記載してください。どのように操作するとコードのどこで出るのかも書いてください。エラーメッセージには重要な情報が含まれていて、それだけ見れば原因と解決方法が分かることもあると認識して下さい。 開発環境(OS, Visual Studio のバージョン、.NET なのか Core なのかとそのバージョンなど)を書いてください。
sin777

2021/03/13 07:19

y_waiwai様 質問内容を更新しました。ご指摘有難うございした。
sin777

2021/03/13 07:20

SurferOnWww様 質問内容を更新しました。ご指摘有難うございした。
退会済みユーザー

退会済みユーザー

2021/03/13 07:50 編集

Owner プロパティの設定による主従関係に矛盾はありませんか? > Form1からForm2を開き、Form2からForm3を開くと Form2 の Button1_Click で Form3 を開いたということのようですから、そうすると Form2 の Button1_Click で Form3 の Owner は Form2 と設定されるのでは?  それを _frm = CType(Me.Owner, Form1) で Form1 にキャストしようとして「できません」と言われているのでは?
sin777

2021/03/13 14:20

SurferOnWww様 回答有難うございます。 Form2からForm3を開いたらForm2をOwnerに変更すればよいのですが、 変更の仕方がわからないので、調べてみます。 又、キャストも理解できていないので勉強してみます。 有難う御座いました。
guest

回答1

0

ベストアンサー

エラーの原因は、
Form1 → Form3 の場合だと、Form3のOwnerはForm1で良いが
Form1 → Form2 → Form3 の場合だと、Form3のOwnerはForm2にならなければいけない。
という不一致が原因で発生しています。

ただ単純にForm1を使用不可にしたいだけなのであれば
Show()メソッドを使わずに、ShowDialog()メソッドを使ってはどうでしょうか。
Form2からForm3もShowDialog()に変えると、3つ全部開いている状態で、Form3のみ操作可能になります。

自作のメッセージボックスとして利用したいという事なので
Form.DialogResult を ShowDialog() からの戻り値として使う事もできます。

投稿2021/03/13 12:51

sinya0320

総合スコア211

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sin777

2021/03/13 14:26

Form2とForm3もShowDialog()に変えて、3つ全部開いている状態で操作してみたら、Form3のみ操作可能になりました。 普通にShowDialog()にするだけで、3つのしたい事が出来ました。 回答有難う御座いました。ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問