ExplorerListGadget automatisch nächsten Item auswählen ?
ExplorerListGadget automatisch nächsten Item auswählen ?
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
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
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: ExplorerListGadget automatisch nächsten Item auswählen ?
Hi,
nutze GetGadgetState() und SetGadgetItemState(). Der Code ist sicherlich optimierungsbedürftig,
zeigt aber, worauf ich hinaus will.
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
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
edit: hab den Timer jetzt doch besser gestalten. Nicht, dass sich Anfänger gleich was schlechtes einprägen

MFG
MIB
Zuletzt geändert von man-in-black am 20.01.2017 13:27, insgesamt 3-mal geändert.
Re: ExplorerListGadget automatisch nächsten Item auswählen ?
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
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
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: ExplorerListGadget automatisch nächsten Item auswählen ?
Hi,
na klar. Machs gleich an dieser Stelle. Dann können andere mitraten
(PN geht auch, aber das bekomme ich schlechter mit)
MFG
MIB
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 ?
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
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
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: ExplorerListGadget automatisch nächsten Item auswählen ?
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, ...
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

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
...
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 ?
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
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
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: ExplorerListGadget automatisch nächsten Item auswählen ?
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
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 ?
Ah ja Code Tags habe ich gefunden, mache ich beim nächsten mal.
In der Procedure Spielen(Event)
die Routine
ist meine Frage also wenn Zeit max_Zeit erreicht wurde
dann wähle nächsten Eintrag aus?
Ist das so richtig für mich?
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
die Routine
Code: Alles auswählen
ElseIf GetGadgetState(0) > -1 And GetGadgetState(0) < CountGadgetItems(0)
SetGadgetItemState(0,GetGadgetState(0)+1, #PB_Explorer_Selected )
dann wähle nächsten Eintrag aus?
Ist das so richtig für mich?
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: ExplorerListGadget automatisch nächsten Item auswählen ?
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
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

MIB