今回はソリュージョン内でのフォームの行き来がしたいのですが・・・方法がまるでわかりません・・・
画面はこのようになっています。(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' に見つかりませんでした。
エラーを解消しつつ、ソリュージョン内でのフォーム内の行き来ができるようになりたいです。お願いします。
> ソリュージョン
→ソリューション
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
特攻隊長まるるうさん・・・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が開いてしまうんですが元の質問内容から反れてしまいますね・・・。
クラスを習ってないので、どうにもならなければ初心者掲示板で質問する予定です。すいませんでした。
> 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
のコードを貼り付けて実行してみてください。
?????
特攻隊長まるるうさん・・・
すみません、?を出さなければならないほどわかりません。初心者掲示板のほうで検索したのですが・・・それでもわからないのです。
出されたコードを貼り付けてみると型が定義されていない、とエラーが出て、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のフォームから別のフォームに飛ぶ記述は?難しい・・・
Form1 と同じプロジェクトに
Class1.vb を追加して、
'/// Class1.vb
Public Class Class1
〜
End Class
のコードを追加してありますか?
Form1 に貼り付けるコードは
'/// Form1.vb
以降のみですよ?
特攻隊長まるるうさん・・・
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など・・・
出来るのならどう対処すればいいのでしょうか。
エラーの出るソリューションを丸ごとゴミ箱に捨ててください。
新規プロジェクトで[Windows フォームアプリケーション]を作成してください。
新規プロジェクトを右クリックして[追加]-[新しい項目]-[クラス]を追加してください。(Class1.vb)
新規プロジェクトを右クリックして[追加]-[新しい項目]-[Windows フォーム]を追加してください。(Form2.vb)
新規プロジェクトを右クリックして[追加]-[新しい項目]-[Windows フォーム]を追加してください。(Form3.vb)
Class1.vb のサンプルコードをコピペしてください。
> において型ApplicationContextやForm、Form1,2,3が宣言されていないエラー
まずこの点を解決してください。ApplicationContext の省略しない名前空間は
System.Windows.Forms.ApplicationContext
となり、[Windows フォームアプリケーション]を選択すればデフォルトで参照設定されて
いますのでエラーになりません。
エラーになる場合は報告してください。
特攻隊長まるるうさん・・・
ありがとうございます。他のVBプログラムを見てそのようにコードを記述してきました。しかし・・・
エラーはないのですが、Sub Mainで最初に開くフォームのボタンをクリックしても何の反応もありません。クラスの設定が反映されてないようです。しかしClass1.vbにコードはちゃんと記述してあるし、エラーも解消されました。
何が原因でしょうか?まさかフォームのコードに問題があるのか・・・?
プロジェクトのプロパティ画面でスタートアップフォームを
Sub Main に変更してないように思いますが、そこは設定しましたか?
ブレークポイントを Sub Main に設定して、本当に Sub Main が
実行されているかデバッグしてください。
特攻隊長まるるうさん・・・
ブレークポイントを設定した後、開始してみると実行されてないことがわかりました。プロパティで設定するとちゃんと起動できました。
ありがとうございます。ほんとにお世話になります。
ツイート | ![]() |