OCN光で最大124,800円おトク!

こんにちは。
VBを勉強中の初心者です。

今メインとして使っているフォームをForm1とします。
サブとして使っているフォームをFrom2とします。

プログラムの実行時にForm1がでてくるのですが、
Form1を起動せず、Form2を起動したいです。
(メインフォームとサブフォームを入れ替えたいです)

この場合はどうすればいいでしょうか?
よろしくお願いします。

A 回答 (2件)

プロジェクトのエクスプローラーで Form2 を右クリックしてスタートアップ フォームに指定。

この回答への補足

お二方ありがとうございました。
どちらの方法も試させてもらったのですができませんでした。
いろいろとプロパティを見ていたら自分でわかりました。

補足日時:2009/10/25 00:24
    • good
    • 0

フォームの名前を入れ替えたらいかがですか


もしくはソースを開いて置換を使ってForm1をForm2に変更するとか
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

Qフォームのテキストボックスなどの変数名を標準モジュールから参照は可能か?

フォームのテキストボックスなどの変数を標準モジュールの関数から参照する方法を教えてください。
お願いします。

Aベストアンサー

>test(form1.Text1.Text)
>
>Public Function test(コントロール変数パラメータ)
>
>コントロール変数パラメータ=値を代入
>
>End Fuction
可能ですよ。サンプルです。試してみてください。

まず、フォームと標準モジュールを準備してください。
フォーム:
Form[Form1]にTextbox[Text1]とCommandButton[Command1]を配置してください。
([]内は、オブジェクト名です。)
Private Sub Command1_Click()
  Call test(Text1)
End Sub

標準モジュール:
Public Function test(txt As TextBox)
  txt.Text = "aaa"
End Function

CommandButtonを押すと、Textboxに”aaa”と表示されます。

※Public Function test(txt As ****)の****は、
「Textbox」又は「Object」又は「Control」 いずれでもOKです。
例:
Public Function test(txt As Textbox)
Public Function test(txt As Object)
Public Function test(txt As Control)
この辺りは、人それぞれになると思いますが・・・。

>test(form1.Text1.Text)
>
>Public Function test(コントロール変数パラメータ)
>
>コントロール変数パラメータ=値を代入
>
>End Fuction
可能ですよ。サンプルです。試してみてください。

まず、フォームと標準モジュールを準備してください。
フォーム:
Form[Form1]にTextbox[Text1]とCommandButton[Command1]を配置してください。
([]内は、オブジェクト名です。)
Private Sub Command1_Click()
  Call test(Text1)
End Sub

