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.
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?
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.
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.
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.)
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.
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.
Könntest Du nochmal folgendes probieren?: Edit: Unnötig, so geht es auch nicht – siehe unten.
type
TEncoderName: array[0 .. 4] of string;
const
iMax = 4; // Hier die maximale Senderanzahl minus 1 einsetzen
EncoderName : TEncoderName = ('SWR', 'HR', 'RIAS', 'NDR', 'Aircheck');
// Hier die Bezeichnungen der Reihe nach eintragen
var
i: integer;
procedure OnLoad;
EnableTimer(100);
...
Ist auch von der von mir zitierten Seite, ein Beispiel tiefer.
Also: Ich wurde investigativ tätig und habe aus „gewöhnlich gut unterrichteten Kreisen“ erfahren, daß dieser Befehl tatsächlich nicht funktioniert. Die Scripting-Engine ist Delphi zwar äußerst ähnlich, aber eben doch nicht so, daß alle Syntax eins zu eins abgebildet wird. Und dies ist wohl so ein Fall, der von nicht alles betroffen ist.
Durch diesen Thread hier: Darstellung der Umlaute
Habe ich noch mal in der Scripting Help gesucht und nun endlich, die passende Abfrage gefunden, wie ich die selbst gesetzte Beschreibung lesen kann.
Weiterhin mit eingeflossen sind aus diesem Thread: Ansteuerung des OnAirScreen
Die RuntimeData zur Übergabe an ein weiteres Script, welches den OnAirScreen ansteuert.
Die Auskommentierte Zeile zeigt, wie man zusätzlich noch die Höreranzahl mit darstellen kann.
const
iMax = 4; // Hier die maximale Senderanzahl minus 1 einsetzen
var
EncoderErrorCount,EncoderOldCount,EncoderCount, i: integer;
EncoderName: array[0 .. iMax] of string;
procedure OnLoad;
begin
EnableTimer(800);
EncoderOldCount := 0;
end;
procedure OnTimer;
begin
EncoderOldCount := EncoderCount;
EncoderCount := 0;
EncoderErrorCount := 0;
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 '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' ON AIR Hörer: '+ IntToStr(Encoder.GetConnections.GetItem(i).GetListeners));
ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' ON AIR');
ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
EncoderCount := EncoderCount + 1;
end
else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' !OFF AIR!');
ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
EncoderCount := EncoderCount + 1;
EncoderErrorCount := EncoderErrorCount + 1;
end
else begin
ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #00FF00');
ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' READY!');
end
end
else begin
ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #F0F0F0');
ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #848484');
ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' AUS');
end;
end;
if EncoderCount = 0 then begin
SetRuntimeData('EncoderStatus', 'false');
end
else begin
SetRuntimeData('EncoderStatus', 'true');
end;
if EncoderErrorCount = 0 then begin
SetRuntimeData('EncoderError', 'WARN:');
end
else begin
SetRuntimeData('EncoderError', 'WARN:Encoder Fehler!');
end;
end;
begin
end.
Da ich abseits des Forums wieder gefragt wurde: Gibt es irgendeine Aussicht, diese Funktion einst gebaut zu bekommen? Ist sicher für viele interessant.
Ich entstaube das mal, weil ich gerne eine weitere Funktion in dem Ur-Skript hätte - so denn machbar - und zwar, das der Butten anfängt, nervös zu blinken wenn die Verbindung abreisst. Ähnlich wie hier.
Ist das umsetzbar? Zur Verdeutlichung “mein” Original-Skript:
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 #FFFFFF');
ExecuteCommand('ONAIRPRG TEXT EDIT');
end;
end;
begin
end.
Ich sollte langsam mal anfangen, das Skripten selbst zu begreifen…