"Altes" ONAIR-Script funktioniert nur noch teilweise

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

Danke! Wald, Bäume und so… Hätte ich eigentlich auch selber drauf kommen müssen.

Da hätten wir dann schon mal sowas:

{
Zwischen die geschweiften Klammern kann der Spickzettel hin, z.B.:

1: SWR, 2: HR, 3: RIAS.
4: NDR, 5: RB; 6: ORF
usw.
}

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

var
  i: integer;

procedure OnLoad;
  begin
    EnableTimer(100);
  end;

procedure OnTimer;
  begin
    for i := 0 to iMax do
      begin
	    if (Encoder.GetConnections.GetItem(i).GetEnabled = true) then begin
          if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT ON AIR');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            end	
          else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT !OFF AIR!');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            Sleep(1000);
            end  
          else begin
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #00FF00');
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT READY!');
	        end
	      end
      else begin
	    ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #F0F0F0');
	    ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
	    ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT AUS');
	    end;
	  end;
	end;  
	
  

begin
end.

Man bemerke, ich habe 5 Textobjekte mit den Namen ENCODER0 bis ENCODER4 anlgelgt, nicht mehr ONAIRPRG, wie im Beispiel von @Myka.

EDIT: Sieht dann erst mal so aus:
grafik

Super! Allerdings: Auch hier, beim drittletzten end, fehlt das Semikolon. Immer vor den else kommt keins.

Pingelige Grüße

TSD

Korrigiert, danke. Wenn ich jetzt noch die Namen der jeweiligen Encoder lesen könnte, dann könnte man die mit dazu schreiben.
Gibt es eigentlich eine elegantere Lösung ausser eine Zeitschleife zu nutzen und immer wieder den Status zu pollen?

OnEcoderStatusChange, das wäre was!

Anregende Grüße

TSD

Die Frage kann ich mir warscheilich selber beantworten.
Ich habe noch mal etwas im Forum gewühlt, diese Suchfunktion ist wirklich klasse und extrem hilfreich.

Ich vermute also mal das Procdure onEncoderIRGENDWAS noch nicht implementiert wurde.

Kommen wir also zurück zur Benennung der Streams.
Dazu stehen doch ein paar Dinge in der Scripting Help.

Ich bin mir allerdings gerade nicht sicher, muss ich jetzt anfangen, zwischen verschiedenen Encoder Typen zu unterscheiden? GetCustomCaption, wäre schon mal etwas, was scheinbar in die richtige Richtung geht.

Alternativ könnte man ja auch erstmal ein Zweidimensionales Array mit einer Namenszuordnung zu Encoder Nummer.
Ich habe da mal was aus Deinem Tutorial abgeleitet @Tondose

{
Zwischen die geschweiften Klammern kann der Spickzettel hin, z.B.:

1: SWR, 2: HR, 3: RIAS.
4: NDR, 5: RB; 6: ORF
usw.
}

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

var
  i: integer;
  EncoderName: array[0 .. iMax] of string;

procedure OnLoad;
  begin
    EnableTimer(100);
  end;

procedure OnTimer;
  begin
  	EncoderName[0] := 'SWR';
	EncoderName[1] := 'HR';
	EncoderName[2] := 'RIAS';
	EncoderName[3] := 'NDR';
	EncoderName[4] := 'Aircheck';

    for i := 0 to iMax do
      begin
         if (Encoder.GetConnections.GetItem(i).GetEnabled = true) then begin
          if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' ON AIR');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            end	
          else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' !OFF AIR!');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            Sleep(800);
            end  
          else begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #00FF00');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' READY!');
            end
          end
      else begin
           ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #F0F0F0');
           ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #848484');
           ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' AUS');
           end
	  end;
	end;  
	
  

begin
end.

Ich fühle mich so weise …

Wegweisende Grüße

usw.


Nein, Blödsinn. Um mal wieder mit Wattebäuschchen zu schmeißen: Das Array ist tatsächlich eindimensional, aber sonst sieht der Code soweit brauchbar aus. @Torben kommt aber gewiß gleich mit der procedure-Keule und kloppt den Code nochmal zusammen. Etwa so:


const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

var
  i: integer;
  EncoderName: array[0 .. iMax] of string;

