Seite 1 von 4

[ERLEDIGT] Frage ImageGadget Button und ButtonGadget

Verfasst: 30.12.2013 19:01
von udg
hier die Lösung zum eigentlichen Problem, welches ich hatte:
CANVAS GADGET

------------------------------------------

Hallo,

Ich habe in meinem Programm einen Button erstellt der eine Pause Funktion von Musik ausführt. Wenn ich nun einen Song abspiele und drücke den Pause Button, pausiert die Musik und wenn ich den Pause Button erneut drücke, spielt es von der pausierten Position den Song weiter.

Nun habe ich den ButtonGadget durch einen ImageGadget Button ersetzt.

Ergebnis:

Mit einem ImageGadget Button pausiert es zwar den Song aber bei erneutem drücken spielt es nicht weiter?
Ratlosigkeit.

hier ein Auszug vom Code mit dem es funktioniert:

Code: Alles auswählen

ButtonGadget(#Button_4, 194, 50, 90, 20, "Pause")
Repeat
  Event = WaitWindowEvent()
  
  Select Event
       Case #PB_Event_Gadget
ElseIf EventGadget = #Button_4
        If Pause = 0 ;SET PAUSE
          PauseSavedPos = MP_GetCurrentTimeV2M() ;Remember last position.
          SetGadgetText(#gadget_File,"pause: "+GetFilePart(SoundFileName$))  
          MP_StopV2M(1) ;Stop
          Pause=1 ;Paused now.
          Goto GoOn
        ElseIf Pause = 1 ;SET RESUME
          ;Play from last position.
          SetGadgetText(#gadget_File,"now playing: "+GetFilePart(SoundFileName$))
          MP_PlayV2M(PauseSavedPos) ;Play from saved pos.
          Pause=0 ;Resumed now.
          Goto GoOn
        EndIf
        GoOn:
      EndIf
bei diesem nun startet es nicht weil ich nun ImageGadget benutze. Es pausiert zwar aber bei erneutem drücken spielt es nicht weiter wie im oberen Beispiel

Code: Alles auswählen

ImageGadget(#Button_4, 197, 8, 67, 69, CatchImage(#Image_Image_2, ?pause_button_1)) ; pause button "Pause")
Repeat
  Event = WaitWindowEvent()
  
  Select Event
ElseIf EventGadget = #Button_4
        If Pause = 0 ;SET PAUSE
          PauseSavedPos = MP_GetCurrentTimeV2M() ;Remember last position.
          SetGadgetText(#gadget_File,"pause: "+GetFilePart(SoundFileName$))  
          MP_StopV2M(1) ;Stop
          Pause=1 ;Paused now.
          Goto GoOn
        ElseIf Pause = 1 ;SET RESUME
          ;Play from last position.
          SetGadgetText(#gadget_File,"now playing: "+GetFilePart(SoundFileName$))
          MP_PlayV2M(PauseSavedPos) ;Play from saved pos.
          Pause=0 ;Resumed now.
          Goto GoOn
        EndIf
        GoOn:
      EndIf
Ich hoffe der Auszug meines Codes reicht.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 30.12.2013 19:15
von RSBasic
1. Wenn du Code posten möchtest, dann sorge bitte dafür, dass man deine Codes ohne Aufwand direkt testen kann. Ich habe da leider keine Zeit, den Code extra anzupassen, damit ich es testen und reparieren kann. Also bitte zukünftig keine Teile oder Auszüge. ;)
2. Ich sehe, dass du Sprungmarken verwendest und mit GoTo springst. Das solltest du auf keinen Fall machen. Erstens ist das sehr unsauber, zweitens fehleranfällig, drittens veraltet und viertens unübersichtlich. Warum verwendest du überhaupt Goto? Das brauchst du in der Eventschleife sowieso nicht.
3. Wenn ich Zeit habe, dann erstell ich für dich ein Beispielcode. Ansonsten könnte es wahrscheinlich sein, dass jemand schneller ist, als ich, und der dir die Lösung für dein Problem postet. ;)

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 30.12.2013 19:40
von RSBasic
Da ich diese MP_-Funktionen nicht kenne, habe ich das jetzt testweise mit der Movie-Library umgesetzt:

Code: Alles auswählen

EnableExplicit

Define EventID
Define MusicState

CreateImage(1, 50, 50, 24, RGB(255, 0, 0))
CreateImage(2, 50, 50, 24, RGB(0, 255, 0))

InitMovie()
LoadMovie(1, "D:\Musik\CDs\1\01 Track01.mp3");-Anpassen

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ImageGadget(1, 10, 10, 0, 0, ImageID(2), 0)
  
  PlayMovie(1, 0)
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 1
          MusicState = MovieStatus(1)
          If MusicState > 0
            SetGadgetState(1, ImageID(1))
            PauseMovie(1)
            Debug "Wurde jetzt pausiert"
          ElseIf MusicState < 0
            SetGadgetState(1, ImageID(2))
            ResumeMovie(1)
            Debug "Wird jetzt wiedergegeben"
          EndIf
      EndSelect
    EndIf
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Keine Ahnung, ob es dir weiterhilft.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 30.12.2013 19:52
von udg
danke für deine antwort. da ich noch anfänger bin möge man mir das eine oder andere vorgehen verzeihen.

Das der Code warscheinlich nicht reicht dachte ich mir schon. Entschuldige.

Die MP funktion ist aus der MP3D Lib von MPZ

zur anschauung poste ich mal beide Player versionen um zu zeigen was mein problem ist. die pause taste ist ebenfalls mit dem "vorspulen slider" verknüpft welcher beim pause drücken an der position stehen bleibt und beim erneuten drücken im sekunden takt weiter slidet.

http://rghost.net/private/51310129/a1ec ... 5e52238cdd

EDIT:

habe festgestellt:

wenn ich beim Player mit dem ImageGadget Button Pause gedrückt halte und dann wieder auf Pause drücke um den Song weiterspielen zu lassen, dabei die Maus gedrückt halte und etwas dabei bewege spielt dann der Song weiter.

Naja da ist im Code noch gewaltig ws falsch, wie Du schon geschrieben hast. Ich werde da erstmal so gut es mir gelingt aufräumen

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 30.12.2013 20:56
von RSBasic
Optisch sieht deine Anwendung gut aus und die von dir mitgelieferte Musik klingt nett.
Mir ist aber beim Ausführen deiner Anwendung was aufgefallen und zwar der stark steigende RAM-Verbrauch. Da musst du dringend was machen, denn pro Sekunde steigt der RAM-Verbrauch deiner Anwendung etwa 5 MB. Ein paar Minunten gewartet und deine Anwendung hat schon einen Verbrauch von 1,5 GB RAM. Das passiert auch, wenn man keine Musikdatei ausgewählt hat.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 31.12.2013 04:20
von udg
Danke für dein Lob. Die Grafik wird noch feiner. Auch die Texte werden transparent und die Slider muss ich auch noch hinbekommen ,dass sie nicht grau unterlegt sind.

oje. ich habe zwar noch nicht nachgeschaut aber bemerkt, dass mein CPU kühler auf einmal ganz schön dampf macht wenn ich das Programm starte.

darf ich dir mal eine PM schicken bzgl meines Codes?

viele Grüße

EDIT:

ich habe die Lade Routine der Grafiken in den Speicher geändert. Bis dahin war sie so, dass sie ständig die Bilder neu in den Speicher lädt. Anfängerfehler.
Habe ich gefixed. Nun braucht der Player ca 100-120 KB im Speicher. Uff danke für den Hinweis.

Was mich nun interessieren würde warum dieser Pause Button als ImageGadget nicht richtig funktionieren will ? wenn ich die Maus darauf gedrückt halte und ein wenig wegziehe gehts. Aber das solls ja nicht sein.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 31.12.2013 17:42
von CSHW89
Ich hab das Thema hier nicht so verfolgt und kann es auch nicht testen, aber ich sehe du benutzt ImageGadget als ButtonGadget. Dafür ist aber eigentlich ButtonImageGadget gedacht oder, falls du den Button-Style nicht haben willst, das CanvasGadgt.
Events, die du vom ImageGadget bekommst, sind nicht dokumentiert und demnach nur Zufall.

lg Kevin

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 31.12.2013 22:04
von udg
CSHW89 hat geschrieben:... aber ich sehe du benutzt ImageGadget als ButtonGadget. Dafür ist aber eigentlich ButtonImageGadget gedacht oder, falls du den Button-Style nicht haben willst, das CanvasGadgt.
Events, die du vom ImageGadget bekommst, sind nicht dokumentiert und demnach nur Zufall.
lg Kevin
Danke für diese Info. Das Events auf einem ImageGadget eher per Zufall funktionieren wusste ich nicht. Aber erklärt warum ich zb. beim PlayButton hin und wieder einen MouseOver Effekt habe, der das "Filerequest Fenster" von selber öffnet. Oder warum mein PauseButton nicht funktionieren will. Dubios.

Den lauffähigen Code zu posten wird nichts bringen wenn jemand der es testen möchte die "MP3D Lib" nicht nutzt. Denn ich brauche
die Farbrausch "V2M Player Lib" um V2M Sounds abspielen zu können. Dafür soll der Player gut sein.
hier zum runterladen der Player aber noch ohne GFX fix

Den typischen Buttonstyle brauch ich auf keinen Fall. Es muss als Button ein reines Bild sein. Siehe mein angehangener Player zum Download.
(PS) den Speicherüberlauf habe ich inzwischen eleminiert. Der Ram bläht sich nicht mehr auf.

Ich hatte die Grafiken immer wieder neugeladen. :oops:

Guten Rutsch Euch allen

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 31.12.2013 22:09
von RSBasic
@udg
Wenn du lieber ButtonImageGadget verwenden möchtest, aber ohne Rahmen:

Code: Alles auswählen

EnableExplicit

Define EventID

CreateImage(1, 50, 50, 24, RGB(100, 200, 255))

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonImageGadget(1, 50, 50, 60, 60, ImageID(1), #BS_OWNERDRAW)
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Debug "Klick"
      EndSelect
    EndIf
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Ansonsten kannst du auch CanvasGadget nutzen.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 02.01.2014 15:01
von dige
@RSBasic: Weil ich neulich schon mal drüber gestolpert bin. Was ist denn der Unterschied
zwischen dem Code "mit Klick-Animation" ohne "ohne Klick-Animation"? :roll: