• ベストアンサー

VB.NETについての質問なんですが

SubMainで「Form1」をshowで開き、その「Form1」の中で「Form2」をshowで開いた後、「Form1」だけをCloseで閉じたいのですが、「Form1」をで閉じてしまうとプログラムが終了してしまいます。 Public Class Form1 : :   Private Sub Button1_Click……   Dim frmForm2 as New Form2   frmForm2.Show   Me.Close Sub End End Class 良い方法があればアドバイスをお願いします

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

  • ベストアンサー
  • shobon
  • ベストアンサー率66% (14/21)
回答No.3

要するに、Form1のボタンを押したら、Form2が表示されて、Form1が消えれば良いのですよね? それならば、一番簡単なのは、Me.Close()ではなく、Me.Hide()を使う事ではないかと思います。

fuchir
質問者

お礼

回答ありがとうございます。一様できるようになりましたが、他に方法があるのでしょうか。

fuchir
質問者

補足

Hideを使うとフォームが非表示にされるみたいなのですが、非表示にされたホームを再び表示するにはどうすればよいですが?

その他の回答 (2)

noname#187541
noname#187541
回答No.2

No.1ですが訂正です。 >SubMain であれば、シャットダウンモードはかグレーアウトで選べないので関係ないです。

fuchir
質問者

お礼

回答ありがとうございます。SubMainだと出来ないってことですね。MDIについて詳しく調べてみます。

noname#187541
noname#187541
回答No.1

こんにちは。 My Projectのアプリケーションタブで「シャットダウンモード」はどうなっていますか? 「スタートアップフォームが閉じるとき」になっているとそのような動作になるのではないでしょうか? 後はForm1がMDI親フォームに設定されているとそのようになります。 Form1のIsMdiContainerプロパティがTrue担っていないか確認してください。