procedure OnLoad;
  begin
    EncoderName[0] := 'SWR';
    EncoderName[1] := 'HR';
    EncoderName[2] := 'RIAS';
    EncoderName[3] := 'NDR';
    EncoderName[4] := 'Aircheck';
    EnableTimer(100);
  end;

procedure SetEncoderButton(Index : integer; Name, Status, Farbe, Textfarbe : string);
  begin
    ExecuteCommand('ENCODER' + IntToStr(Index) + ' TEXT ' + Name + ' ' + Status);
    ExecuteCommand('ENCODER' + IntToStr(Index) + ' BACKGROUNDCOLOR ' + Farbe);
    ExecuteCommand('ENCODER' + IntToStr(Index) + ' FONTCOLOR ' + Textfarbe);
  end;

procedure OnTimer;
  begin

    for i := 0 to iMax do
      begin
        if (Encoder.GetConnections.GetItem(i).GetEnabled = true) then begin
          if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then
            SetEncoderButton(i, EncoderName[i], 'ON AIR', '#FF0000', '#FFFFFF')
          else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
            SetEncoderButton(i, EncoderName[i], '!OFF AIR!', '#FFFFFF', '#FF0000');
            Sleep(800);
          end  
          else
            SetEncoderButton(i, EncoderName[i], 'READY!', '#000000', '#00FF00');
          end;
        end
        else 
          SetEncoderButton(i, EncoderName[i], 'AUS', '#F0F0F0', '#848484');
        end;
      end;

  end;  

begin
end.

Ungetestet, aus reinem Übermut entstanden! (Wahrscheinlich habe ich wieder irgendwo ein entscheidendes ; vergessen …) Die Zuordnung der Sendernamen habe ich in die OnLoad gepackt, die braucht man nicht alle Zehntelsekunde neu setzen. Den Spickzettelquatsch habe ich der Kürze halber mal weggelassen.

Kühne Grüße

TSD

Ich fand’ das auch nicht glücklich, war mir aber nicht ganz sicher ob die Definition, übergreifend funktioniert. Again what learned… :stuck_out_tongue:

Solange Du innerhalb des Skriptes bleibst, gelten die Variablen, die Du unter var definierst, für das gesamte Skript. Diese Variablen sind erstmal leer, undefiniert, und werden dann an anderer Stelle des Skripts, eben wenn OnLoad aufgerufen wird, initialisiert, d. h. mit Leben Inhalt versehen. (Sollen Werte nach außerhalb, also an andere Skripte, weitergegeben werden, so mußt Du SetRuntimeData verwenden.)

Deklarierte Grüße

TSD

Gerade gefunden – es geht noch einfacher aber so geht es nicht (siehe unten):

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

  EncoderName : array[0 .. iMax] of string = ('SWR', 'HR', 'RIAS', 'NDR', 'Aircheck');
                           // Hier die Bezeichnungen der Reihe nach eintragen
var
  i: integer;

procedure OnLoad;
    EnableTimer(100);


procedure SetEncoderButton(Index : integer; Name, Status, Farbe, Textfarbe : string);
  begin

   // usw., Rest wie oben.


Gesparte Güße

TSD

Da bekomme ich eine Fehlermeldung:

Fehler beim Laden des Hintergrund-Scripts C:\ProgramData\mAirList\6.1\ON-AIR.mls: [Error] (12:15): is (‘=’) expected

Die Position 12:15 ist der Doppelpunkt hinter EncoderName
Und wenn ich das auf ein = ändere, wird 2 Zeichen Später, ein Syntax error daraus.

Oha! Ich habe es hieraus, und das sollte eigentlich stimmen. Hmm … (Kann mich im Moment aber nicht kümmern.)

Hungrige Grüße

TSD

Ich habe das hier gefunden. Da wird darüber geschrieben, dass man so eine Enumerated Array über eine for schleife befüllen soll.
Vielleicht ist die Scripting engine eher auf diesem (anscheinend etwas älteren) Level.

So könnte man doch den iMax als Konstante einsparen und einfach die Liste der Namen zählen und dann das Array bauen.

Das ist auch insoweit richtig, als daß es auf dieser Seite ausschließlich um Variablen-Arrays geht. Was ich vorgeschlagen hatte, ist ein Array mit Konstanten, die sich an und für sich schon bei der Deklaration befüllen lassen sollten, wie einfache Konstanten auch. Ich fürchte, hier muß @Torben nochmal einen Blick drauf werfen.

Satte Grüße

TSD