新しいフォームを作るには

解決


yokuwakaranai  2008-11-26 12:51:10  No: 145449  IP: 192.*.*.*

新しいフォームを作るには

Microsoft Visual Basic 2008 Express Edition
OS XP Personal sp3

を使ってるのですが
Form1からForm2を50こつくって表示させたいのですが
うまくいきません



Public Class Form1
    Dim Form2_test() As Form2 = New Form2(50) {}

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form2_test(1).Show()
    End Sub
End Class

編集 削除
YuO  2008-11-26 12:57:27  No: 145450  IP: 192.*.*.*

> うまくいきません

それがどうかしたのでしょうか。
現状を嘆いているのはわかるのですが……。
# 「うまくいきません」は質問をしているわけではないですし。


とりあえず,
> Form1からForm2を50こつくって表示させたいのですが
>     Dim Form2_test() As Form2 = New Form2(50) {}
これでは,配列だけつくって,Form2のオブジェクトは用意していないですよね。

編集 削除
yokuwakaranai  2008-11-26 13:35:11  No: 145451  IP: 192.*.*.*

早速の返事ありがとうございます

うまくいかないのはButton1_Click  したときに

Form2が表示されず


System.IndexOutOfRangeException はハンドルされませんでした。
  Message="インデックスが配列の境界外です。"
  Source="WindowsApplication1"
  StackTrace:’’’’’’’’’’’’’’’’
と  エラーが出ます

もちろんForm2は事前に用意してあります


VB6 では    Dim Form2_test() as New Form2(50) 
の宣言ですんだのですが

編集 削除
YuO  2008-11-26 16:03:42  No: 145452  IP: 192.*.*.*

IndexOutOfRangeExceptionですか?
であれば,インデックスが配列の範囲外を指定したのでしょう。

デバッグ実行していればIDE上で例外が起きた場所でブレイクしているはずです。
# 外部でCatchしていたりする場合を除く
そのときの配列のLengthと引数の値を比べてみて下さい。
配列aがあったとき,インデックスiは
0 <= i AndAlso i < a.Length
を満たす必要があります。

編集 削除
shazbot  2008-11-26 16:59:27  No: 145453  IP: 192.*.*.*

真意はわかりかねますが、こういうことがしたいのでしょうか?

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer
        Dim f As Form2

        For i = 1 To 50
            f = New Form2
            f.Show()
        Next

    End Sub

編集 削除
我龍院  2008-11-26 18:43:30  No: 145454  IP: 192.*.*.*

サンプルコードとエラーが出てるコードが違うので、
もう一度そのエラーの出てるコードを掲示して下さい。
それと参照型を要素とする配列に関してはVB6のことは
すっかり忘れて下さい。

編集 削除
yokuwakaranai  2008-11-26 21:14:06  No: 145455  IP: 192.*.*.*

すいません
えらーが違いました
上のまま  うごかしたら
下のようなエラーが出ました


上のエラーは

    Dim Form2_test() As Form2 = New Form2(50) {}
ではなく
    Dim Form2_test() As Form2 = New Form2() {}
の結果でした
すいません



System.NullReferenceException はハンドルされませんでした。
  Message="オブジェクト参照がオブジェクト インスタンスに設定されていません。"
  Source="WindowsApplication1"
  StackTrace:
       場所 WindowsApplication1.Form1.Button1_Click(Object sender, EventArgs e) 場所 C:\Documents and Settings\ksc\Local Settings\Application Data\Temporary Projects\WindowsApplication1\Form1.vb:行 9
       場所 System.Windows.Forms.Control.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       場所 System.Windows.Forms.Control.WndProc(Message& m)
       場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       場所 System.Windows.Forms.Button.WndProc(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       場所 System.Windows.Forms.Application.Run(ApplicationContext context)
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       場所 WindowsApplication1.My.MyApplication.Main(String[] Args) 場所 17d14f5c-a337-4978-8281-53493378c1071.vb:行 81
       場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       場所 System.Threading.ThreadHelper.ThreadStart()
  InnerException:

編集 削除
YuO  2008-11-26 22:28:17  No: 145456  IP: 192.*.*.*

NullReferenceExceptionだと,最初の私の予想があたりですね。

>>     Dim Form2_test() As Form2 = New Form2(50) {}
>これでは,配列だけつくって,Form2のオブジェクトは用意していないですよね。

というわけで,Form2のインスタンスをちゃんと用意してあげてください。

編集 削除
yokuwakaranai  2008-11-26 23:14:59  No: 145457  IP: 192.*.*.*

皆さんありがとうございました
下の方法で解決いたしました




Public Class Form1


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim i As Integer
        Dim f(25) As Form2

        For i = 1 To 25
            f(i) = New Form2
            f(i).Show()
        Next

    End Sub


End Class

編集 削除