こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VB.NET 画面遷移

VB.NET2005にて開発してます。
画面遷移で困ってます。

親画面にボタンが複数ありボタンから各子画面へ遷移するのは問題ないのですが、
子画面同士で画面遷移させたい場合オーナーという概念がないため遷移前画面の操作が出来ません。
publicで子画面FORMを宣言するなどすれば良いのでしょうか?

それ良いならその方法を教えてください。
違うならその他方法を教えてください。

VB.NETは全くの初心者なので分かりやすくお願い申し上げます。

投稿日時 - 2008-10-27 17:35:16

QNo.4434127

すぐに回答ほしいです

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

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

投稿日時 - 2008-10-31 08:50:03

お礼

下記の様に記述しました。
エミュレータではモッサリ感がありましたが実機では問題なさそうです。
色々指導ありがとうございます。
助かりました。

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

投稿日時 - 2008-11-02 14:25:49

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

Public Sub ChangeForms(ByVal toForm As System.Windows.Forms.Form, ByVal oForm As System.Windows.Forms.From)
の引数 oFormの型が間違っているのかも
System.Windows.Forms.Form としてみましょう
Form(フロム)では無くForm(フォーム)

投稿日時 - 2008-10-30 16:22:45

お礼

回答ありがとうございます。
こんな単純な間違いに気付けず情けないです・・・

実行しましたがShow()だけしかないので裏では画面がSHOWされてますね。
×で画面を消すと他の画面が裏にありました。
全てで36画面ほどあるのですがこれだと全て裏でSHOWされてしまうと重たいくなりそうです。
HIDE(),CLOSE()などは必要ないのでしょうか?
試しに最初のoForm.Show()をHide()にしてみたところ一瞬デスクトップ画面が現れてしまいます。
Close()だとメイン画面が閉じて他の画面が表示されません。

何か方法ありませんか?

投稿日時 - 2008-10-31 00:21:36

ANo.6

Module1はソリューションの下にあるんですが・・・

ソリューションってことはプロジェクトと同じレベルってことでしょうか
プロジェクトの配下にしてみてください

投稿日時 - 2008-10-29 18:51:09

補足

FORMと同じ位置です。

投稿日時 - 2008-10-30 15:43:44

お礼

回答ありがとうございます。

間違いました。
プロジェクトの下です。

投稿日時 - 2008-10-30 15:43:18

ANo.5

> error BC30002: 型 'System.Windows.Forms.From' が定義されていません
は 参照設定がされていないためでしょう

コードの冒頭で
Imports Sysytem.Windows.Forms.Form
と記述しましょう

投稿日時 - 2008-10-29 15:27:23

お礼

下記のように記述しましたが相変わらず同じエラーです。
ほかに何か考えられますでしょうか。
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

投稿日時 - 2008-10-29 18:19:27

ANo.4

ソリューション > 追加 > 新しい項目 > モジュール
で実行してみましょう

VB.NETはSubプロシージャやFunctionは ModuleまたはClassに属していないといけません
『コードファイル』で起こすと何も無いテンプレートが使われますのでご質問のような現象に見舞われます

コードファイルで行った場合は ファイルの冒頭で
Class クラス名[Enter] または Module モジュール名[Enter]などを実行しましょう

またこのようにして作成した場合 Classで行うなら
dim cls as new クラス名
cls.ChangeForm( 相手のフォーム, me )
といった具合にクラスの場合はインスタンスが必要になります

モジュールの場合は
Module1.ChangeForm( 相手のフォーム, me )
といった具合で Module1のインスタンス化は必要ありません

投稿日時 - 2008-10-28 23:53:29

お礼

分かり易い説明ありがとうございます。

モジュールでChangeFormsを記述しビルド行いましたが、
「error BC30002: 型 'System.Windows.Forms.From' が定義されていません。」
になります。
特に波線にはなりませんが、ビルトするとエラーです。

ボタンクリックイベントで
Module1.ChangeForm( 相手のフォーム, me )
をお互いのFORMに記述してあります。

エラーの回避方法教えてください。
よろしくお願いします。

投稿日時 - 2008-10-29 13:00:04

ANo.3

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 )
などとしてみてはいかがでしょう ・・・

投稿日時 - 2008-10-27 21:34:16

お礼

回答、誠にありがとうございます。

ChangeForms関数を
ソリューション⇒追加⇒新しい項目⇒コードファイル
に記述しましたが
「空間名前のステートメントが無効です」
となります。
Publicメソッドはどこに記述すればよいのでしょうか?
本当に初歩的な質問で申し訳ありません。

投稿日時 - 2008-10-28 21:58:28

ANo.2

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
といった具合でよさそうです

投稿日時 - 2008-10-27 19:46:06

補足

HIDE()も試してみましたがうまく行きませんでした。
何度か遷移しているとHIDE()したままになってwindowsのデスクトップが現れたりします・・・
全てで36画面ほどありClose()せずにすべてHIDE()になるのも現実的でないと思いましたが普通はどのような感じでしょうか?

投稿日時 - 2008-10-28 22:16:47

お礼

回答ありがとうございます。

Child画面にMainFormに戻るボタンがあるので
Child画面同士に親子関係があるとおかしくなります。

例えば、
Child1⇒Child2
Child2⇒MainForm
となると親でない画面に遷移するのでおかしくなります。

Child1⇒Child2のあと必ずChild2⇒Child1なら単純ですが、
さらにChild3なども現れたら管理しきれません。

この様な場合どうすればいいのでしょうか。
親子関係なしに画面遷移する方法などありませんか?
ご教授お願い申し上げます。

投稿日時 - 2008-10-27 20:11:46

ANo.1

子画面同士でもオーナは設定できますよ

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

といった具合で ・・・

投稿日時 - 2008-10-27 17:49:14

お礼

早速の回答ありがとうございます。

記述してみたところ「OpenFormsがApplicationのメンバではありません」とエラーが出ます。

記載不足でしたがWindowsMoblie5.0の開発です。
.netConpactFreamwork2.0はインストールしてありますが問題ありますか?

よろしくお願いします。

投稿日時 - 2008-10-27 18:52:11

あなたにオススメの質問