ソリュージョン内のフォームを行き来したい

解決


シュン  2008-12-17 20:57:55  No: 145523

今回はソリュージョン内でのフォームの行き来がしたいのですが・・・方法がまるでわかりません・・・
画面はこのようになっています。(Name名で記載)
Form1
          label

          botton1

          botton2

          botton3

Form2がメインのフォームで、Form1に戻るためのボタンがあります。
Form3にはform2同様Form1に戻るためのボタンがあります。

このとき行いたい処理は
1・・・プログラムを開くとフォーム1が最初に開く
2・・・フォーム1のボタン1を押すとフォーム1が閉じてフォーム2が開き、ボタン2を押すとフォーム1が閉じてフォーム3が開きます。ボタン3を押すとプログラムが終了します。
3・・・フォーム2,3の戻るボタンを押すとフォーム2,3が閉じてフォーム1に戻ります。

ソリュージョンのビルドを行うとエラーが出て実行できないし、プログラムを起動できません。
エラー・・・'Sub Main' が、'アプリケーション名.Form1' に見つかりませんでした。&'Sub Main' が、'アプリケーション名.Form2' に見つかりませんでした。

エラーを解消しつつ、ソリュージョン内でのフォーム内の行き来ができるようになりたいです。お願いします。


特攻隊長まるるう  2008-12-17 23:51:38  No: 145524

> ソリュージョン
→ソリューション
http://homepage1.nifty.com/rucio/main/material/Glossary/G015Solution.htm
http://e-words.jp/w/E382BDE383AAE383A5E383BCE382B7E383A7E383B3.html

それと、シュンさんの開発環境をいちいち覚えてはいないので、新規スレッドでは
開発環境から書き直すようにしてください。
※[VB.NET2003][VB2005][VB2008]。。。バージョンによって実行できる
ことに違いがあります。

> 今回はソリュージョン内でのフォームの行き来がしたいのですが・・・方法がまるでわかりません・・・
初心者掲示板のほうをキーワード『別フォーム』で検索してみてください。
過去、山ほど情報を書き込んできました。

本当は、すべて理解していただきたい内容です(それほど重要な内容を含んでます)が、
最終的にこれかなー。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200712/07120060.txt


シュン  2008-12-18 22:55:06  No: 145525

特攻隊長まるるうさん・・・VB.NET2003を使用しています。試しに検索して調べてみましたが、解決に到るような情報は見つかりませんでした・・・。リンクも参照してみましたが・・・
クラスは習ってないんですね・・・。
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartButton.Click
        Form2.Show()  ←エラーが出る箇所
    End Sub
中略・・・
Public Class Form2
中略
End Class
 Public Class Form3
中略
End Class
と入力しても「非共有メンバを参照するには、オブジェクト参照が必要です」とエラーになります。Public Class Form2,3を削除すると「宣言されてません」とエラーになります。
  また、Form1を最初に開きたいのに実行するとForm2が開いてしまうんですが元の質問内容から反れてしまいますね・・・。
  クラスを習ってないので、どうにもならなければ初心者掲示板で質問する予定です。すいませんでした。


特攻隊長まるるう  2008-12-19 04:15:43  No: 145526

> VB.NET2003を使用しています。
ああ、ダメですね。フォーム名を直接指定するデフォルトインスタンスは
[VB2005]以降じゃないと使えないのですよ。現在、[VB2008]まで出てて、
何も書いてないと[VB2005]レベルで回答してますから、[VB.NET2003]の場合は
必ず開発環境を書いてください。
# 裏を返せば、過去ログの情報やサンプル、Tipsで紹介されている参考ページ
# なども、[VB.NET2003]で使用できるかどうかを判断していかないといけません。

まず、インスタンスの制御を覚えてください。
> 試しに検索して調べてみましたが、解決に到るような情報は見つかりませんでした・・・。
そんなことはありません。ボクを含め回答者は[VB.NET2003]が最新の時代から
回答してます。解決に至る情報もちゃんと書いてあります。
ただし、こちらの掲示板は後から追加されたので過去ログが少ないです。
過去ログ検索する場合は初心者掲示板のほうでしてくださいね?
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200405/04050010.txt
フォーム名を直接指定して命令するのは、紙に書いた電卓の設計図に計算を
させようとするのと同じです。
>        Form2.Show()  ←エラーが出る箇所
        Dim ChildForm As New Form2()
        ChildForm.Show()
