Nach langer Abstinenz melde ich mich wieder zurück, gleich mit einem (oder zwei) Problemchen:
Mein altes ONAIR-Script, das mir den Streamabbruch sofort signalisiert, funktioniert nur noch zum Teil. Die Grundfunktion des Ändern des Textes im (einfachen) Screenobject-Button funktioniert, allerdings das ändern der Farben nicht.
Hat sich irgendwas geändert, was ich verpasst habe in den letzten zwei Jahren? Mag mir jemand unter die Arme greifen?
Hier mein Code:
procedure OnLoad;
begin
EnableTimer(100);
end;
procedure OnTimer;
begin
if
(Encoder.GetConnections.GetItem(0).GetState = ecsConnected) then begin
if Encoder.GetConnections.GetItem(0).GetState = ecsConnected then
ExecuteCommand(‘ONAIRPRG TEXT ON AIR’);
Mich würden ein paar Hintergründe zum Script interessieren. Sehe ich das richtig, es setzt ein Bildschirmobjekt (Text) je nach Status des Encoders?
ONAIRPRG ist der Name Deines Bildschirmobjektes?
Würde sowas mit einem Button und einem Weiteren Status auch funktionieren?
Mit dem Button möchte ich die Encoder Verbindung ein oder aus schalten können.
Ich würde also folgende stati abfragen wollen:
Encoder aktiv (Also ist der Haken vor dem jeweiligen Eintrag gesetzt oder nicht)
Sendung läuft (Für die Encoder, die auch scharf geschaltet sind)
@Anna_On_Air hatte da mal sowas in der Richtung gebaut, finde ich nur gerade nicht wieder.
EDIT: Ich habe das mal probiert und lande in einem Syntax Error:
procedure OnLoad;
begin
EnableTimer(100);
end;
procedure OnTimer;
begin
if (Encoder.GetConnections.GetItem(0).GetState = ecsConnected) then begin
if Encoder.GetConnections.GetItem(0).GetState = ecsConnected then
ExecuteCommand(‘ONAIRPRG TEXT ON AIR’);
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #FF0000’)
ExecuteCommand(‘ONAIRPRG FONTCOLOR #FFFFFF’)
end
else begin
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #00FF00’)
ExecuteCommand(‘ONAIRPRG FONTCOLOR #000000’)
ExecuteCommand(‘ONAIRPRG TEXT KEINE SENDUNG!’)
if (Encoder.GetConnections.GetItem(0).GetState = ecsConnecting) then begin
ExecuteCommand(‘ONAIRPRG TEXT !OFF AIR!’)
ExecuteCommand(‘ONAIRPRG FONTCOLOR #FFFFFF’)
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #FF0000’)
Sleep(1000);
end;
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #00FF00’)
ExecuteCommand(‘ONAIRPRG FONTCOLOR #000000’)
ExecuteCommand(‘ONAIRPRG TEXT KEINE SENDUNG!’);
end;
end;
begin
end.
Habe das mal versucht etwas anders zu formatieren.
Auf die schnelle sehe ich da ganz viele fehlende Semikola und ein nicht vorhandenes end; (wie kann man etwas fehlendes sehen?) hinter dem ersten … KEINE SENDUNG. Ansonsten müßte man nochmal genau schauen.
Mobile Grüße
TSD
Edit:
Die erste if-Zeile scheint doppelt zu sein.
Dafür fehlt hinter der zweiten das begin.
Hinter alle ExecuteCommand-Zeilen müssen Semikola.
Hinter dem zweiten Dreierblock fehlt ein end;.
Vor dem letzten Dreierblock fehlt eine if-Bedingung
Insgesamt ist mir noch nicht ganz klar, wie das laufen soll. Die beiden KEINE SENDUNG-Blöcke sind gleich. Wäre da nicht folgende Struktur angezeigt?:
// Verkürzte Darstellung!!
begin
if Encoder. = ecsConnected then begin // Wenn eine Bedingung, dann …
ExecuteCommand…;
ExecuteCommand…;
ExecuteCommand…;
end
else if Encoder. = ecsConnecting then begin // Wenn eine andere Bedingung, dann halt …
ExecuteCommand…;
…
…
end
else begin // Ansonsten …
ExecuteCommand…;
…
…
end;
end;
begin
end.
Woher kommen die Variablen ecsConnected und ecsConnecting?
Tip: Einrücken der Zeilen nur mit Leerzeichen, und zwar zweierlesweise. Damit schaut es dann auf jedem Browser/Editor gut aus.
Vielen Dank @Tondose, ich bin ja noch blutiger Anfänger was Scripting angeht aber dann hatte ich zumindest schon mal die richtigen Gedanken dazu.
Der letzte Befehlsblock würde ja auch alles vorherigen if-abfragen überschreiben.
Die erste doppelte if Abfrage hatte ich als Verschachtelung angesehen, der Sinn, erschließt sich mir noch nicht so wirklich.
Da kommt dann das bei raus.
procedure OnLoad;
begin
EnableTimer(100);
end;
procedure OnTimer;
begin
if (Encoder.GetConnections.GetItem(0).GetState = ecsConnected) then begin
ExecuteCommand(‘ONAIRPRG TEXT ON AIR’);
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #FF0000’);
ExecuteCommand(‘ONAIRPRG FONTCOLOR #FFFFFF’);
end;
else begin
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #00FF00’);
ExecuteCommand(‘ONAIRPRG FONTCOLOR #000000’);
ExecuteCommand(‘ONAIRPRG TEXT KEINE SENDUNG!’);
end;
if (Encoder.GetConnections.GetItem(0).GetState = ecsConnecting) then begin
ExecuteCommand(‘ONAIRPRG TEXT !OFF AIR!’);
ExecuteCommand(‘ONAIRPRG FONTCOLOR #FFFFFF’);
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #FF0000’);
Sleep(1000);
end;
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #00FF00’);
ExecuteCommand(‘ONAIRPRG FONTCOLOR #000000’);
ExecuteCommand(‘ONAIRPRG TEXT KEINE SENDUNG!’);
end;
begin
end.
Wenn ich das also entspechend auf die if-bedingungen reduziere, käme das dabei raus:
procedure OnLoad;
begin
EnableTimer(100);
end;
procedure OnTimer;
begin
if (Encoder.GetConnections.GetItem(0).GetState = ecsConnected) then begin
ExecuteCommand(‘ONAIRPRG TEXT ON AIR’);
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #FF0000’);
ExecuteCommand(‘ONAIRPRG FONTCOLOR #FFFFFF’);
end;
else if (Encoder.GetConnections.GetItem(0).GetState = ecsConnecting) then begin
ExecuteCommand(‘ONAIRPRG TEXT !OFF AIR!’);
ExecuteCommand(‘ONAIRPRG FONTCOLOR #FFFFFF’);
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #FF0000’);
Sleep(1000);
end;
else begin
ExecuteCommand(‘ONAIRPRG BACKGROUNDCOLOR #00FF00’);
ExecuteCommand(‘ONAIRPRG FONTCOLOR #000000’);
ExecuteCommand(‘ONAIRPRG TEXT KEINE SENDUNG!’);
end;
end;
begin
end.
Steht so oben im Quelltext.
Das einleitenden und das ausleitende ist jeweils auch falsch. Ich liebe das massenersetzen in Notebad++.
Nun hängt es bei der else if. "Identifier Expected"
Danke, genau da habe ich regelmässig Probleme. Wo gehört ein Semikolon hin und wo nicht.
Hab’s gleich bei den else blöcken auch raus genommen und nun läuft es. Danke!
procedure OnLoad;
begin
EnableTimer(100);
end;
procedure OnTimer;
begin
if (Encoder.GetConnections.GetItem(0).GetState = ecsConnected) then begin
ExecuteCommand('ONAIRPRG TEXT ON AIR');
ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #FF0000');
ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
end
else if (Encoder.GetConnections.GetItem(0).GetState = ecsConnecting) then begin
ExecuteCommand('ONAIRPRG TEXT !OFF AIR!');
ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #FF0000');
Sleep(1000);
end
else begin
ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #00FF00');
ExecuteCommand('ONAIRPRG FONTCOLOR #000000');
ExecuteCommand('ONAIRPRG TEXT KEINE SENDUNG!');
end;
end;
begin
end.
Yep, kaum macht man’s richtig, geht’s! Wobei eigentlich beim vorletzten end ein Semikolon stehen müßte.
Diese Un-Semikola kommen in den if-Abfragen vor else oder else if vor (bzw. eben nicht). Kann man sich als Grundsatz merken. Bei der case-Anweisung allerdings ist das anders. Hat wohl ein Nerd erfunden.
Wie lautet der Befehl, zum auslesen ob ein Encoder eingeschaltet ist?
Also der weitere Status, den ich hier brauche. if (Encoder.GetConnections.GetItem(0).GetState = Enabled) Stimmt das vielleicht zufällig?
Und um’s noch etwas weiter zu treiben, würde ich gerne den Namen/ die Beschreibung lesen. Entweder das was im Konfigurationsdialog angezeigt wird oder falls im Erweiterten Tab unter Benutzerdefinierter Bezeichnung etwas eingetragen ist, dann das.