Guten Morgen,
programme mir zur Zeit ein kleines Hilfsprogramm mit Sprachausgabe.
Nun möchte ich in einer Sub auf das Ende der Sprachausgabe warten.
Die Lösung mit DoEvents gefällt mir nicht wirklich:
wie könnte man das anders lösen?
Habe gerade festgestellt, dass bei Schliessen der Form mit me.close
auf der Startform (also andere Form) folgender Fehler produziert wird:
Ein Ausnahmefehler des Typs "System.ObjectDisposedException" ist in System.Windows.Forms.dll aufgetreten.
Zusätzliche Informationen: Auf das verworfene Objekt kann nicht zugegriffen werden.
Vielleicht stelle ich mal den kompletten Code zur Verfügung
Spoiler anzeigen
programme mir zur Zeit ein kleines Hilfsprogramm mit Sprachausgabe.
Nun möchte ich in einer Sub auf das Ende der Sprachausgabe warten.
Die Lösung mit DoEvents gefällt mir nicht wirklich:
VB.NET-Quellcode
- With Sprachausgabe
- .Gestartet = True
- .Sprachtext = "Hallo " & Anwender.Vorname & " ich bin das Hilfsprogramm, gleich geht es los. Beendet werde ich mit der f 1 taste"
- .Sprachgeschwindigkeit = Me.Sprachtempo
- .Vorlesen()
- End With
- Me.Timer_Pruefung.Enabled = True
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- Private Sub Timer_Pruefung_Tick(sender As Object, e As EventArgs) Handles Timer_Pruefung.Tick
- If Sprachausgabe.Gestartet = False Then Exit Sub
- If Not Me.currentlyAnimating Then Me.Animation_Starten()
- If Sprachausgabe.IsWorking = False Then
- Me.Timer_Pruefung.Enabled = False
- Sprachausgabe.Gestartet = False
- End If
- End Sub
wie könnte man das anders lösen?
Habe gerade festgestellt, dass bei Schliessen der Form mit me.close
auf der Startform (also andere Form) folgender Fehler produziert wird:
Ein Ausnahmefehler des Typs "System.ObjectDisposedException" ist in System.Windows.Forms.dll aufgetreten.
Zusätzliche Informationen: Auf das verworfene Objekt kann nicht zugegriffen werden.
Vielleicht stelle ich mal den kompletten Code zur Verfügung
VB.NET-Quellcode
- Public Class Misterdos
- Declare Sub mouse_event Lib "user32.dll" (ByVal dwFlags As UInt32, ByVal dx As UInt32, ByVal dy As UInt32, ByVal dwData As UInt32, ByVal dwExtraInfo As IntPtr)
- Public Modus As String
- Private animatedImage As New Bitmap(Pfade.Diverse.Pfad & "Misterdos.gif")
- Private currentlyAnimating As Boolean = False
- Private Sprachtempo As Integer
- Private Taste_F1 As MBC_Diverse.Hotkey
- Private I As Integer
- Private PosOben As Integer
- Private PlusOben As Integer
- Private PosLinks As Integer
- Private TS_DDButton As ToolStripDropDownButton
- Private TS_ToolstripLabel As ToolStripLabel
- Private Sub Misterdos_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
- Me.Timer_Pruefung.Enabled = False
- Me.Animation_Beenden()
- Me.Modus = Nothing
- Sprachausgabe.Stopp()
- End Sub
- Private Sub Misterdos_Load(sender As Object, e As EventArgs) Handles Me.Load
- Me.Visible = False
- Me.Opacity = 0
- Me.Visible = True
- Monitor.Form_Initalisieren(Me)
- Me.KeyPreview = True
- Me.BackColor = Color.White
- Me.TransparencyKey = Color.White
- Me.PlusOben = 22
- Me.Taste_F1 = New MBC_Diverse.Hotkey
- Me.Taste_F1.TryRegister(Keys.F1)
- AddHandler Taste_F1.Pressed, AddressOf Me.Beendetaste
- Me.Timer_Pruefung.Enabled = False
- Me.Opacity = 1
- Me.BringToFront()
- Me.TopMost = True
- Me.Animation_Starten()
- With Sprachausgabe
- .Gestartet = True
- .Sprachtext = "Hallo " & Anwender.Vorname & " ich bin das Hilfsprogramm, gleich geht es los. Beendet werde ich mit der f 1 taste"
- .Sprachgeschwindigkeit = Me.Sprachtempo
- .Vorlesen()
- End With
- Me.Timer_Pruefung.Enabled = True
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- If Me.Modus = "A" Then Me.Part_Startmenue()
- End Sub
- Private Sub Beenden()
- With Sprachausgabe
- .Gestartet = True
- .Sprachtext = "Ich hoffe es hat dir gefallen. tschüss"
- .Sprachgeschwindigkeit = Me.Sprachtempo
- .Vorlesen()
- End With
- Me.Timer_Pruefung.Enabled = True
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- Me.Close()
- End Sub
- Private Sub Beendetaste(sender As Object, e As EventArgs)
- Me.Close()
- End Sub
- Private Sub Animation_Starten()
- If Not currentlyAnimating Then
- ImageAnimator.Animate(animatedImage,
- New EventHandler(AddressOf Me.OnFrameChanged))
- Me.currentlyAnimating = True
- End If
- End Sub
- Private Sub Animation_Beenden()
- ImageAnimator.StopAnimate(animatedImage, New EventHandler(AddressOf Me.OnFrameChanged))
- Me.currentlyAnimating = False
- End Sub
- Private Sub OnFrameChanged(ByVal o As Object, ByVal e As EventArgs)
- Me.Invalidate()
- End Sub
- Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
- ImageAnimator.UpdateFrames()
- e.Graphics.DrawImage(Me.animatedImage, New Point(0, 0))
- End Sub
- Private Sub Timer_Pruefung_Tick(sender As Object, e As EventArgs) Handles Timer_Pruefung.Tick
- If Sprachausgabe.Gestartet = False Then Exit Sub
- If Not Me.currentlyAnimating Then Me.Animation_Starten()
- If Sprachausgabe.IsWorking = False Then
- Me.Timer_Pruefung.Enabled = False
- Sprachausgabe.Gestartet = False
- End If
- End Sub
- Private Sub Vorlesen(ByVal Text As String)
- Sprachausgabe.Gestartet = True
- Me.Timer_Pruefung.Enabled = False
- With Sprachausgabe
- .Stopp()
- .Sprachtext = Text
- .Sprachgeschwindigkeit = Me.Sprachtempo
- .Gestartet = True
- .Vorlesen()
- End With
- Me.Timer_Pruefung.Enabled = True
- End Sub
- Private Sub Bearbeitung_TS_Label(ByVal MeinLabel As ToolStripLabel, ByVal Sprachtext As String)
- If Not MeinLabel.Visible Then Exit Sub
- Sprachausgabe.Gestartet = True
- Me.Timer_Pruefung.Enabled = False
- Me.PosOben = 25
- Me.PosLinks = MeinLabel.Bounds.Left + MeinLabel.Bounds.Width + 50
- Me.Maus_Bewegen(MeinLabel.Bounds.Left + 20, 15)
- Me.Top = Me.PosOben
- Me.Left = Me.PosLinks
- Me.Vorlesen(Sprachtext)
- End Sub
- Private Sub Bearbeitung_TS_DDButton(ByVal MeinButton As ToolStripDropDownButton,
- ByVal MutterItem As ToolStripMenuItem,
- ByVal KindItem As ToolStripMenuItem,
- ByVal MutterNummer As Integer,
- ByVal HatKindItem As Boolean,
- ByVal Sprachtext As String)
- If Not MeinButton.Visible Then Exit Sub
- Sprachausgabe.Gestartet = True
- Me.Timer_Pruefung.Enabled = False
- If MutterItem Is Nothing AndAlso KindItem Is Nothing Then
- Me.PosOben = 25
- Me.PosLinks = MeinButton.Bounds.Left + MeinButton.Width + 50
- MeinButton.Select()
- Me.Maus_Bewegen(MeinButton.Bounds.Left + 20, 15)
- Me.Maus_EinfachClick()
- Else
- If Not MutterItem Is Nothing Then
- Me.PosOben = (MutterNummer * Me.PlusOben) + MeinButton.Height
- If MeinButton.Width > MutterItem.Width Then
- Me.PosLinks = MeinButton.Bounds.Left + MeinButton.Bounds.Width + 50
- Else
- Me.PosLinks = MeinButton.Bounds.Left + MutterItem.Bounds.Width + 50
- End If
- MutterItem.Select()
- Me.Maus_Bewegen(MeinButton.Bounds.Left + 25, Me.PosOben)
- MutterItem.Select()
- End If
- If Not KindItem Is Nothing Then
- Me.PosLinks += KindItem.Width
- Me.Maus_Bewegen(MeinButton.Bounds.Left + 25 + MutterItem.Width + KindItem.Width, Me.PosOben)
- KindItem.Select()
- End If
- End If
- Me.Top = Me.PosOben
- Me.Left = Me.PosLinks
- Me.Vorlesen(Sprachtext)
- End Sub
- Private Sub Maus_Bewegen(ByRef MausLeft As Integer, MausTop As Integer)
- Cursor.Position = New Point(MausLeft, MausTop)
- End Sub
- Private Sub Maus_EinfachClick()
- mouse_event(2, 0, 0, 0, New System.IntPtr())
- mouse_event(4, 0, 0, 0, New System.IntPtr())
- End Sub
- Private Sub Maus_DoppelClick()
- mouse_event(2, 0, 0, 0, New System.IntPtr())
- mouse_event(4, 0, 0, 0, New System.IntPtr())
- mouse_event(2, 0, 0, 0, New System.IntPtr())
- mouse_event(4, 0, 0, 0, New System.IntPtr())
- End Sub
- Public Sub Part_Startmenue()
- Me.TS_ToolstripLabel = Startmenue.TS_Datum
- If Me.TS_ToolstripLabel.Visible Then
- Me.Bearbeitung_TS_Label(Me.TS_ToolstripLabel, "Zeigt das aktuelle Datum." &
- "Klickst du diesen an, erscheint ein kleiner Kalender.")
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- End If
- Me.TS_ToolstripLabel = Startmenue.TS_Uhrzeit
- If Me.TS_ToolstripLabel.Visible Then
- Me.Bearbeitung_TS_Label(Me.TS_ToolstripLabel, "Zeigt die aktuelle Uhrzeit." &
- "Klickst du diesen an, erscheint eine analoge Uhr")
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- End If
- Me.TS_DDButton = Startmenue.TS_Menue
- If Me.TS_DDButton.Visible Then
- Me.TS_DDButton = Startmenue.TS_Menue
- If Me.TS_DDButton.Visible Then
- Me.Bearbeitung_TS_DDButton(Me.TS_DDButton, Nothing, Nothing, 0, False,
- "Anwendungen. hier findest du die Standardprogramme")
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- End If
- Me.I = 0
- For Each MenueItem As ToolStripMenuItem In Me.TS_DDButton.DropDownItems.OfType(Of ToolStripMenuItem)()
- With MenueItem
- Me.I += 1
- If .Name = "TS_Menue_Astronomie" Then
- If .Visible Then
- Me.Bearbeitung_TS_DDButton(Me.TS_DDButton, MenueItem, Nothing, Me.I, False,
- "Astronomie, Hier findest du Informationen über Sonnensysteme und Sterne")
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- End If
- End If
- If .Name = "TS_Menue_EMail" Then
- If .Visible Then
- Me.Bearbeitung_TS_DDButton(Me.TS_DDButton, MenueItem, Nothing, Me.I, True,
- "Email")
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- End If
- For Each MenueSubItem As ToolStripMenuItem In MenueItem.DropDownItems.OfType(Of ToolStripMenuItem)()
- If MenueSubItem.Name = "TS_Menue_EMail_Center" Then
- If MenueSubItem.Visible Then
- Me.Bearbeitung_TS_DDButton(Me.TS_DDButton, MenueItem, MenueSubItem, Me.I, False,
- "Im mailcenter findest Du gesendete und empfange mails")
- Do While Sprachausgabe.Gestartet
- Application.DoEvents()
- Loop
- End If
- End If
- Next
- End If
- End With
- Next
- End If
- Me.Beenden()
- End Sub
- End Class
Gruß Markus
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Westerwälder“ ()