New することでインスタンス(実体)がメモリ上に作成され、使用できるようになります。
これは[VB.NET2003]では必須の知識になります。
全てのクラスはインスタンスを生成して使用可能となります。
> 非共有メンバを参照するには、オブジェクト参照が必要です
例外として共有メンバがありますが、省略します。

次に、スタートアップにフォームを指定していると、そのフォームを閉じた時点で
プログラムが終了してしまうことを理解してください。

解決方法の1つとしては、閉じるのをキャンセルして非表示にして制御する。です。
もう1つは Sub Main 起動のプログラムに変更する。です。

Sub Main 起動のプログラムの例を出します。
Sub Main はそこからプログラムをスタートできる特殊な関数です。
で、自分で Sub Main を書きます。
次にプロジェクトのプロパティ画面でスタートアップフォームを
Sub Main に変更してください。これで Sub Main から実行されるように
なります。

Class1.vb を追加して、Class1.vb、Form1.vb、・・・に
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200606/06060011.txt
>2006/06/08(木) 15:42:05
のコードを貼り付けて実行してみてください。


シュン  2008-12-19 21:56:17  No: 145527

?????
特攻隊長まるるうさん・・・
すみません、?を出さなければならないほどわかりません。初心者掲示板のほうで検索したのですが・・・それでもわからないのです。
出されたコードを貼り付けてみると型が定義されていない、とエラーが出て、Form1にすべてのコードを記述するとボタンが機能しないのです。
    Public Event FormChange(ByRef sender As Form, ByVal TargetFormNum As Class1.FormsNum)
    Public Event ExitThread()
のClass1.FormsNumと、
    Private mForms As ArrayList
    Private mClosingCancel As Boolean
    Private Sub New()
        Dim F1 As New Form1 'プログラム起動時に全てのインスタンス生成
        Dim F2 As New Form2
        Dim F3 As New Form3
        'プログラム終了イベント
        AddHandler F1.ExitThread, AddressOf Form_ExitThread
        AddHandler F2.ExitThread, AddressOf Form_ExitThread
        AddHandler F3.ExitThread, AddressOf Form_ExitThread
        '表示フォーム変更イベント
        AddHandler F1.FormChange, AddressOf Form_FormChange
        AddHandler F2.FormChange, AddressOf Form_FormChange
        AddHandler F3.FormChange, AddressOf Form_FormChange
        'Closing イベント
        AddHandler F1.Closing, AddressOf Form_Closing
        AddHandler F2.Closing, AddressOf Form_Closing
        AddHandler F3.Closing, AddressOf Form_Closing
        Me.mForms = New ArrayList(New Form() {F1, F2, F3})

        Me.mClosingCancel = True
        F1.Show()
    End Sub
のForm1,2,3でエラーになります。
  せっかく過去ログのコードも出していただいてアドバイスももらったのに、100%中10%程度しかわかりません。・・・。
  コードは別々のプロジェクト内に記述?1つのプロジェクトに収める?Sub Mainのフォームから別のフォームに飛ぶ記述は?難しい・・・


特攻隊長まるるう  2008-12-19 22:04:59  No: 145528

Form1 と同じプロジェクトに
Class1.vb を追加して、
'/// Class1.vb
Public Class Class1

End Class
のコードを追加してありますか?


特攻隊長まるるう  2008-12-19 22:08:52  No: 145529

Form1 に貼り付けるコードは
'/// Form1.vb
以降のみですよ?


シュン  2008-12-22 22:09:52  No: 145530

特攻隊長まるるうさん・・・
2008/12/19(金) 13:04:59 のレス
  ちゃんと追加しています。しかし、
