Seite 1 von 2

ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 11:51
von Torr
Hallo liebes Forum,
meine Frage an Euch bezieht sich auf das ExplorerListgadget.
Mein Programm was noch in Arbeit ist, soll automatisch den nächsten Eintrag(Item?) auswählen, wenn
der vorherige Eintrag(Item?) abgearbeitet ist.
Kurz
ich habe ein EplorerTreeGadget und ein ExplorerListgadget in einem Window.
Mit dem Treegadget wähle ich ein Verzeichnis aus.
Das Listgadget zeigt mir die vorhandenen Dateien an. (hier MP3 Dateien)
Durch anklicken des Eintrages spielt das Programm diese Datei ab.
Nach Ende der Datei soll der nächste Eintrag abgespielt werden.
Für mich wäre es ja von der Logik her so, das ich
a: Die länge der Datei wissen muss? (hier in Sekunden) soweit bin ich schon, Länge der Dateien in Sekunden habe ich.
und
b: wenn Ende der Datei erreicht ist z.B. nach 10 Sekunden der nächste Eintrag vom Listgadget
abgespielt wird.

Ist das überhaubt möglich ?
wie gesagt ich bin Anfänger und am lernen.
Leider sitze ich im Rollstuhl und habe nur noch eine Hand zum Schreiben, also ist es für mich anstrengend
zu programmieren (obwohl programmieren für meinen Status wohl etwas übertrieben ist).
Noch was zu meinem Nick,
Torr > ist eine Maßeinheit des Druckes. Ein Torr ist der statische Druck, der von einer Quecksilbersäule von 1 mm Höhe erzeugt wird. (heute nicht mehr als Einheitenzeichen gebräuchlich)
Thor > Thor ist nach Odin der oberste und gefürchtetste der Götter (nordische Mythologie)

Vielleicht hat ja ein Forum Mitglied eine Lösung ?

Vielen Dank

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 12:22
von man-in-black
Hi,

nutze GetGadgetState() und SetGadgetItemState(). Der Code ist sicherlich optimierungsbedürftig,
zeigt aber, worauf ich hinaus will. ;)

Code: Alles auswählen


#gestoppt = 0
#gestartet = 1


Global status.i = #gestoppt
Global zeit.i = 0
Global max_zeit.i = 4

Procedure starten()
  Protected song.s
  
  RemoveWindowTimer(0,0)
  song = GetGadgetItemText(0,GetGadgetState(0),0)
  status = #gestartet
  zeit = 0
  SetGadgetText(2,Str(zeit)+":"+Str(max_zeit))
  SetGadgetText(1,"play: "+song)
  AddWindowTimer(0,0,1000)

EndProcedure

Procedure spielen(Event)
  
  If status = #gestartet

    If Event = #PB_Event_Timer And EventTimer() = 0     
      zeit + 1
      SetGadgetText(2,Str(zeit)+":"+Str(max_zeit))
      If zeit = max_zeit
        status = #gestoppt
      EndIf  
     EndIf 
    
  ElseIf GetGadgetState(0) > -1 And GetGadgetState(0) < CountGadgetItems(0)-1
    SetGadgetItemState(0,GetGadgetState(0)+1, #PB_Explorer_Selected )
    starten()
    
  EndIf  
  
EndProcedure  

If OpenWindow(0, 0, 0, 400, 600, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerListGadget(0, 10, 10, 380, 550, "C:\")
    TextGadget(1,10,570,300,20,"erst wählen!")
    TextGadget(2,310,570,70,20,"??:??")
    BindGadgetEvent(0,@starten())
    
    AddWindowTimer(0,0,1000)
    
    Repeat 
      Event = WaitWindowEvent()
      spielen(Event) 

    Until Event = #PB_Event_CloseWindow
  EndIf
P.S. du musst jetzt natürlich noch zwischen Ordnern und Dateien unterscheiden können.

edit: hab den Timer jetzt doch besser gestalten. Nicht, dass sich Anfänger gleich was schlechtes einprägen ;)

MFG
MIB

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 12:31
von Torr
Vielen vielen Dank Man in Black,
das ist sehr nett von Dir das du dich meines Anliegen angenommen hast.
Ich werde deinen Vorschlag ausprobieren und Frage dich zusätzlich ob ich mich bei dir melden kann,
wenn ich noch Fragen habe.

Vielen Dank MiB
Torr

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 12:41
von man-in-black
Hi,

na klar. Machs gleich an dieser Stelle. Dann können andere mitraten ;)
(PN geht auch, aber das bekomme ich schlechter mit)

MFG
MIB

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 12:56
von Torr
jetzt geht es schon los mit den Fragen !
Ist mir sehr unangenehm, aber ich stehe wirklich auf den Schlauch.
Warum BindgadgetEvent() geht das nur so?
davon habe ich wirklich null Ahnung !
Laut Hilfe springt das Programm nachdem @Callback Aufruf immer an diese Routine zurück??

Meine Variable heisst Total_Time , für die Länge der Datei die ich vorher mit der linken Maustaste angewählt habe.
Total_Time gibt mir die Länge der Datei in Sekunden zurück.
also müsste ich jetzt quasi in deiner ElapsedMilliseconds Routine mit einer If Abfrage
Variable Total_Time vergleichen? Variable Play_Time zeigt mir die abgespielte Zeit an !
If Play_Time =Total_time (Beispiel)
dann nächsten Eintrag wählen ?

ElseIf GetGadgetState(0) > -1 And GetGadgetState(0) < CountGadgetItems(0)
SetGadgetItemState(0,GetGadgetState(0)+1, #PB_Explorer_Selected )
starten()
so ungefähr??

Vielen vielen Dank MiB

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 12:57
von man-in-black
kurz ein Hinweis: Ich habe meinen "Timer" nochmal angepasst. Ist jetzt schlanker und besser ;)
Antworten zu den anderen Fragen folgen ...

edit:
Du musst BindEvent nicht nutzen. Aber das sagt im Grunde nur aus: "Wenn du in die Liste klickst, dann führe diese Procedure aus".
"Früher" hat man sich die Events zurückgeben lassen, hat geguckt, ob ein Gadget angeklickt wurde, ...

Code: Alles auswählen

(aus der Hilfe:)
Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Button 1 clicked!"
           Case 2 : Debug "Button 2 clicked!"
         EndSelect
...
BindEvent ist also deutlich schlanker und läuft bereits als Thread nebenher!

Zu deinen Variablen: ja. Ich habe bewusst ähnliche verwendet.

P.S.
nimm mal bitte Code-Tags für deine Snippets. Liest sich besser ;)

