[ERLEDIGT] Frage ImageGadget Button und ButtonGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

[ERLEDIGT] Frage ImageGadget Button und ButtonGadget

Beitrag 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.
Zuletzt geändert von udg am 24.01.2014 13:24, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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. ;)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Frage ImageGadget Button und ButtonGadget

Beitrag 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:
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten