Befehle werden in falscher Reihenfolge ausgeführt Verfasst am: 17.11.2009, 20:45
Hallo,
ich habe ien Problem und hoffe auf kompetente Hilfe!
Ich habe ein VB6-Programm geschrieben, in welchem einem Label ein Text zugewiesen wird. Einen Befehl weiter rufe ich ein sub sprachausgabe auf (hier wird der text im label vorgelesen). Funktioniert auch alles bestens. Mit einem Haken: Obwohl der Befehl zum Text anzeigen vor dem Befehl zur Sprachausgabe steht, wird zuerst vorgelesen und danach(!) der Text angezeigt.
Kann mir da jemand einen klugen Tipp geben?
Gruß und vielen Dank vorab!!
Magico777
___________________
Code:
Private Sub Anzeige()
lbl_Zubereitung = "Beispieltext" 'Erst TEXT ANZEIGEN
sprachausgabe (lbl_Zubereitung.Caption) 'Dann TEXT VORLESEN
End Sub
Private Sub sprachausgabe(text As String)
Dim voice As Variant
Set voice = CreateObject("SAPI.SpVoice")
voice.Speak text, 0
End Sub
Ja, ist eine Eigenart von VB6, passiert mir auch öffters.
Ich lös es immer indem ich ein unsichtbares Formular lade und dann wieder entlade.
Code:
Load frmTmp
Unload frmTmp
Einfach eine neue Form die Visible = false ist
In deinem Fall also
Code:
Private Sub Anzeige()
lbl_Zubereitung.Caption = "Beispieltext" 'Erst TEXT ANZEIGEN
Load frmTmp
Unload frmTmp
sprachausgabe (lbl_Zubereitung.Caption) 'Dann TEXT VORLESEN
End Sub
Private Sub sprachausgabe(text As String)
Dim voice As Variant
Set voice = CreateObject("SAPI.SpVoice")
voice.Speak text, 0
End Sub
meld dich ob's funktioniert hat!
mfg
Magico777 Newbie
Anmeldedatum: 17.11.2009 Beiträge: 9
Kein Erfolg...leider! Verfasst am: 18.11.2009, 16:24
Hallo,
erstmal DANKE für Deine Hilfe!!!
Leider hat Dein Vorschlag zu keinem veränderten Ergebnis geführt. Es wird immer noch erst vorgelesen, dann angezeigt. Irgendwie kann ich mir das nicht erklären...
Vermute mal du rufst die Sub "Anzeige()" dann auf wenn du einen Knopf drückst.
Lieg ich da richtig?
Wenn ja: dann dann gib die Sub "sprachausgabe("xyz") " als nächsten Befehl nach "Anzeige()" beim Klickereignis deines Buttons.
Wenn nein: bevor du in der Sub "Anzeige()" die Sub "sprachausgabe()" aufrufst einfach ein
Code:
If lbl_Zubereitung.Caption <> "" Then
sprachausgabe (lbl_Zubereitung.Caption)
End If
einfügen.
mfg
Magico777 Newbie
Anmeldedatum: 17.11.2009 Beiträge: 9
Verfasst am: 19.11.2009, 16:29
Hi,
zuerst: Du vermutest richtig, ich rufe das sub anzeige() auf knopfdruck auf.
zu 1) Ich habe versucht den Aufruf der sprachausgabe aus dem sub anziege() heruaszunehmen und direkt hinter den aufruf in das Klick-Ereignis des knopfes zu setzen. Ergebnis: Keine Veränderung!
zu 2) ich hab das ganze in die vorgeschlagene if Abfrage gesetzt. Ergebnis: Keine Veränderung!
Ich verstehs nicht. Mit dem nächsten Ereignis schon weitermachen bevor ein anderes zu ende ist ok, aber ein Ereignis erst nach einem anderen ausführen, obwohl des davor steht (und ja auch die inhaltlische Basis ist). Das versteh ich nit...
Gruß
christopher.g Überflieger
Anmeldedatum: 03.05.2008 Beiträge: 536
Verfasst am: 20.11.2009, 08:05
probier mal die delay funktion
vl bringt die ja was
Magico777 Newbie
Anmeldedatum: 17.11.2009 Beiträge: 9
Ein funktionierender Workaround! Verfasst am: 20.11.2009, 19:36
Hallo,
danke für Deinen Tipp. Mal davon abgeshen, dass eine "Delay-Funktion" in VB ja eigentlich nicht gibt, hab ich mir einfach selber ne simple gebaut.
Code:
Option Explicit
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Sub Delay(nSekunden As Long)
Dim TimeOut As Long
TimeOut = (GetTickCount / 1000) + nSekunden
Do
DoEvents
Loop Until TimeOut < (GetTickCount / 1000)
End Sub
Fazit: Der Woraround funktioniert. Ich kann die korrekte Reihenfolge wieder herstellen! Einen Dank für Deine Idee!
alledings interssiert mich immer noch, wie ein solches Verhalten zustandekommt und ob man es auch auf andere Weise (also Beseitigung der Ursache, nicht Heilung der negativen Auswirkung) lösen kann.