MIB

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 13:09
von Torr
Achso dann läuft das im Thread also CPU schonender ??

ich werde jetzt mal deine Variablen im Debug Modus beobachten damit ich sehen kann was gerade passiert!
Ist für mich besser erklärend dann.

Danke MiB

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 13:19
von man-in-black
Nein,
normalerweise hast du nur den Hauptthread laufen. Dieser bearbeitet deine Fensterevents und sonstigen Code.
Wenn du jetzt aber noch aufwändige Rechnungen durchführst, braucht der Hauptthread logischerweise länger,
um alles abzuarbeiten. Übersteigt die Zeit ein angenehmes Maß, taucht die typische Meldung "Fenster reagiert nicht mehr"
auf. Die Events werden einfach nichtmehr richtig verarbeitet und stauen sich.
Spätestens hier sollte man also Fensterevents und sonstige Rechnungen in verschiedene Threads aufteilen. Die CPU hat eh genug
Kerne, um alles parallel abhandeln zu können.

Daher ist es also sinnvoll, dass BindEvent die Procedure als extra Thread aufruft.

MIB

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 13:27
von Torr
Ah ja Code Tags habe ich gefunden, mache ich beim nächsten mal.

Code: Alles auswählen

#gestoppt = 0
#gestartet = 1


Global status.i = #gestoppt
Global zeit.i = 0
Global max_zeit.i = 4
Global letzter_zeitabgleich = 0

Procedure starten()
  Protected song.s
  
  RemoveWindowTimer(0,0)
  song = GetGadgetItemText(0,GetGadgetState(0),0)
  status = #gestartet
  zeit = 0
  SetGadgetText(2,Str(zeit)+":"+Str(max_zeit))
  SetGadgetText(1,"play: "+song)
  AddWindowTimer(0,0,1000)
Debug song
EndProcedure

Procedure spielen(Event)
  
  If status = #gestartet

    If Event = #PB_Event_Timer And EventTimer() = 0     
      zeit + 1
      SetGadgetText(2,Str(zeit)+":"+Str(max_zeit))
      If zeit = max_zeit
        status = #gestoppt
        letzter_zeitabgleich = 0
      EndIf  
     EndIf 
    
  ElseIf GetGadgetState(0) > -1 And GetGadgetState(0) < CountGadgetItems(0)
    SetGadgetItemState(0,GetGadgetState(0)+1, #PB_Explorer_Selected )
    starten()
    Debug zeit
    Debug max_zeit
    Debug letzter_zeitabgleich
    Debug status 
    ;Debug song
  EndIf  
  
EndProcedure  

If OpenWindow(0, 0, 0, 400, 600, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerListGadget(0, 10, 10, 380, 550, "C:\")
    TextGadget(1,10,570,300,20,"erst wählen!")
    TextGadget(2,310,570,70,20,"??:??")
    BindGadgetEvent(0,@starten())
    
    AddWindowTimer(0,0,1000)
    
    Repeat 
      Event = WaitWindowEvent()
      spielen(Event) 

    Until Event = #PB_Event_CloseWindow
  EndIf
In der Procedure Spielen(Event)
die Routine

Code: Alles auswählen

 ElseIf GetGadgetState(0) > -1 And GetGadgetState(0) < CountGadgetItems(0)
    SetGadgetItemState(0,GetGadgetState(0)+1, #PB_Explorer_Selected )
ist meine Frage also wenn Zeit max_Zeit erreicht wurde
dann wähle nächsten Eintrag aus?
Ist das so richtig für mich?

Re: ExplorerListGadget automatisch nächsten Item auswählen ?

Verfasst: 20.01.2017 13:33
von man-in-black
Genau. Entweder wird das Lied abgespielt (#gestartet) oder es ist durchgelaufen (#gestoppt).
Erst dann kann man in der Liste einen weiterrücken. Wichtig war mir dann noch, dass bereits ein Element
ausgewählt wurde (Folgelieder sind sonst schlecht bestimmbar ;) ) und dass die Liste nicht erschöpft ist (hier fehlt noch eine "-1", habs in meinem ersten Beitrag angepasst).

MIB