Public Class Class1
    Inherits ApplicationContext

    Public Shared Sub Main()
        Application.Run(New Class1)
    End Sub

    Private Sub Form_ExitThread()
        Dim i As Integer
        Me.mClosingCancel = False
        '全てのフォームを閉じる
        With Me.mForms
            For i = 0 To .Count - 1
                DirectCast(.Item(i), Form).Close()
                .Item(i) = Nothing
            Next
        End With
        'スレッド終了
        MyBase.ExitThread()
    End Sub

    Private Sub Form_FormChange(ByRef sender As Form, ByVal TargetFormNum As Class1.FormsNum)
        sender.Hide() 'イベントを起こしたフォームを非表示にする
        DirectCast(Me.mForms(TargetFormNum), Form).Show() '移動後のフォームを表示
    End Sub

    Private Sub Form_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
        If mClosingCancel Then
            e.Cancel = True 'フォームが閉じるのをキャンセル
            MessageBox.Show("『終了』ボタンで終了してください。")
        End If
    End Sub

    Public Enum FormsNum
        Form1
        Form2
        Form3
    End Enum

    Private mForms As ArrayList
    Private mClosingCancel As Boolean
    Private Sub New()
        Dim F1 As New Form1 'プログラム起動時に全てのインスタンス生成
        Dim F2 As New Form2
        Dim F3 As New Form3
        'プログラム終了イベント
        AddHandler F1.ExitThread, AddressOf Form_ExitThread
        AddHandler F2.ExitThread, AddressOf Form_ExitThread
        AddHandler F3.ExitThread, AddressOf Form_ExitThread
        '表示フォーム変更イベント
        AddHandler F1.FormChange, AddressOf Form_FormChange
        AddHandler F2.FormChange, AddressOf Form_FormChange
        AddHandler F3.FormChange, AddressOf Form_FormChange
        'Closing イベント
        AddHandler F1.Closing, AddressOf Form_Closing
        AddHandler F2.Closing, AddressOf Form_Closing
        AddHandler F3.Closing, AddressOf Form_Closing
        Me.mForms = New ArrayList(New Form() {F1, F2, F3})

        Me.mClosingCancel = True
        F1.Show()
    End Sub
End Class
において型ApplicationContextやForm、Form1,2,3が宣言されていないエラーと名前Applicationが宣言されてないエラーが出ます。

  2008/12/19(金) 13:08:52 のレス
そのまま追加すると名前空間のステートメントが無効です、とエラーになります。かといって
    Public Event FormChange(ByRef sender As Form, ByVal TargetFormNum As Class1.FormsNum)
    Public Event ExitThread()

Public Class Form1
    Inherits System.Windows.Forms.Form
の後に追加すると型Class1.FormsNumは宣言されていないと言われエラーに・・・。
  さらにビルドを行うと
'Sub Main' が、'ソリューション名.Form1' に見つかりませんでした。
とのエラーに。何故かForm2,3に出てて、Name名がForm2,3にもかかわらずName名がForm1とされています。

  追加したのにもかかわらず宣言されていないということは、フォーム間で行き来はできないと言うことでしょうか?例えばフォーム1から2や3へ、フォーム2から1、フォーム3から1など・・・
  出来るのならどう対処すればいいのでしょうか。


特攻隊長まるるう  2008-12-22 23:18:29  No: 145531

エラーの出るソリューションを丸ごとゴミ箱に捨ててください。

新規プロジェクトで[Windows フォームアプリケーション]を作成してください。
新規プロジェクトを右クリックして[追加]-[新しい項目]-[クラス]を追加してください。(Class1.vb)
新規プロジェクトを右クリックして[追加]-[新しい項目]-[Windows フォーム]を追加してください。(Form2.vb)
新規プロジェクトを右クリックして[追加]-[新しい項目]-[Windows フォーム]を追加してください。(Form3.vb)

Class1.vb のサンプルコードをコピペしてください。
> において型ApplicationContextやForm、Form1,2,3が宣言されていないエラー
まずこの点を解決してください。ApplicationContext の省略しない名前空間は
 System.Windows.Forms.ApplicationContext
となり、[Windows フォームアプリケーション]を選択すればデフォルトで参照設定されて
いますのでエラーになりません。

エラーになる場合は報告してください。


シュン  2008-12-22 23:50:45  No: 145532

特攻隊長まるるうさん・・・
  ありがとうございます。他のVBプログラムを見てそのようにコードを記述してきました。しかし・・・
  エラーはないのですが、Sub Mainで最初に開くフォームのボタンをクリックしても何の反応もありません。クラスの設定が反映されてないようです。しかしClass1.vbにコードはちゃんと記述してあるし、エラーも解消されました。
  何が原因でしょうか?まさかフォームのコードに問題があるのか・・・?


特攻隊長まるるうさん  2008-12-23 00:02:49  No: 145533

プロジェクトのプロパティ画面でスタートアップフォームを
Sub Main に変更してないように思いますが、そこは設定しましたか?

ブレークポイントを Sub Main に設定して、本当に Sub Main が
実行されているかデバッグしてください。


シュン  2008-12-24 21:20:25  No: 145534

特攻隊長まるるうさん・・・
  ブレークポイントを設定した後、開始してみると実行されてないことがわかりました。プロパティで設定するとちゃんと起動できました。
  ありがとうございます。ほんとにお世話になります。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加