• ベストアンサー

クリックするたびに、フォームが複数表示される

下記のコードだと Private Sub Button1_Click(・・・ Dim f2 As New Form2() f2.Show() End Sub ボタンをクリックするたびに、同じフォームが表示されます。 同じフォームが開かないようにしたいのですが、どうすればいいのでしょうか? バージョンは、Visual Basic .NETです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

Private m_f2 As Form2 Private Sub Button1_Click(・・・   If m_f2 Is Nothing OrElse m_f2.IsDisposed Then     m_f2 = New Form2   End If   m_f2.Show() End Sub

a-z_A-Z
質問者

お礼

ありがとうございます。 希望通りのことができました。 実は、ネットで探して、この問題の対応策のページを見つけたのですが、私のvbのバージョンが古くて、myが対応していないため解決できませんでした。 これだと、私のバージョンでも問題が解決できたため助かりました。 ありがとうございました。

その他の回答 (1)

  • yhc3594
  • ベストアンサー率27% (25/92)
回答No.1

Dim f2 As New Form2()・・・この行で常にフォームが生成(新設)されます。 その後 f2.Show()・・・この行で新設されたフォームが表示されます。 *同一フォームが追加されて行く事になります。 Dim f2 As New Form2()の行を削除し、同一フォームが生成されない様にします。 f2.Show()をForm2.Show()として、フォームを表示します。 以上、お試し下さい。

a-z_A-Z
質問者

お礼

ありがとうございます。 つまり、 Private Sub Button1_Click(・・・ Form2.Show() End Sub ってことでしょうか? これだと、ビルドするとエラーがでました。

関連するQ&A

  • VB2010でMDI親フォームから子フォームを表示

    VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • 【VB.net】フォーム間でのやり取りについて

    先日、同じような質問をさせて頂いたのですが、 解決に至らなかったため、もう少し質問内容を工夫しますので、再度質問させてください。 ・実行したいプログラム フォーム1のボタン1をクリックすると、フォーム2を開くと同時にフォーム2ボタン1がvisible=Trueになる。 フォーム1のボタン2をクリックすると、フォーム2を開くと同時にフォーム2のボタン1がvisible=Falseになり、ボタン2がvisible=Trueになる。 ・書いたコード ---------------- Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim f As New Form2 f.Owner = Me f.Show() DirectCast(Me.Owner, Form2).Button1.Visible = True DirectCast(Me.Owner, Form2).Button2.Visible = False End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click Dim f As New Form2 f.Owner = Me f.Show() DirectCast(Me.Owner, Form2).Button1.Visible = False DirectCast(Me.Owner, Form2).Button2.Visible = True End Sub End class ---------------- ・問題点 「nullreferenceexceptionはハンドルされませんでした オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが発生します。 「DirectCast(Me.Owner, Form2).Button1.Visible = True」の部分のエラーです。 手書きで申し訳ありませんが、書きたいプログラムの参考画像も載せておきます。 数日前より調べては試し調べては試しと試行錯誤していますが、 正直手詰まりになっており、非常に困っております。 この他にも、フォーム間で命令を出しあいたい場面が多々あるのですが、 プロパティを変える程度のコードでつまずいていて、先に進めません。 手直しした簡単なサンプルコードを書いて頂けると非常に助かります。 以上、何卒よろしくお願い致します。

  • VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1

    VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1つめのフォームの操作ができないのですが、どなたか解決方法を御存じないでしょうか。 よろしくお願いします。 Form1のピクチャーボックスに描いた折れ線グラフ上のカーソル(Form11)が、 マウスの動きに合わせてグラフ線上をたどっていくようにしようとしています。 【Form1のボタンを押すと2つめのフォームを呼び出す】 Dim Mark As New Form11 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 'グラフカーソル表示 Mark.Show() 【呼び出されたフォームのコード】 Imports System.Drawing Public Class Form11 Private Sub Form2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 'フォームのクライアント領域のサイズを設定 Me.ClientSize = New System.Drawing.Size(20, 20) 'カーソルを描く Dim MarkPen As New Pen(Color.Red, 1) Dim g As Graphics = e.Graphics g.DrawEllipse(MarkPen, 0, 0, 20, 20) '円の描画 Me.TopMost = True '最全面 Me.TransparencyKey = Me.BackColor '透明色の設定 Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None '枠なし End Sub End Class

  • 特定のフォームだけ別フォームからの参照がされません

    VB 2005,Framework2.0を使用しています。 現在、サブフォームからダイアログフォームを表示し、ダイアログフォーム内の入力値等をサブフォームに渡す処理を行っています。 サブフォームは複数作成しており、特定のサブフォームだけダイアログフォームの入力値がサブフォームに渡されず原因が分からなくて困っています。 コードは以下のような形で書いています。 'サブフォーム Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Dialog1 f.StartPosition = FormStartPosition.CenterParent f.ShowDialog() End Sub End Class 'ダイアログフォーム Public Class Dialog1 Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click Form1.Label1.Text = Textbox1.text Me.Close() End Sub End Class 2005では、別フォームからの参照はVB6と同じようにインスタンスを作成しなくても参照できる様になったと聞いていますので、上記のコードでも参照方法として問題はないと思うのですが、うまく動作しない原因が分かる方が居られましたら宜しくお願いします。

  • 最小化したフォームを元に戻す

    VB2005Expressにて開発を行っています。 最小化したフォームを元に戻せなくて困っています。 どなたかご存知の方がいらっしゃいましたらご教授願います。 下記の動作を実現したいと思っています。 ・Form1でボタンが押されたらForm2を表示する ・この際にForm1を最小化する ・Form2を閉じる ・この際にForm1を元に戻す(手前に表示する) 以下が作成したプログラムです。 ---モジュールにて下記を宣言 Module Module1 'オブジェクトの宣言 Public f1 As New Form1 Public f2 As New Form2 End Module ---Form1でForm2を開くボタンを押した場合の処理 Private Sub Button1_Click(ByVal sender~ 'Form2を表示 If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 End If f2.Show() 'Form1を最小化する Me.WindowState = FormWindowState.Minimized End Sub ---Form2にて閉じるボタンを押した場合 Private Sub Button4_Click(ByVal sender~ f1.WindowState = FormWindowState.Normal ↑コレで実現できるかと思ったのですが、最小化されたままです・・・ End Sub

  • VB6.0でフォームをずらして表示したいのですが

    以下のコードを実行すると、メッセージボックスに10としか表示されません。 同じ場所にフォームが追加されていきます。 複数表示されているフォームを数える方法はないでしょうか? ご存知の方教えてください。 よろしくお願いします。 Private Sub CMD_drow_Click() Dim GraphForm As New Form2 Dim GraphNumber As Integer 'グラフカウント GraphNumber = Form2.Count MsgBox GraphNumber 'グラフ表示 GraphForm.Show '表示位置の設定 With GraphForm If GraphNumber <= 5 Then ' .StartUpPosition = 0 .Top = GraphNumber * 100 .Left = 0 Else ' .StartPosition = 0 .Top = (GraphNumber - 5) * 100 .Left = 300 End If End With End Sub

  • フォームを画面のど真ん中に表示させたいのですが

    フォームを画面のど真ん中に表示させたいのですが、 http://dobon.net/vb/dotnet/form/startposition.html を見たのですがコードの書き方がよくわかりません。 Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Dim f As New Form1() 'フォームを画面の真ん中に表示する f.StartPosition = FormStartPosition.CenterScreenf.Show() End Sub End Class こうすると、「FormStartPosition.CenterScreenf」の部分に波線がひかれます。 Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.StartPosition = FormStartPosition.Manual Me.Location = New Point(0, 0) End Sub End Class これで左は時に表示する事は出来るのですが、真ん中に表示させるにはどうすればいいでしょうか?

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • フォームが出力されません

    すみません。2日間悩んでいます。 Visual Studio2019でテンキー相当のフォームを作りましたが、フォームが表示されません。 ソースはBisual Basicで作成しています。 自分でフォームを読み込んでやらないとダメかなと思い、★を追加しましたが 今度は、★の行で下記のエラーとなりコンパイルが通りません。 単純なロジックなのに、エラー番号やフォームが表示されない等、いろいろ調べましたがわからず悩んでいます。 ちなみに★のパラメタのTkの指定をやめ、()だけにするとエラーはなくなりますが やはりフォームは表示されません。 申し訳ないですが、テンキー相当のフォームが表示できるようご教授をお願いします。 エラー BC30518 これらの引数で呼び出せるアクセス可能な 'Run' がないため、オーバーロードの解決に失敗しました: 'Public Shared Overloads Sub Run(mainForm As Form)': 型 'Tenkey' の値を 'Form' に変換できません。 'Public Shared Overloads Sub Run(context As ApplicationContext)': 型 'Tenkey' の値を 'ApplicationContext' に変換できません。 Public Class Tenkey Private keta As Integer = 0 '/***********************************************/ '/* 初期化処理(フォームのロード) */ '/***********************************************/ Public Shared Sub Main() Dim Tk As New Tenkey Tk.TextBox1.Select() 'テキストボックスにカーソルを移動 Tk.TextBox1.TextAlign = HorizontalAlignment.Right 'テキストボックスを右詰めで入力 MsgBox("テンキーを出力します") ★ Application.Run(Tk) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click In_check(1) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click In_check(2) End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click In_check(3) End Sub : : :

  • VB.NET:モーダルで表示したフォームを最小化

    Form2をForm1の所有として、モーダルで表示しました。 '------------------------ Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChildMdl.Click  'Form2を開く  Dim frmN As New Form2  frmN.ShowDialog(Me) 'MeはForm1 End Sub '------------------------ Form2が最小化された時に、親フォームであるForm1も最小化させたいと思い、 Form2のResizeメソッドに以下のようなコードを書きました。 '------------------------ Private Sub Form2_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize  Select Case Me.WindowState   Case FormWindowState.Minimized    '親フォームも最小化((1))    Me.Owner.WindowState = FormWindowState.Minimized   Case FormWindowState.Maximized    '親フォームも最大化((2))    Me.Owner.WindowState = FormWindowState.Maximized   Case FormWindowState.Normal    '親フォームも通常サイズ((3))    Me.Owner.WindowState = FormWindowState.Normal  End Select End Sub '------------------------ しかし、(2)、(3)は問題なく実行できるのですが、 (1)を実行すると、自フォーム(Form2)が閉じてしまうのです。 そういう仕様なのでしょうか? ご存知の方、教えてください。よろしくお願いします。