Formular aus Thread anzeigen

MikeBi

Mitglied
Hallo,

ich habe das Problem, das ich versuche ein Info-Fenter (Formular) aus einem Thread anzuzeigen. Leider wird das Formular nicht vollständig angezeigt. Es wird nur der Hintergund rausgemalt und alle Stellen wo Controls angezeigt werden sollten sind durchsichtig. Wenn ich mit Refresh das rausmalen der Controls erzwinge wird zwar alles angezeigt, aber wenn ich das Formular schließe stürzt die Anwendung ab. Ich habe bis jetzt nicht rausbekommen, was den Absturz verursacht. Außerdem wird die ganze Zeit die Sanduhr angezeigt, wenn ich die Maus über dem Formular bewege. Das sieht für mich so aus, als ob die Erzeugung des Fromulars mittendrin abgebrochen wurde.
Wenn ich das Formular über z.B. einen Maus-Click anzeige, funktioniert alles. Ich habe es schon mit Invoke, BeginIvoke und einer weiteren Klasse um das Formular versucht . Auch ein erzeugen eines weiteren Threads hat nicht gebracht. Ein Bild kann ich leider nicht liefern, weil mit der Druck -Taste nur eine weißes Formular angezeigt wird.
Hat vielleicht irgendjemand eine Idee dazu, was ich falsch mache und/ oder wie ich es richtig mache.

Mike
 
Hallo,

wird das Formular auch im Thread erzeugt? Wenn ja wäre es besser, das Formular im GUI-Thread zu erzeugen und von dem anderen Thread aus nur die Sichtbarkeit zu steuern und ggf. Control-Eigenschaften zu modifizieren (alles via Invoke).

Gruß
MCoder
 
Kanns sein das du in .Net 1.0 programmierst?
Sonst sollte Framework eigentlich schon von alleine meckern, da Formulare eigentlich nur im GUI Thread angezeigt werden können :confused:

Ansonsten Code.
 
Nein, ich arbeite mit .Net 2.0 . Das Info-Fenser soll eine unbestimmte Anzahl gleichzeitig angezeigt werden. Daher kann ich nicht das Fenster schon vorher erzeugen. Ich habe jetzt herausgefunden, das es an dem Formular (thread) hängt mit dem ich es erzeugen will. So lange das das MDI-Fenster ein aktives Fenster hat und ich das erzeugen des Formulares damit Invoke klappt es. Nur komischer weise gibt es kein aktives Formular, wenn die Anwendung nicht die aktive Anwendung ist.
Wenn ich dann versuche mit dem MDI-Form zu Invoken get es schief. Ohne Invoke in diesem Fall auch. Ich habe keine Ahnung mit welchem GUI ich in disem Fall Invoken soll.
Hier mal noch der entsprechende Code.

Code:
    Delegate Sub Show_InfoMessage_Invoke(ByVal MsgId As Integer, ByVal extInfo As Object, ByVal ShowTime As Integer)

    Public Sub Show_InfoMessage(ByVal MsgId As Integer, ByVal extInfo As Object, ByVal ShowTime As Integer)
        Try
            If (Main.ActiveMdiChild IsNot Nothing) AndAlso (Main.ActiveMdiChild.InvokeRequired) Then
'alles OK
                Main.ActiveMdiChild.BeginInvoke(New Show_InfoMessage_Invoke(AddressOf Show_InfoMessage_I), New Object() {MsgId, extInfo, ShowTime})
            ElseIf (Form.ActiveForm IsNot Nothing) AndAlso (Form.ActiveForm.InvokeRequired) Then
'auch OK
                Form.ActiveForm.BeginInvoke(New Show_InfoMessage_Invoke(AddressOf Show_InfoMessage_I), New Object() {MsgId, extInfo, ShowTime})
            Else
'hier gibt es dann die Probleme
                Show_InfoMessage_I(MsgId, extInfo, ShowTime)
            End If

        Catch ex As Exception
            Show_ErrorMessage(MsgOffset + 2, ex, ClassName)
        End Try
    End Sub


Vielleicht hat noch jemand eine Idee, was ich testen könnte.

Danke.

Mike
 
Du könntest dir selbst ein steuerelement halten und das als Invoke nutzen.
Oder Reflector mal durch den BackgroundWorker dort wird im Konstruktor (glaube) ein spezielles Objekt erzeugt welches weiter gereicht wird.
Komme jetzt nicht auf den Namen und hab kein Reflector hier drauf (und irgendwie vergess ich den Namen immer wieder ^^).

Hoffe konnte bissel helfen.
 
Zurück