Seite 1 von 1
Abbruchmöglichkeit gesucht
Verfasst: 14.06.2020 23:26
von Re57
Hallo zusammen, in meinem Programm kann man Töne abspielen lassen. Allerdings gibt es dabei leider keine Abbruchmöglichkeit, ich muß also warten, bis das Abspielen fertig ist. Meine Frage nun ist, warum eine Bedingung mit KeyboardPushed() in der For-Next-Schleife nicht geht, bzw. wie man da überhaupt eine Abbruchbedingung realisieren könnte. Hier das Funktionsprinzip:
Code: Alles auswählen
For i = 1 to cnt
ton = Toene(i-1)
Select ton
Case 1
PlaySound(1)
Delay(1000)
StopSound(1)
Case 3
PlaySound(2)
Delay(1000)
StopSound(2)
Case 3
PlaySound(3)
Delay(1000)
StopSound(3)
Endselect
event = WaitWindowEvent(5)
next
Danke für Tipps.
Re: Abbruchmöglichkeit gesucht
Verfasst: 15.06.2020 00:56
von STARGÅTE
Was meinst du mit "Abbruchmöglichkeit"?
Meinst du hier das Delay(1000) abbrechen? Generell sollte man auf harte Delays verzichten.
Statt dessen kannst du nach dem Abspielen einfach ein AddWindowTimer() erstellen mit einem Timeout von z.B. 1000 ms.
Nach diesen 1000 ms wird ein WindowEvent ausgelöst, worauf zu reagieren kannst.
Alternativ, kannst du KeyboardPushed() im Screen oder AddKeyboardShortcut() im Window nutzen um vorzeitig das Abspielen zu beenden.
Das ganze funktioniert jedoch nur mit einer "intakten" Event-Schleife.
Re: Abbruchmöglichkeit gesucht
Verfasst: 15.06.2020 13:15
von STARGÅTE
Re57 hat geschrieben:Kann mir bitte mal jemand einen kurzen Beispiel-Code schreiben, wie man innerhalb einer For-Next-Schleife einen Abbruch z.B. über die Escape-Taste erzeugt?
Dafür kann man dir sicher einen Code schreiben, allerdings würde ich es gerne vermeiden, weil es die falsche Herangehensweise ist.
Daher hier mal ein Beispiel, wie man dein Töne-Abspielen mit Timer lösen kann.
Code: Alles auswählen
Enumeration
#Window
#Gadget_Play
#Gadget_Stop
#Timer
EndEnumeration
OpenWindow(#Window, 0, 0, 200, 40, "Play and Stop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#Gadget_Play, 10, 10, 80, 20, "Play")
ButtonGadget(#Gadget_Stop, 110, 10, 80, 20, "Stop")
Define Ton.i
Define MaxTon.i = 5
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
CloseWindow(#Window)
End
Case #PB_Event_Timer
Select EventTimer()
Case #Timer
; Es sind 1000 ms vergangen, also "alten" Ton stoppen, Ton um eins erhöhen und "neuen" Ton starten wenn erwünscht, sonst Timer löschen.
Debug "Stop Ton "+Str(Ton) ; hier kommt dein StopSound() hin.
If Ton < MaxTon
Ton + 1
Debug "Play Ton "+Str(Ton) ; hier kommt dein PlaySound() hin.
Else
RemoveWindowTimer(#Window, #Timer)
EndIf
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_Play
; Play setzt Ton auf 1, beginnt das abspielen und erstellt einen Timer mit 1000 ms
Ton = 1
Debug "Play Ton "+Str(Ton) ; hier kommt dein PlaySound() hin.
AddWindowTimer(#Window, #Timer, 1000)
Case #Gadget_Stop
; Stop stoppt das abspielen und löscht den Timer
Debug "Stop Ton "+Str(Ton) ; hier kommt dein StopSound() hin.
RemoveWindowTimer(#Window, #Timer)
EndSelect
EndSelect
ForEver
Edit: Diese Antwort galt einem inzwischen gelöschten Post von Re57
Re: Abbruchmöglichkeit gesucht
Verfasst: 15.06.2020 15:11
von Re57
Vielen Dank, Stargate. Leider jedoch habe ich wegen Provider-Wechsel derzeit kein Internet am Laptop (nur auf dem Smartphone über Mobilfunk) sodaß ich mich jetzt leider erstmal nicht näher mit Deinem Code beschäftigen kann. Ich werde das aber später natürlich machen. Ich selber hatte zwischenzeitlich versucht, über AddKeyboardShortcut() und dann mit den Abfragen über WaitWindowEvent() und #PB_Event_Menu und EventMenu() weiterzukommen, aber das ging nicht, auch nicht nach Umwandlung von For-Next in Repeat-Until. Ich lasse das Problem jetzt erstmal liegen, bis ich bald wieder Internet auch am Laptop habe.
Mich würde aber jetzt auch mal noch etwas ganz anderes interessieren: Es gibt ja Programme, die auf einen Ordner zugreifen und auch bei meinem aktuellen Code ist das so. Gibt es eigentlich eine Möglichkeit, dann ein Executable so zu erstellen, daß der Ordner dann gleich fest mit dem Programm verankert ist, sprich, daß man dann den ursprünglichen Ordner gar nicht mehr braucht? Vielleicht wird das aber so kompliziert, daß ich als Laie das nicht schaffen kann. Ich hatte auch schon früher mal ein Programm erstellt mit einem Ordner dabei (Spiel mit Karten), und hatte das auch Verwandten zugeschickt, aber gerade chique ist das ja nicht mit so einem Extra-Ordner dabei. Danke.
Re: Abbruchmöglichkeit gesucht
Verfasst: 15.06.2020 17:43
von Mijikai
Prinzipiell kann alles in die Exe eingebunden werden (IncludeBinary).
Optional gibt es auch oft entsprechende OS-APIs wie z.B. die Resource APIs bei Windows.
https://docs.microsoft.com/en-us/window ... adresource
Re: Abbruchmöglichkeit gesucht
Verfasst: 15.06.2020 23:14
von Re57
Vielen Dank, IncludeBinary war genau das Stichwort, was ich gesucht hatte. Mittlerweile habe ich schon darüber in der Referenz gelesen (ein super Buch ist das und da werde ich ab jetzt intensiv rein sehen) IncludeBinary werde ich bald mal ausprobieren.