- ベストアンサー
VB.NET 画面遷移
VB.NET2005にて開発してます。 画面遷移で困ってます。 親画面にボタンが複数ありボタンから各子画面へ遷移するのは問題ないのですが、 子画面同士で画面遷移させたい場合オーナーという概念がないため遷移前画面の操作が出来ません。 publicで子画面FORMを宣言するなどすれば良いのでしょうか? それ良いならその方法を教えてください。 違うならその他方法を教えてください。 VB.NETは全くの初心者なので分かりやすくお願い申し上げます。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
ChangeFormの2番目の引数 oFormを oForm.Show()としてますが これを oForm.Hide() としてください 当方の 投稿時の勘違いです … m(__)m Imports System.Windows.Forms.Form Module Module1 Public Sub ChangeForms(ByVal toForm As System.Windows.Forms.Form, ByVal oForm As System.Windows.Forms.Form) oForm.Hide() ' ここをHideに変更 Select Case toForm.Name Case "Child1", "Child2", "MainForm" toForm.Show() Case Else MsgBox(toForm.Name & "が見つかりません") oForm.Show() End Select End Sub End Module
その他の回答 (7)
- redfox63
- ベストアンサー率71% (1325/1856)
Public Sub ChangeForms(ByVal toForm As System.Windows.Forms.Form, ByVal oForm As System.Windows.Forms.From) の引数 oFormの型が間違っているのかも System.Windows.Forms.Form としてみましょう Form(フロム)では無くForm(フォーム)
お礼
回答ありがとうございます。 こんな単純な間違いに気付けず情けないです・・・ 実行しましたがShow()だけしかないので裏では画面がSHOWされてますね。 ×で画面を消すと他の画面が裏にありました。 全てで36画面ほどあるのですがこれだと全て裏でSHOWされてしまうと重たいくなりそうです。 HIDE(),CLOSE()などは必要ないのでしょうか? 試しに最初のoForm.Show()をHide()にしてみたところ一瞬デスクトップ画面が現れてしまいます。 Close()だとメイン画面が閉じて他の画面が表示されません。 何か方法ありませんか?
- redfox63
- ベストアンサー率71% (1325/1856)
Module1はソリューションの下にあるんですが・・・ ソリューションってことはプロジェクトと同じレベルってことでしょうか プロジェクトの配下にしてみてください
お礼
回答ありがとうございます。 間違いました。 プロジェクトの下です。
補足
FORMと同じ位置です。
- redfox63
- ベストアンサー率71% (1325/1856)
> error BC30002: 型 'System.Windows.Forms.From' が定義されていません は 参照設定がされていないためでしょう コードの冒頭で Imports Sysytem.Windows.Forms.Form と記述しましょう
お礼
下記のように記述しましたが相変わらず同じエラーです。 ほかに何か考えられますでしょうか。 Module1はソリューションの下にあるんですが・・・ よろしくお願いします。 Imports System.Windows.Forms.Form Module Module1 Public Sub ChangeForms(ByVal toForm As System.Windows.Forms.Form, ByVal oForm As System.Windows.Forms.From) oForm.Show() Select Case toForm.Name Case "Child1", "Child2", "MainForm" toForm.Show() Case Else MsgBox(toForm.Name & "が見つかりません") oForm.Show() End Select End Sub End Module
- redfox63
- ベストアンサー率71% (1325/1856)
ソリューション > 追加 > 新しい項目 > モジュール で実行してみましょう VB.NETはSubプロシージャやFunctionは ModuleまたはClassに属していないといけません 『コードファイル』で起こすと何も無いテンプレートが使われますのでご質問のような現象に見舞われます コードファイルで行った場合は ファイルの冒頭で Class クラス名[Enter] または Module モジュール名[Enter]などを実行しましょう またこのようにして作成した場合 Classで行うなら dim cls as new クラス名 cls.ChangeForm( 相手のフォーム, me ) といった具合にクラスの場合はインスタンスが必要になります モジュールの場合は Module1.ChangeForm( 相手のフォーム, me ) といった具合で Module1のインスタンス化は必要ありません
お礼
分かり易い説明ありがとうございます。 モジュールでChangeFormsを記述しビルド行いましたが、 「error BC30002: 型 'System.Windows.Forms.From' が定義されていません。」 になります。 特に波線にはなりませんが、ビルトするとエラーです。 ボタンクリックイベントで Module1.ChangeForm( 相手のフォーム, me ) をお互いのFORMに記述してあります。 エラーの回避方法教えてください。 よろしくお願いします。
- redfox63
- ベストアンサー率71% (1325/1856)
MainFromやModuleに切り替えようのPublicメソッドを準備してはいかがでしょう MainFormやChild1などフォームのインスタンスは My.Formsに存在するのでそのまま クラス名がインスタンスとして機能します Public Sub ChangeForms( toForm as System.Windows.Forms.Form, oForm as System.Windows.Forms.From) oForm.Show() Select Case toForm.Name case "Child1", "Child2","MainForm" toForm.Show() case else MsgBox toForm.Name & "が見つかりません" oForm.Show() End Select End Sub などを用意して 切り替えボタンのClickイベントで MainForm.ChangeForm( Child1, me ) MainForm.ChangeForm( Child3, me ) MainForm.ChangeForm( MainForm, me ) などとしてみてはいかがでしょう ・・・
お礼
回答、誠にありがとうございます。 ChangeForms関数を ソリューション⇒追加⇒新しい項目⇒コードファイル に記述しましたが 「空間名前のステートメントが無効です」 となります。 Publicメソッドはどこに記述すればよいのでしょうか? 本当に初歩的な質問で申し訳ありません。
- redfox63
- ベストアンサー率71% (1325/1856)
CompactFreamework だと OpenFormsは使えませんね CompactFrameworkならば MainForm->Child1の場合 Me.Hide() Child1.Owner = Me Child1.Show() Child1->Child2 Me.Hide() Child2.Owner = Me Child2.Show() Child2->Child1 Me.Hide() Owner.Visible = true Child1->MainForm Me.Hide() Owner.Visible = true といった具合でよさそうです
お礼
回答ありがとうございます。 Child画面にMainFormに戻るボタンがあるので Child画面同士に親子関係があるとおかしくなります。 例えば、 Child1⇒Child2 Child2⇒MainForm となると親でない画面に遷移するのでおかしくなります。 Child1⇒Child2のあと必ずChild2⇒Child1なら単純ですが、 さらにChild3なども現れたら管理しきれません。 この様な場合どうすればいいのでしょうか。 親子関係なしに画面遷移する方法などありませんか? ご教授お願い申し上げます。
補足
HIDE()も試してみましたがうまく行きませんでした。 何度か遷移しているとHIDE()したままになってwindowsのデスクトップが現れたりします・・・ 全てで36画面ほどありClose()せずにすべてHIDE()になるのも現実的でないと思いましたが普通はどのような感じでしょうか?
- redfox63
- ベストアンサー率71% (1325/1856)
子画面同士でもオーナは設定できますよ Showメソッドの引数に Meを与えてやれば良いです MainForm, Child1, Child2がある場合 MainForm -> Child1は Me.Hide() If Application.OpenForms("Child1") is Nothing then Child1.Show( me ) Else Application.OpenForms("Child1").visible = true end if 同様にChild1->Child2の場合 Me.Hide() If Application.OpenForms("Child2") is Nothing then Child2.Show( me ) Else Application.OpenForms("Child2").visible = true end if Child2->Child1へ戻るとき Me.hide() Owner.Visible = true Child1->MainFormへ戻るとき Me.hide() Owner.Visible = true といった具合で ・・・
お礼
早速の回答ありがとうございます。 記述してみたところ「OpenFormsがApplicationのメンバではありません」とエラーが出ます。 記載不足でしたがWindowsMoblie5.0の開発です。 .netConpactFreamwork2.0はインストールしてありますが問題ありますか? よろしくお願いします。
お礼
下記の様に記述しました。 エミュレータではモッサリ感がありましたが実機では問題なさそうです。 色々指導ありがとうございます。 助かりました。 Module Module1 Public Sub ChangeForms(ByVal toForm As System.Windows.Forms.Form, ByVal oForm As System.Windows.Forms.Form) Select Case toForm.Name Case "Child1", "Child2", "MainForm" toForm.Show() oForm.Hide() ' ここをHideに変更 Case Else MsgBox(toForm.Name & "が見つかりません") oForm.Show() End Select End Sub End Module