Super! Allerdings: Auch hier, beim drittletzten end
, fehlt das Semikolon. Immer vor den else
kommt keins.
Pingelige Grüße
TSD
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
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.
Ungläubige Grüße
TSD
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.
99%ige Grüße
TSD
Danke für die Info. Über die Geschichte mit dem Type, war ich dann auch noch gestolpert.
Die Scripting-Engine ist Delphi zwar äußerst ähnlich, aber eben doch nicht so, daß alle Syntax eins zu eins abgebildet wird.
Das hatte ich eben auch immer noch im Hinterkopf.
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.
Im Prinzip müsste die Funktion, die ich [@Torben, TSD] einbauen müsste, OnEncoderConnectionStatusChange heißen und für jede Verbindung einzeln aufgerufen werden.
Da ich abseits des Forums wieder gefragt wurde: Gibt es irgendeine Aussicht, diese Funktion einst gebaut zu bekommen? Ist sicher für viele interessant.
Nützliche Grüße
TSD
Moin!
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…
Ich hab’s mal in den Sektor “Scripts” verschoben.
Wollte ich auch schon vorschlagen…