"Altes" ONAIR-Script funktioniert nur noch teilweise

Mahlzeit!

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’);

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.

Mit welcher mAirList-Version bist Du denn unterwegs und mit welcher funktionierte Dein Skript?

Feststellende Grüße

TSD

mAirList ist wie immer aktuell und das Skript funktionierte mit der 6.0 noch vor cirka zwei Jahren. Genauer kann ich es leider nicht mehr sagen… :frowning:

schubs… Ich stehe leider immer noch auf dem Schlauch. Wäre nett, wenn jemand eine Idee hat und die mir mitteilen mag.

Liebe Grüsse!

Kommando zurück! :wink:

Das Problem sass mal wieder vor dem Bildschirm. Das Screenobject muss vom Typ “Statischer Text” sein, kein Button!!!

Blond und doof! :smiley:

Aber nicht zu doof um den Fehler zu entdecken! Danke für die Rückmeldung.

Erkannte Grüße

TSD

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.

Führt aber immer noch zu einem Syntax error.

Was sagt er denn dazu, der Error?

06.06.2019 15:31:43 Fehler       Fehler beim Laden des Hintergrund-Scripts C:\ProgramData\mAirList\6.1\ON-AIR.mls: [Error] (9:22): Syntax error

[Error] (9:22): Syntax error

Zeile 9, Spalte 22: Es sieht so aus, als hättest Du den falschen Apostrophen/Hochkomma erwischt: und statt '. (Autokorrektur?)

Verwechselte Grüße

TSD

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"

Vor dem else if kein Semikolon am end. Und vor dem else auch nicht.

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.

Verwirrte Grüße

TSD

Danke, ich habe das im vorherigen Beitrag mal aktualisiert.

Das liegt wohl daran, daß @Scrat den Code nicht als solchen gepostet hat, und schon macht unsere clevere Forensoftware das falsche draus.

K*ckautomatische Grüße

TSD

Wenn ich das jetzt mal weiter spinne und mit dem hier: Anzeige der aktiven Verbindungen des Encoders Verknüpfe…

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.

Ich habe das hier entdeckt:

Encoder.GetConnections.GetItem(1).GetEnabled = true

Gefundene Grüße

TSD