関連するQ&A

  • VB.NET2005からoracle92へ接続するには?

    IDとパスワードを入力し、オラクルのDBにあるIDとパスワードだったら次の画面を開くというプログラムを作りたいです。 オラクルへの接続がうまく行ってないようで画面が固まってしまいます。 プログラムの不具合を教えていただけないでしょうか? よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New OleDb.OleDbConnection() Dim cmd As New OleDb.OleDbCommand() Dim rs As OleDb.OleDbDataReader cn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=*;User ID=*;Password=*;" cn.Open() '←ここで、エラーになります。 cmd = cn.CreateCommand() cmd.CommandText = "Select ID from abc" rs = cmd.ExecuteReader() While rs.Read() If TextBox1.Text = cmd.CommandText Then MessageBox.Show("パスワードを受付けました。") Dim frm2 As New Form2 frm2.Show() TextBox1.Clear() TextBox2.Clear() Else MessageBox.Show("パスワードが違います。") TextBox1.Text = "" TextBox1.Focus() TextBox1.Clear() TextBox2.Clear() End if     End While cn.Close() rs.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() End Sub End Class

  • VB.NET2005からoracle92へ接続する方法。

    IDとパスワードを入力し、オラクルのDBにあるIDとパスワードだったら次の画面を開くというプログラムを作りたいです。 オラクルへの接続がうまく行ってないようで画面が固まってしまいます。 プログラムの不具合を教えていただけないでしょうか? よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New OleDb.OleDbConnection() Dim cmd As New OleDb.OleDbCommand() Dim rs As OleDb.OleDbDataReader cn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=*;User ID=*;Password=*;" cn.Open() '←ここで、エラーになります。 cmd = cn.CreateCommand() cmd.CommandText = "Select ID from abc" rs = cmd.ExecuteReader() While rs.Read() If TextBox1.Text = cmd.CommandText Then MessageBox.Show("パスワードを受付けました。") Dim frm2 As New Form2 frm2.Show() TextBox1.Clear() TextBox2.Clear() Else MessageBox.Show("パスワードが違います。") TextBox1.Text = "" TextBox1.Focus() TextBox1.Clear() TextBox2.Clear() End if     End While cn.Close() rs.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() End Sub End Class

  • VB.net(.net framework 3.5 sp1)でフォーム

    VB.net(.net framework 3.5 sp1)でフォーム上に設置したコントロールのプロパティを一括で設定する方法はないでしょうか? 下記は実行しても反映されないのですが、処理のイメージとしてはこんな形です。 Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim test As New Button test.Text = "TEST" test.Top = 0 Me.Button1 = test End Sub End Class

  • VB.net2008 設定画面の作成

    VB.net2008 設定画面の作成 こんにちは、プログラミングの勉強を行っているのですが。 少し、躓いてしまったのでこちらで質問させてください。 Form1 と Form2 という二つのフォームを用意して。Form1で使用している設定値クラスをForm2にコピーして設定変更を行った後リターンで返すということを考えています。 ですが、どうしてもうまく書けないため、ご助言ください。 -----------------------以下ソース----------------- Public Class Form1 'XMLに設定保存 Private Sub SaveSetthing()  Dim wset as New Setting 'XMLserializerで書き込み ~~~~~~~~~~~~~~~~~~~ End sub   '設定読み込み Private Sub LordSetthing() 'XMLserializerで読み込み  Dim lset as New Setthing ~~~~~~~~~~~~~~~~~~~ End sub EndClass Public Class Setthing Public UserName as String Public Age as Integer ~~~~~~~~~~~~~~~ Public Function Clone() as Setthing Return DirectCast(MyBase.MemberwiseClone,Setthing) End Function End Class ---------------------------------------------- このときに、Form1のボタンを押したらForm2を開く動作で ------------------------------------------------- Private sub ボタンクリック(Bybal*************)  Dim f as Form2 = New Form2(Setthing.Clone) if f.ShowDialog = Windows.Forms.DialogResult.OK then me.Setthing = f.GetValue End if End sub ------------------------------------------------- ↑ここで返り値を受けたいと考えています。 ↓Form2構文 -------------------------------------------------- Public Class form2 Public sub New(ByVal Value as Setthing) InitializeComponent() Dim TempSetthing as Setthing = Value End sub  'ここで、渡された設定値の表示と設定画面で変更された設定の読み込み   Public Function GetValue() As Setthing Return TempSetthing End function End Class -------------------------------------------------- と、大雑把に書き込みましたがこのような感じの処理を行いたいです。 ですが、私の理解が足りない為Form2内でTempSetthing内のデータの読み書きが行えません(宣言できません) 独学で作ったものですので、ここまでの流れがおかしなものになっている可能性もありますが。 「このような処理が行いたい!」というのは伝えれるかとは思います。 Form2内でTempSetthingの値を変更できるようなTextBox等を作成して。代入する形にしたいのですが。 ご教授お願いします・・・

  • VBのパスワードに関して

    VBのパスワードについて質問です。 今ソースに書いたパスワードを認証させて、Form2に移動させようと思っています。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Text = "1234" Then MsgBox("パスワードが正しく入力さました") Dim frm2 As New Form2 frm2.Show() Else MsgBox("パスワードが正しくありません") Me.close() End If End Sub End Class 上記で質問があります。 まずForm1には TextBox1 .. 5 まで設置しています。 上記のソースだと"TextBox1"の"指定文字"が正しければ、 MsgBox("パスワードが正しく入力さました")と表示しますが、 これを増設したいのです。 例えば [TextBox1] - [TextBox2] - [TextBox3] - [TextBox4] - [TextBox5] [Button1] にしたいのですが、ソースコードはどの様になりますか? 順番としては1から5の小さい値でOKであれば認証する。 あと何処かで見たのですが、 これに起動の回数制限を設けたいと思っています。 その方法も教えて頂ければありがたいです。 また外部者から逆コンパされない様に暗号化方法も教えて欲しい! 私は一切、Web系の認証はしないので・

  • 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をしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • 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

  • VB2010の、Formを開く動作に関する質問です

    VB2010のFormについてお聞きしたいことがあります。 例えばForm1とForm2の2つがあるとして、 ・Form1上のボタンをクリック後Form2が表示される ・Form2を表示後Form1は自動で閉じられる。 この様な事をするにはどの様に行えばよろしいでしょうか? 試しに、 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Form2.Show()   Me.Close() End Sub と、してみたのですが Form2が表示された直後に1と2両方消えてしまいました。 改善方法を教えていただけると嬉しいです。 よろしくお願いいたします。

  • 【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」の部分のエラーです。 手書きで申し訳ありませんが、書きたいプログラムの参考画像も載せておきます。 数日前より調べては試し調べては試しと試行錯誤していますが、 正直手詰まりになっており、非常に困っております。 この他にも、フォーム間で命令を出しあいたい場面が多々あるのですが、 プロパティを変える程度のコードでつまずいていて、先に進めません。 手直しした簡単なサンプルコードを書いて頂けると非常に助かります。 以上、何卒よろしくお願い致します。

  • VB2008 Form間の計算について

    VB勉強中のものです。 次のようにプログラムを作成したいですので よろしくお願いします。 要望: 1 From2のTextbox1 or Textbox2に"2001/05/05"ような書式で日付を入力 2 RadioButton1かRadioButton2の選択して 3 Form1の「DateTimePicker」を利用して、日数の差を計算し、 Form2の label3に結果を表示させる 例: From2のTextbox1 = 2001/01/01 Form1の「DateTimePicker」 = 2002/01/01 RadioButton1を選択したら、 Label3内に " 誕生日から生まれて365日となりました" という結果が出れば、問題がないです。 ------------ Form 1 --------------------- Public Class Form1 Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click 'labelをクリックして、form2を開く Dim frmTmp As New Form2 frmTmp.ShowDialog() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim intdate As Integer intdate = DateDiff(DateInterval.Day, DateTimePicker1.Value, Now) Label1.Text = "誕生日から生まれて" & intdate & "日となりました" End Sub End Class -------------------------------------------- -------------Form 2 ------------------------ Public Class Form2 Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged If RadioButton1.Checked = True Then Label3.Text = "*******わからない部分*******" End If End Sub End Class ----------------------------------------------------- 以上

専門家に質問してみよう