ok, Danke erstmal
Ich habe das Problem gelöst, indem ich jetzt lediglich das Handle des Fensters, als string übergebe,
weil ich auch nur das zur prüfung benötige (Prüfung, ob das Event im Formular ausgeführt wird, wo es abgearbeitet werden soll.)
Jetzt geht es aber genau so weiter.
Ok, << Üblicherweise gibt's nur einen Thread mit Controls
Ja,
Jetzt wollte ich aber meine Fenster bereits im Vorfeld initialisieren, um die Wartezeit für den User zu verkürzen. (bis zu 5 Sekunden)
Desshalb habe ich mir eine Klasse gebastelt, die das macht, aber eben über nen Thread.
Die Instanzen werden dort in eine ArrayList geschrieben und beim Anzeigen, gelöscht und neu initialisiert.
Hier die FunktionenPublic Class co_Fensterverwaltung
Public Function FensterOeffnen(ByVal Fenstername As String) As Object
Dim RueckgabeForm As Object = Nothing
'Prüfung, ob gerade ein Fenster über diese Funktion geöffnet wird.
'Global Shared
If cup_System.cls_System_Global.FensterArrayListeIsBussi = True Then
MsgBox("Das Fenster kann momentan nicht geöffnet werden." & _
"Wiederholen Sie den Vorgang nochmals", MsgBoxStyle.OkOnly, _
cup_System.cls_System_Global.Anwendungstitel)
Return Nothing
Exit Function
End If
cup_System.cls_System_Global.FensterArrayListeIsBussi = True
Try
For i As Integer = 0 To _
cup_System.cls_System_Global.FensterArrayListe.Count - 1
If cup_System.cls_System_Global.FensterArrayListe.Item(i).name _
= Fenstername Then
RueckgabeForm = _
cup_System.cls_System_Global.FensterArrayListe.Item(i)
cup_System.cls_System_Global.FensterArrayListe.RemoveAt(i)
Exit For
End If
Next
System.Windows.Forms.Application.DoEvents()
Dim ts As New ThreadRun(Fenstername)
ts.run()
Catch ex As Exception
If IsNothing(cup_System.cls_System_Global.PersonalID) Then
Me.Co_SystemComponent1.ErrorMail("co_Fensterverwaltung", "Nicht" & _
"vorhanden", New StackFrame().GetMethod().Name, ex, "", _
False, False, False, True)
Else
Me.Co_SystemComponent1.ErrorMail("co_Fensterverwaltung", _
cup_System.cls_System_Global.PersonalID.ToString, New _
StackFrame().GetMethod().Name, ex, "", False, False, False, _
True)
End If
End Try
Return RueckgabeForm
End Function
End Class
---------------------------
Public Class ThreadRun
Private Fenstername1 As String
Public Sub New(ByVal Fenstername As String)
Me.Fenstername1 = Fenstername
End Sub
Delegate Sub FensterAnlegenDelegate()
Private Sub FensterAnlegen()
Try
Select Case Fenstername1
Case "frmAufgabeAendern"
Dim frm1 As New cup_ModulNachrichten.frmAufgabeAendern
frm1.Opacity = 0
frm1.Show()
frm1.Hide()
frm1.Opacity = 100
cup_System.cls_System_Global.FensterArrayListe.Add(frm1)
Case "frmNeueAufgabe"
Dim frm2 As New cup_ModulNachrichten.frmNeueAufgabe
frm2.Opacity = 0
frm2.Show()
frm2.Hide()
frm2.Opacity = 100
cup_System.cls_System_Global.FensterArrayListe.Add(frm2)
Case Else
'Do nothing
End Select
cup_System.cls_System_Global.FensterArrayListeIsBussi = False
Catch ex As Exception
Debug.WriteLine("_")
End Try
End Sub
Public Sub run()
Dim Thread As New Threading.Thread(AddressOf FensterAnlegen)
Thread.Start()
End Sub
End ClassMit dim Co_Fensterverwaltung1 as New cup_co_Spezial.co_Fensterverwaltung
sub x...
Dim frm As frmAufgabeAendern
frm = Me.Co_Fensterverwaltung1.FensterOeffnen( _
"frmAufgabeAendern")
end sub
------
'Namespace in cup_System
Public Class cls_System_Global
'Über diese Arrayliste werden die Fenster vorgeladen, damit diese schneller
' dargestellt werden können.
Public Shared FensterArrayListe As New ArrayList
Public Shared FensterArrayListeIsBussi As Boolean = False
end class über frm kann ich dann auf das Fenster zugreifen. Das funktioniert auch.
Wenn ich jetzt aber frm.show() ausführe bekomme ich die Fehlermeldung, dass der Objektverweis nicht stimmt.
OK, das hatte ich ja auch schon ein paar mal, aber ich finde die Lösung einfach nicht.
hast Du mir vielleicht noch einen Tipp, oder Rat? |