標準モジュール:
Public Function test(txt As TextB...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Q子フォームから親フォームのオブジェクトを参照したい。

こんばんわ。
いまVB.Net2005でプログラミングしている者です。
子フォームから親フォームのオブジェクトを参照したいのですが,
うまくいきません。
親フォームにListBox1を置き,
ここに入力された内容を
子フォームで下記のように参照しようとしました。
Dim 子フォーム As New 子フォーム
Label1.Text = 親フォーム.ListBox1.SelectIndex
としたのですが,
親フォームでListBox1に0以外のリストを選択したのに,
子側に来ると親フォーム.ListBox1.SelectIndexの値が
0になってしまい,親側での選択内容が反映されません。
どうすれば正しく参照できるでしょうか?
教えてください。よろしくお願いします。

Aベストアンサー

’親フォーム
Public Class Form1
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim NewForm As New Form2()

    NewForm.ListName = "12345"  '親フォームの値を子フォームに渡す
    NewForm.ShowDialog()     '子フォームを表示
    MsgBox(NewForm.ListName)   '子フォームから値を受け取る
  End Sub
End Class


'子フォーム
Public Class Form2
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.Close()
  End Sub
  Public Property ListName() As String
    Get
      Return TextBox1.Text
    End Get
    Set(ByVal value As String)
      TextBox1.Text = value
    End Set
  End Property
End Class

’親フォーム
Public Class Form1
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim NewForm As New Form2()

    NewForm.ListName = "12345"  '親フォームの値を子フォームに渡す
    NewForm.ShowDialog()     '子フォームを表示
    MsgBox(NewForm.ListName)   '子フォームから値を受け取る
  End Sub
End Class


'子フォーム
Public Class Form2
  Private Sub Button1_Click(ByVal...続きを読む

Qフォームを閉じる方法

VB2005 Expressにて開発を行っております。

ログインフォーム、メニューフォーム、各フォームと複数フォームを使用
するアプリを作成中です。
そこで質問させて下さい。呼び出し元フォームを閉じてから呼び出し先
フォームを開くとするにはどのように行ったらいいのでしょうか。

下記が作成中のPGMですが、「Form1からForm2を表示」「Form2からForm1を表示」は正常に動作しますが、再度「Form1からForm2を表示」を行うと
破棄されたオブジェクトにアクセスできません。
オブジェクト名 'Form2' です。
が表示されて「f2.Show()」でエラーになってしまいます。

どなたかご存知の方がいらっしゃいましたらご教授下さい。
よろしくお願いします。

'標準モジュールで下記を宣言
Public f1 As New Form1 'ログイン画面
Public f2 As New Form2 'メニュー画面
Public f3 As New Form3 'メニュー1
Public f4 As New Form4 'メニュー2

'Form1からForm2を表示
F_Form2.StartPosition = FormStartPosition.CenterScreen
F_Form2.Show()
Me.Close()


'Form2を閉じてForm1を表示
F_Form1.StartPosition = FormStartPosition.CenterScreen
F_Form1.Show()
Me.Close()

VB2005 Expressにて開発を行っております。

ログインフォーム、メニューフォーム、各フォームと複数フォームを使用
するアプリを作成中です。
そこで質問させて下さい。呼び出し元フォームを閉じてから呼び出し先
フォームを開くとするにはどのように行ったらいいのでしょうか。

下記が作成中のPGMですが、「Form1からForm2を表示」「Form2からForm1を表示」は正常に動作しますが、再度「Form1からForm2を表示」を行うと
破棄されたオブジェクトにアクセスできません。
オブジェクト名 'Form2' です。
...続きを読む

Aベストアンサー

フォームは閉じられると「破棄」されます。

そして、スタートフォームが閉じられるか、最後のフォームが閉じられると、アプリケーションが終了します(どちらでアプリ終了するかは、プロジェクトのオプション設定に拠る)

質問者さんは「フォームを移動するたびに、そのフォームだけ見せておきたい」と言う処理をしたいのですから「一旦、移動元のフォームを見えなくして、あとで見えなくなったフォームに戻って来る必要」がありますので、Close()メソッドだけでは処理出来ません。

何故なら「Close()すると破棄されてしまうので、もう戻れなくなる」からです。

Close()を使わず、Hideを使って下さい。
Me.Close()⇒Me.Hide

なお、Hideされて隠れたフォームが残ったまま、見えているフォームが[X]ボタン等で終了させられた場合、隠れたフォームを再表示できず閉じれなくなり、見えないフォームが残る場合があります。

その場合、アプリ終了条件が「最後のフォームが閉じらた時」だったり、見えずに残ったフォームがスタートフォームで、かつ、アプリ終了条件が「スタートフォームが閉じらた時」だった場合、そのアプリを終了させる事が出来なくなります。

Hideを使用する場合は「Hideされて見えなくなったフォームが取り残されて、アプリ終了が出来なくなる」と言う事が無いように「どれか1つのフォームが[X]ボタン等で閉じられそうになったら、閉じられる際に呼ばれるイベントプロシージャを利用して閉じられる事を検知し、他のすべてのフォームを明示的にClose()して、すべてのフォームを閉じてアプリを終了させる」などの処理が必要です。

フォームは閉じられると「破棄」されます。

そして、スタートフォームが閉じられるか、最後のフォームが閉じられると、アプリケーションが終了します(どちらでアプリ終了するかは、プロジェクトのオプション設定に拠る)

質問者さんは「フォームを移動するたびに、そのフォームだけ見せておきたい」と言う処理をしたいのですから「一旦、移動元のフォームを見えなくして、あとで見えなくなったフォームに戻って来る必要」がありますので、Close()メソッドだけでは処理出来ません。

何故なら「Close()す...続きを読む

Q他フォームのクリックイベント取得

VS2005を使ってちょこちょこプログラムの勉強をしています。
現在、同一ソリューション内のフォームの間のイベントを実装出来なくて困っています。
やりたい事は

Form1から、Form2を起動し、Form2のボタンをクリックした時に、
Form1でForm2のクリックイベントを取得したいのです。

自分なりに調べてみましたが、該当するようなところが中々見つかりませんでした。

わかる方いましたら、ご教示お願いします。

足らない情報等ありましたら、ご指摘ください。

Aベストアンサー

すでに回答が出ていますが「Form2に手を加えない(あるいは加えることが出来ない場合の)」方法を。

※Form2のボタン(Button1)がFriend(またはPublic)で生成されていることが前提です。

方法1:Form1側でForm2のButton1をWithEvent宣言した変数に格納する

[ Form1内 ]
Private WithEvents btnForm2 As Windows.Forms.Button

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim frmNew As New Form2
btnForm2 = frmNew.Button1

frmNew.Show()
End Sub

Private Sub btnForm2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnForm2.Click
Windows.Forms.MessageBox.Show("クリック♪")
End Sub

Private Sub btnForm2_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnForm2.Disposed
' 後始末
btnForm2 = Nothing
End Sub


ただし、この方法では、ボタンを1つしか制御できません。Form2を複数生成する場合は、イベントハンドラを使う方法があります。

方法2:イベントハンドラを手動で追加・削除する

[ Form1内 ]
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim frmNew As New Form2
'* インテリセンスではButton1が出てきませんが、手書きすれば大丈夫です。
AddHandler frmNew.Button1.Click, AddressOf Form2_Button1_Click
AddHandler frmNew.Button1.Disposed, AddressOf Form2_Button1_Disposed

frmNew.Show()
End Sub

Private Sub Form2_Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Windows.Forms.MessageBox.Show("クリック♪")
End Sub

Private Sub Form2_Button1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs)
' 後始末
Dim btnSender As Windows.Forms.Button = CType(sender, Windows.Forms.Button)
RemoveHandler btnSender.Click, AddressOf Form2_Button1_Click
RemoveHandler btnSender.Disposed, AddressOf Form2_Button1_Disposed
End Sub

すでに回答が出ていますが「Form2に手を加えない(あるいは加えることが出来ない場合の)」方法を。

※Form2のボタン(Button1)がFriend(またはPublic)で生成されていることが前提です。

方法1:Form1側でForm2のButton1をWithEvent宣言した変数に格納する

[ Form1内 ]
Private WithEvents btnForm2 As Windows.Forms.Button

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim frmNew As New Form2
btnForm2 = frmNew.Button1

...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???


人気Q&Aランキング