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:
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
Die Zuordnung der Sendernamen habe ich in die
OnLoad
gepackt, die braucht man nicht alle Zehntelsekunde neu setzen.
Ich fand’ das auch nicht glücklich, war mir aber nicht ganz sicher ob die Definition, übergreifend funktioniert. Again what learned…
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