0

私は最近、インターフェースと、デフォルト状態での使用を超えてさらにカスタマイズする機能に非常に興味を持っています。

私は IList(of T) を具体的に研究しています。ArrayLists ではなく一般的なリストを使用する利点には、私は驚かされました。ここにテストの写真があります。試験について詳しく解説しているサイトです。

だから、自然と実験したくなりました。ForNext メソッドを使用して最初にリストを反復処理すると、コードは正常に機能します。2回目は、リスト内のフォームが破棄されているため、その名前にアクセスできません。リスト内のフォームのプロパティにアクセスする方法を知っている人は誰でもいます。

Public Class frmMain

    Dim Cabinet As List(Of Form) = New List(Of Form)
    Dim FormA As New Form1
    Dim FormB As New Form2
    Dim FormC As New Form3

    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles _Me.Load

        Cabinet.Add(FormA)
        Cabinet.Add(FormB)
        Cabinet.Add(FormC)

    End Sub



    Sub displayForm(ByVal aForm As Form)

        Dim myFormName As String = ""

        Stopwatch.Start()

        If aForm.IsDisposed = False Then
            aForm.Show()
        Else
            myFormName = aForm.(How do I access this objects Name?) 
            aForm = New Form  '<----- I would rather simply use aForm = New(aForm) 
            aForm.Name = myFormName
            aForm.Show()

        End If

        Stopwatch.Stop()

        Dim RealResult As Decimal = (Stopwatch.ElapsedMilliseconds / 1000)

        Debug.WriteLine(RealResult)

        Stopwatch.Reset()

    End Sub


    Private Sub btnForEach_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForEach.Click

        'Dim instance as List 
        'Dim action as Action(of T) 

        'instance.ForEach(action) 
        'action = delegate to a method that performs an action on the object passeed to it

        Cabinet.ForEach(AddressOf displayForm)
    End Sub

VBがこれが汎用リストであることを知っている場合、つまりリストのタイプを認識でき、オブジェクトがすべてフォームに制限されている理由が本当にわかりません。リスト内の項目でコンストラクターを呼び出せない理由。元。aForm = 新しい aForm または aForm = 新しい Cabinet.aForm

誰か私のためにこれを開けてください。ありがとう。

4

2 に答える 2

2

「aForm」の新しいインスタンスを構築することはできません。これは型ではなく、Form 型のインスタンスであるためです。

ObjectDisposedException を防止したい場合は、フォームを閉じる代わりに非表示にすることができます。各フォーム コード ビハインドに次のコードを配置します。

Public Class Form1

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        Dim form = CType(sender, Form)
        form.Visible = False
        e.Cancel = True
    End Sub

End Class

Elseただし、これは少しハックですが、ブロック内のコードは必要ありません。

編集 代わりにこれを試すことができます:

Private Sub displayForm(ByVal aForm As Form)

    Dim indexOfCab As Integer = Cabinet.IndexOf(aForm)
    If indexOfCab <> -1 Then

        If aForm.IsDisposed Then
            aForm = CreateForm(aForm.GetType())
            Cabinet(indexOfCab) = aForm
        End If

        aForm.Show()
    End If

End Sub

Private Shared Function CreateForm(formType As Type) As Form
    Return CType(Activator.CreateInstance(formType), Form)
End Function

Selectそんな大げさな発言はいらない。

于 2012-08-26T19:27:34.257 に答える
0

これが私がそれを機能させることができた唯一の方法です。しかし、それは非常に非効率的だと感じています。誰かがこれを行うためのより良い方法への道を歩んでくれることを願っています. 以下は私が達成しようとしているものです。

サブdisplayForm(ByVal aForm As Form)

   Dim myFormName As String = ""

   If Cabinet.Contains(aForm) Then

       Dim indexOfCab As Integer = Cabinet.IndexOf(aForm)
       Dim ObjForm As Form = Cabinet.Item(indexOfCab)

       If aForm.IsDisposed Then

           Select Case indexOfCab

               Case 0
                   aForm = Nothing
                   aForm = New Form1
                   Cabinet.Item(indexOfCab) = aForm
                   Cabinet.Item(indexOfCab).Show()
               Case 1
                   aForm = Nothing
                   aForm = New Form2
                   Cabinet.Item(indexOfCab) = aForm
                   aForm.Show()
               Case 2
                   aForm = Nothing
                   aForm = New Form3
                   Cabinet.Item(indexOfCab) = aForm
                   Cabinet.Item(indexOfCab).Show()
           End Select

       Else
           Cabinet.Item(indexOfCab).Show()
       End If

   End If

サブ終了

于 2012-08-26T22:45:29.797 に答える