130834
21.10.2016
3266
28
0
Musik Subprozess (Batch)
Hey Leuts.
Ich hab mir natürlich wieder ein exquisites Problem für mich selbst herausgesucht an dem ich jetzt feststecke ...
Also ich hab 2 wichtige Dinge. Erstens ich hätt gern Musik im Hintergrund meiner Batch.
Das funkt recht gut, mit diesem Script hier:
Erstes Problem: Ich weiss nicht wie ich diesen Erschaffenen Prozess töten kann somit läuft die Musik für immer, und ebenfalls habe ich ihn sogar nicht einmal im Taskmanager gefunden, was aber sowieso nicht wichtig ist, da ich ihn gern mit der einer anderen Batch beenden möchte, sobald ein bestimmtes Event eintritt. Und ich möchte auch nicht einfach den Loop beenden und dann warten bis die Musik aufhöhrt, da der Wechsel auf einen Schlag passieren soll.
Zweites Problem: (Nicht so wichtig) Ich habe eine Settings.bat welche einen SFX und Musik Regler hat. Nun, diese sind noch nicht besonders Nützlich, jedoch würde ich diese gern benutzen.
Das heisst soweit das ich wahrscheinlich für jeden SFX sound eine Batch wie oben habe welche dann mit einem Parameter einen SFX startet, aber ich habe keine Kontrolle über das Volumen. wüsste jemand wie ich für den erschaffenen Prozess ( oben ) das Volumen einstellen kann, und zwar nur für diesen da ich das Hauptvolume nicht berühren möchte? ( dies kann man ja auch in den normalen Windows Volumen Einstellungen )
Das alles sind natürlich Vorbereitungen für eine Art Videospiel womit ich grade am Rumprobieren bin, da ich keine Hobbies habe und die ganze Zeit am Batch schreiben bin ;)
TL;DR
Ich versuche ein Batch Game zu schreiben welches einen Musik und SFX controller und den Settings sowie Hintergrund Musik und Soundeffeckte im Spiel haben.
Die Settings existieren bereits jedoch ohne Kontrolle über das Volumen.
Ich hab mir natürlich wieder ein exquisites Problem für mich selbst herausgesucht an dem ich jetzt feststecke ...
Also ich hab 2 wichtige Dinge. Erstens ich hätt gern Musik im Hintergrund meiner Batch.
Das funkt recht gut, mit diesem Script hier:
@echo off
set "file=Sound.mp3"
( echo Set Sound = CreateObject("WMPlayer.OCX.7"^)
echo Sound.URL = "%file%"
echo Sound.Controls.play
echo do while Sound.currentmedia.duration = 0
echo wscript.sleep 100
echo loop
echo wscript.sleep (int(Sound.currentmedia.duration^)+1^)*1000) >sound.vbs
timeout /t 2 /nobreak >nul
:loop
start "" /wait /min sound.vbs
goto :loop
Erstes Problem: Ich weiss nicht wie ich diesen Erschaffenen Prozess töten kann somit läuft die Musik für immer, und ebenfalls habe ich ihn sogar nicht einmal im Taskmanager gefunden, was aber sowieso nicht wichtig ist, da ich ihn gern mit der einer anderen Batch beenden möchte, sobald ein bestimmtes Event eintritt. Und ich möchte auch nicht einfach den Loop beenden und dann warten bis die Musik aufhöhrt, da der Wechsel auf einen Schlag passieren soll.
Zweites Problem: (Nicht so wichtig) Ich habe eine Settings.bat welche einen SFX und Musik Regler hat. Nun, diese sind noch nicht besonders Nützlich, jedoch würde ich diese gern benutzen.
Das heisst soweit das ich wahrscheinlich für jeden SFX sound eine Batch wie oben habe welche dann mit einem Parameter einen SFX startet, aber ich habe keine Kontrolle über das Volumen. wüsste jemand wie ich für den erschaffenen Prozess ( oben ) das Volumen einstellen kann, und zwar nur für diesen da ich das Hauptvolume nicht berühren möchte? ( dies kann man ja auch in den normalen Windows Volumen Einstellungen )
Das alles sind natürlich Vorbereitungen für eine Art Videospiel womit ich grade am Rumprobieren bin, da ich keine Hobbies habe und die ganze Zeit am Batch schreiben bin ;)
TL;DR
Ich versuche ein Batch Game zu schreiben welches einen Musik und SFX controller und den Settings sowie Hintergrund Musik und Soundeffeckte im Spiel haben.
Die Settings existieren bereits jedoch ohne Kontrolle über das Volumen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-Key: 318682
Url: https://administrator.de/contentid/318682
Ausgedruckt am: 19.03.2024 um 11:03 Uhr
28 Kommentare
Neuester Kommentar
VBS laufen im Prozess cscript.exe oder wscript.exe einfach bei taskkill den imagename angeben oder mit tasklist filtern, fertig.
BTW. wer macht sowas heutzutage noch mit Batch?? Kopfschüttel. Wenn du kein Hobby hast hast du ja eigentlich genug Zeit zum Lernen einer richtigenProgrammiersprache.
Batch is wat fö ming Omma.
BTW. wer macht sowas heutzutage noch mit Batch?? Kopfschüttel. Wenn du kein Hobby hast hast du ja eigentlich genug Zeit zum Lernen einer richtigenProgrammiersprache.
Batch is wat fö ming Omma.
Laustärke in eine Datei schreiben und im VBS im Loop die Datei regelmäßig auslesen (FileSystemObject) und an den Player übergeben.
Taskkill für bestimmtes cmd Fenster
Natürlich per FOR-Schleife, die Kenntnisse setze ich hier bei einem Batchie voraus.
Daher ist Tasklist keine Lösung.
DochTaskkill für bestimmtes cmd Fenster
Natürlich per FOR-Schleife, die Kenntnisse setze ich hier bei einem Batchie voraus.
Hallo clragon,
das [w|c]script zu killen macht keinen Sinn solange die Batchdatei noch läuft und das Script immer wieder mit neuer Pid startet.
Je nach Dauer der gewählten mp3 Datei wäre das dann Schritt 2.
Um die Batchdatei einfacher zu identifizieren würde ich ihr per Title einen aussagefähigen Namen verpassen und den per Tasklist /V filtern.
Da die Batchdatei aber ja immer noch ein sichtbares Fenster hat, wäre ein kleines Timeout /T 1 ohne /Nobreak vor dem goto :loop ja eine viel einfachere Lösung.
Gruß
LotPings
das [w|c]script zu killen macht keinen Sinn solange die Batchdatei noch läuft und das Script immer wieder mit neuer Pid startet.
Je nach Dauer der gewählten mp3 Datei wäre das dann Schritt 2.
Um die Batchdatei einfacher zu identifizieren würde ich ihr per Title einen aussagefähigen Namen verpassen und den per Tasklist /V filtern.
Da die Batchdatei aber ja immer noch ein sichtbares Fenster hat, wäre ein kleines Timeout /T 1 ohne /Nobreak vor dem goto :loop ja eine viel einfachere Lösung.
Gruß
LotPings
Hallo clragon,
die Zeile
legt doch nahe, dass das Media Player Scripting-Objekt eine Property
Guckst Du hier.
Grüße
Friemler
die Zeile
Sound.Controls.play
Controls
hat, über die die Steuerelemente des WMP (z.B. Play
, Stop
, usw.) zugänglich sind. Wozu dann Tasks abschießen?Guckst Du hier.
Grüße
Friemler
Hallo clragon.
[OT]
Spiel mit Batch ist so etwas wie Sahnetorte mit Ketchup. Braucht keiner.
[/OT]
Grüße
rubberman
Diese Zeile versteh ich noch nicht ganz
Das duration-Member enthält die Länge deines mp3 Tracks in Sekunden mit Nachkommastellen. Sleep verlangt Millisekunden, darum wird 1 addiert, dann mit 1000 multipliziert und abgerundet.und ich müsste jetzt wissen wie ich nada von aussen aus auf 0 setzte
In eine Datei schreiben und diese auslesen.[OT]
Das alles sind natürlich Vorbereitungen für eine Art Videospiel womit ich grade am Rumprobieren bin
Wie du siehst, kannst du bereits das Audio nicht mit Batch regeln. Was glaubst du, passiert mit der Anzeige? Das Konsolefenster ist textbasiert. Grafik ist nicht, Vorder- oder Hintergrund ist nicht, den Cursor ohne 3rd Party irgendwo hinsetzen ist nicht, unterschiedliche Farben innerhalb eines Fensters ist ein Krampf, über Performance muss man sich keine Gedanken machen da sie nicht existiert.Spiel mit Batch ist so etwas wie Sahnetorte mit Ketchup. Braucht keiner.
[/OT]
Grüße
rubberman
Hallo clragon.
OK, ich hab mal kurz ein Hybrid aus Batch und JScript zusammengeschraubt. (Das ist auch nichts anderes als Batch und VBScrip, nur dass beide Codes in derselben Datei liegen.)
Wie's funktioniert:
- Die Datei wird einmal von cmd.exe als Batch und parallel von cscript.exe als JScript ausgeführt.
- Die erste Zeile ist valider Code in Batch und JScript und dient dazu einen JScript Kommentar einzuleiten.
- Alles zwischen
-
- Im Batchcode hast du 5 Variablen (Erklärung im Code), die alle mit
- Ein
- Der JScript Code liest diese Werte in einer Pollingschleife aus und nutzt sie entsprechend.
Natürlich kannst du auch mit einem anderen Script auf die Settingsdatei zugreifen, à la
Aber Vorsicht, je mehr Prozesse auf die Datei zugreifen, desto größer die Gefahr, dass das gleichzeitig passiert, was zu Data Races führt.
Grüße
rubberman
OK, ich hab mal kurz ein Hybrid aus Batch und JScript zusammengeschraubt. (Das ist auch nichts anderes als Batch und VBScrip, nur dass beide Codes in derselben Datei liegen.)
@if (@a)==(@b) @end /*********** Batch part ***********
@echo off &setlocal
set "settingfile=settings.txt"
:: soundfile - Pfad der Audiodatei
:: soundvolume - Lautstärke (0...100)
:: soundloop - Audiodatei in Endlosschleife abspielen (0=nein, 1=ja)
:: soundplay - 0=Pause, 1=Play
:: soundstop - 0=Player laufen lassen, 1=Player und JScript beenden
set "soundfile=Sound.mp3"
set /a "soundvolume=50,soundloop=1,soundplay=1,soundstop=0"
>"%settingfile%" set sound
start "" /b cscript //nologo //e:jscript "%~f0" "%settingfile%"
>nul timeout /t 10
echo 2s Pause
set "soundplay=0"
>"%settingfile%" set sound
timeout /t 2
set "soundplay=1"
>"%settingfile%" set sound
>nul timeout /t 5
echo(&echo Volume 30
set "soundvolume=30"
>"%settingfile%" set sound
>nul timeout /t 5
echo(&echo Andere Datei
set "soundfile=Distrust.mp3"
>"%settingfile%" set sound
::>nul timeout /t 10
::echo(&echo Player stoppen und JScript beenden
::set "soundstop=1"
::>"%settingfile%" set sound
pause
exit /b
********** JScript part **********/
var objService = WScript.CreateObject('WbemScripting.SWbemLocator').ConnectServer('.', 'root\\cimv2'),
objFSO = WScript.CreateObject('Scripting.FileSystemObject'),
objPlayer = WScript.CreateObject('WMPlayer.OCX.7'),
objFile, arrLine, strSoundfile;
objPlayer.settings.autoStart = true;
objPlayer.settings.mute = false;
objPlayer.settings.volume = 50;
while (true) {
objFile = objFSO.OpenTextFile(WScript.Arguments(0), 1);
while (!objFile.atEndOfStream) {
arrLine = objFile.ReadLine().split('=');
if (arrLine.length > 1) {
switch(arrLine) {
case 'soundfile':
if (strSoundfile != arrLine[1]) {
strSoundfile = arrLine[1];
objPlayer.URL = strSoundfile;
}
break;
case 'soundloop':
objPlayer.settings.setMode('loop', parseInt(arrLine[1]));
break;
case 'soundplay':
if (parseInt(arrLine[1])) {
objPlayer.controls.play();
} else {
objPlayer.controls.pause();
}
break;
case 'soundstop':
if (parseInt(arrLine[1])) {
objPlayer.close();
WScript.Sleep(100);
WScript.Quit();
}
break;
case 'soundvolume':
objPlayer.settings.volume = parseInt(arrLine[1]);
break;
}
}
}
objFile.Close();
if (objService.ExecQuery('SELECT * FROM Win32_Process WHERE Name=\'cmd.exe\' AND CommandLine LIKE \'%"' + WScript.ScriptFullName.replace(/\\/g, '\\\\') + '"%\'').Count != 1) {
objPlayer.close();
WScript.Sleep(100);
WScript.Quit();
}
WScript.Sleep(500);
}
Wie's funktioniert:
- Die Datei wird einmal von cmd.exe als Batch und parallel von cscript.exe als JScript ausgeführt.
- Die erste Zeile ist valider Code in Batch und JScript und dient dazu einen JScript Kommentar einzuleiten.
- Alles zwischen
/*
und */
ist in JScript ein Kommentar und wird ignoriert.-
exit /b
beendet den Batchprozess, alles was danach kommt wird nicht mehr gesehen.- Im Batchcode hast du 5 Variablen (Erklärung im Code), die alle mit
sound
beginnen.- Ein
set sound
listet alle Name=Wert Paare bei denen der Name mit sound beginnt, diese Wertepaare werden nach einem Update der Variablen in die Settingsdatei geschrieben.- Der JScript Code liest diese Werte in einer Pollingschleife aus und nutzt sie entsprechend.
Natürlich kannst du auch mit einem anderen Script auf die Settingsdatei zugreifen, à la
@echo off &setlocal
set "settingfile=settings.txt"
:: aktuelle Werte einlesen
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"
:: bestimmten Wert ändern
set "soundvolume=70"
:: Werte zurückschreiben
>"%settingfile%" set sound
Grüße
rubberman
Hallo clragon.
Grüße
rubberman
Sound Settings hat keine Variable im JS Player weshalb man keinen effekt hat.
Was meinst du? Den Dateiname der Settingsdatei? Der wird beim Aufruf von cscript übergeben und ist somit im JScript als WScript.Arguments(0) abgreifbar. (siehe Zeile 53 oben)Ich hab ja das letzte mal noch von einem Map Drawer gesprochen
Der Kern des Scripts kommt mir sehr bekannt vor (bin Mod bei DosTips).Grüße
rubberman
Sorry, aber ich kann dir nicht folgen.
Also, die Batchdatei mit dem JScript Teil startet cscript.exe mit dem eigenen Dateinamen und rennt somit den Player.
Wie du von einem anderen Batchscript die Settingsdatei ändern kannst, habe ich dir gezeigt. Wenn du so etwas machst, musst du darauf achten, dass du die Variablen in jedem Script aktualisierst, bevor du sie änderst und zurückschreibst. Macht die Zeile
Wenn du das nicht tust, nimmt ein anderes Script (z.B. das mit dem JScript) die in diesem Prozess gültigen Variablen und überschreibt Änderungen, die von einem anderen Prozessgemacht wurden.
Keine Ahnung, ob das dein Problem ist, das ist aber das einzige was ich dir so explizit nicht vorgekaut hatte.
Also, die Batchdatei mit dem JScript Teil startet cscript.exe mit dem eigenen Dateinamen und rennt somit den Player.
Wie du von einem anderen Batchscript die Settingsdatei ändern kannst, habe ich dir gezeigt. Wenn du so etwas machst, musst du darauf achten, dass du die Variablen in jedem Script aktualisierst, bevor du sie änderst und zurückschreibst. Macht die Zeile
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"
Wenn du das nicht tust, nimmt ein anderes Script (z.B. das mit dem JScript) die in diesem Prozess gültigen Variablen und überschreibt Änderungen, die von einem anderen Prozessgemacht wurden.
Keine Ahnung, ob das dein Problem ist, das ist aber das einzige was ich dir so explizit nicht vorgekaut hatte.
START lässt Music.bat asynchron laufen. Das heißt, es wird nicht gewartet bis Music.bat beendet wird und das aufrufende Script wird weiter ausgeführt.
Folgendes passiert also:
- die Settings werden verändert
- Music.bat wird asynchron gestartet
- diese startet das JScript mit dem Player asynchron
- gleichzeitig wird soundstop vom ersten Prozess auf 1 gesetzt
- die Pollingschleife des JScripts liest diese neue Einstellung und beendet sich selbst
Folgendes passiert also:
- die Settings werden verändert
- Music.bat wird asynchron gestartet
- diese startet das JScript mit dem Player asynchron
- gleichzeitig wird soundstop vom ersten Prozess auf 1 gesetzt
- die Pollingschleife des JScripts liest diese neue Einstellung und beendet sich selbst
Ich verstehe nur die Hälfte.
Du setzt soundstop=1, wenn du den Player beenden willst. Wenn du danach soundstop=0 setzt, fängt der nicht plötzlich wieder an zu rennen. Vermutlich willst du mit soundplay=0 auf Pause setzen?
Du musst auch nichts mit irgendwelchen Zusatztools verstecken. Music.bat braucht nichts auszugeben, darum kannst du ruhigen Gewissens mit START /B arbeiten. Dann rennen beide Prozesse mit nur einem Fenster. Wird dieses Fenster geschlossen, dann werden beide Prozesse beendet. Und da das JScript überwacht, ob Music.bat noch läuft, wird der Player somit auch beendet. Im Zweifelsfall brauchst du also die Einstellung soundstop=1 niemals.
Du setzt soundstop=1, wenn du den Player beenden willst. Wenn du danach soundstop=0 setzt, fängt der nicht plötzlich wieder an zu rennen. Vermutlich willst du mit soundplay=0 auf Pause setzen?
Du musst auch nichts mit irgendwelchen Zusatztools verstecken. Music.bat braucht nichts auszugeben, darum kannst du ruhigen Gewissens mit START /B arbeiten. Dann rennen beide Prozesse mit nur einem Fenster. Wird dieses Fenster geschlossen, dann werden beide Prozesse beendet. Und da das JScript überwacht, ob Music.bat noch läuft, wird der Player somit auch beendet. Im Zweifelsfall brauchst du also die Einstellung soundstop=1 niemals.
Dann gibt's weniger Missverstädnisse.
Wieso? Meinst du der Code rennt bei mir ohne die anderen Tools und Scripts, die dort eingebunden sind und deren Inhalt ich nicht kenne?"Finding the smallest program that demonstrates the error" is a powerful debugging tool.<< [Bjarne Stroustrup, founder of C++]
Struktur:
│ main.bat
│ Room1.bat
│ Room2.bat
│ Settings.bat
│
└───sound
Music.bat
settings.txt
test.mp3
main.bat
@echo off &setlocal enabledelayedexpansion enableextensions
set title=Testgame
Title %title%
set "settingfile=sound\settings.txt"
echo(&echo rufe Settings.bat auf
call "Settings.bat"
echo(&echo starte Music.bat
start "" /b cmd /c "%cd%\sound\Music.bat"
echo(&echo rufe Room1.bat auf
call "Room1.bat"
echo(&echo Music PAUSE
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"
set "soundplay=0"
set "soundfile=dummy.mp3"
>"%settingfile%" set sound
timeout /t 2
echo(&echo Music PLAY, ggf. Soundfile aendern (ich hab nur test.mp3, aber was soll's)
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"
set "soundplay=1"
set "soundfile=test.mp3"
>"%settingfile%" set sound
echo(&echo rufe Room2.bat auf
call "Room2.bat"
echo(&echo Music STOP
for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"
set "soundstop=1"
>"%settingfile%" set sound
pause
Room1.bat
echo *** I am Room1 ***
timeout /t 10
Room2.bat
echo *** I am Room2 ***
timeout /t 10
Settings.bat
if exist "%settingsfile%" for /f "usebackq delims=" %%i in ("%settingfile%") do set "%%i"
set "soundfile=test.mp3"
set /a "soundvolume=50,soundloop=1,soundplay=1,soundstop=0"
>"%settingfile%" set sound
Music.bat
@if (@a)==(@b) @end /*********** Batch part ***********
@echo off &setlocal
cd /d "%~dp0"
set "settingfile=settings.txt"
start "" /b /wait cscript //nologo //e:jscript "%~f0" "%settingfile%"
exit /b
********** JScript part **********/
var objService = WScript.CreateObject('WbemScripting.SWbemLocator').ConnectServer('.', 'root\\cimv2'),
objFSO = WScript.CreateObject('Scripting.FileSystemObject'),
objPlayer = WScript.CreateObject('WMPlayer.OCX.7'),
objFile, arrLine, strSoundfile;
objPlayer.settings.autoStart = true;
objPlayer.settings.mute = false;
objPlayer.settings.volume = 50;
while (true) {
objFile = objFSO.OpenTextFile(WScript.Arguments(0), 1);
while (!objFile.atEndOfStream) {
arrLine = objFile.ReadLine().split('=');
if (arrLine.length > 1) {
switch(arrLine) {
case 'soundfile':
if (strSoundfile != arrLine[1]) {
strSoundfile = arrLine[1];
objPlayer.URL = strSoundfile;
}
break;
case 'soundloop':
objPlayer.settings.setMode('loop', parseInt(arrLine[1]));
break;
case 'soundplay':
if (parseInt(arrLine[1])) {
objPlayer.controls.play();
} else {
objPlayer.controls.pause();
}
break;
case 'soundstop':
if (parseInt(arrLine[1])) {
objPlayer.close();
WScript.Sleep(100);
WScript.Quit();
}
break;
case 'soundvolume':
objPlayer.settings.volume = parseInt(arrLine[1]);
break;
}
}
}
objFile.Close();
if (objService.ExecQuery('SELECT * FROM Win32_Process WHERE Name=\'cmd.exe\' AND CommandLine LIKE \'%"' + WScript.ScriptFullName.replace(/\\/g, '\\\\') + '"%\'').Count != 1) {
objPlayer.close();
WScript.Sleep(100);
WScript.Quit();
}
WScript.Sleep(500);
}
Versetz dich mal in meine Lage. Ich sitze hier mit der Kristallkugel in der Hand und sehe nichts. Die einzige Informationsquelle für die Helfer in einem Forum, ist der der fragt. Die Antworten auf deine Fragen können also nicht besser sein, als die Informationen die du lieferst.
Es bringt mir nichts, wenn du mir ein Script zur Verfügung stellst, das hunderte Zeilen Code enthält, aber nicht den Fehler repräsentiert, weil es nur ein Teil deines Gesamtpakets ist und bereits beim Versuch es auszuführen wegen ganz anderer Fehler abbricht.
Mir hätten 20 Zeilen Code gereicht, die deinen Fehler reproduzieren, zusammen mit einer Erklärung an welcher Stelle du Hilfe brauchst. Nichts anderes habe ich nun selbst gemacht und dir gezeigt, wie es aussehen könnte. Ob das nun die Lösung für dein Problem war, weiß ich immer noch nicht, da ich mir irgendwas aus den Fingern gesogen habe, was die Aufrufe und den Inhalt der anderen Scripts angeht. Woher soll ich denn wissen, welches nun die 3 Zeilen Code sind, bei denen du ein Problem hattest? Und woher soll ich wissen, ob das Problem tatsächlich in diesem Code steckt und nicht im Zusammenspiel mit den anderen Dateien zu suchen ist? Ich verstehe ja deinen Unmut, aber sorry, wie soll ich denn darauf reagieren? Mir die Arbeit zu ersparen, ein Beispiel zu coden und deine Frage zu ignorieren, wäre natürlich auch eine Option gewesen ...
Es bringt mir nichts, wenn du mir ein Script zur Verfügung stellst, das hunderte Zeilen Code enthält, aber nicht den Fehler repräsentiert, weil es nur ein Teil deines Gesamtpakets ist und bereits beim Versuch es auszuführen wegen ganz anderer Fehler abbricht.
Mir hätten 20 Zeilen Code gereicht, die deinen Fehler reproduzieren, zusammen mit einer Erklärung an welcher Stelle du Hilfe brauchst. Nichts anderes habe ich nun selbst gemacht und dir gezeigt, wie es aussehen könnte. Ob das nun die Lösung für dein Problem war, weiß ich immer noch nicht, da ich mir irgendwas aus den Fingern gesogen habe, was die Aufrufe und den Inhalt der anderen Scripts angeht. Woher soll ich denn wissen, welches nun die 3 Zeilen Code sind, bei denen du ein Problem hattest? Und woher soll ich wissen, ob das Problem tatsächlich in diesem Code steckt und nicht im Zusammenspiel mit den anderen Dateien zu suchen ist? Ich verstehe ja deinen Unmut, aber sorry, wie soll ich denn darauf reagieren? Mir die Arbeit zu ersparen, ein Beispiel zu coden und deine Frage zu ignorieren, wäre natürlich auch eine Option gewesen ...