Scripting-Hilfe: Sequentielles Schalten

So umfangreich die Funktionen in mAirList auch sind, so fehlt doch immer wieder mal das eine oder andere Feature für den gewünschten Zweck. Macht aber nichts, denn genau hierfür gibt es die Scripting-Engine, mit welcher die Möglichkeiten in mAirList noch wesentlich umfangreicher werden als ohnehin schon. Also:

Sequentielles Schalten.

Es kam die Frage auf, ob man auf den Druck einer einzigen Taste hin nicht nur zwischen zwei Zuständen (START/STOP) wechseln, sondern mehrere Befehle nacheinander geben kann, die sich jeweils in ihrer Reihenfolge wiederholen. Ja, geht:

const
  max = 3;                          // <-- Hier die maximale Anzahl der Befehle eingeben.

var
  i, k: integer;
  Ausloeser: string
  Befehl: array[0..max] of string;


procedure OnLoad;
begin
  Ausloeser := '<Steuerbefehl>';    // <-- Hier den Tastenbefehl in Hochkommas eintragen. 
  Befehl[1] := '<erster Befehl>';   // <-- Hier den ersten zu schaltenden Befehl in Hochkommas eintragen.
  Befehl[2] := '<zweiter Befehl>';  // <-- Hier den zweiten …
  Befehl[3] := '<dritter Befehl>';  // <-- … und hier den dritten.
                                    // <-- Bei mehr Befehlen entsprechende Zeilen dazuschreiben.
  k := 1;
end;


procedure OnExecuteCommand(Command: string);
begin
  if Command = Ausloeser then begin
    k := k + 1;
      if k = max + 1 then
        k := 1;
    ExecuteCommand(Befehl[k]);
  end;
end;


begin
end.

'<Steuerbefehl>' ist der Befehl, der in der Systemsteuerung der betreffenden Taste zugeordnet wird. Dies kann eine beliebige Zeichenfolge sein. (Also natürlich keine, die schon von einem in mAirList bereits eingebauten Befehl besetzt ist!). Sagen wir fürs spätere Beispiel vielleicht 'WEITERSCHALTEN'.

'<erster Befehl>' usw. sind die Befehle, die nacheinander abgearbeitet werden sollen. Bei mehr als drei Befehlen die Konstante max ebenfalls anpassen und entsprechend viele Zeilen mit fortlaufendem Index dazuschreiben. (Bei nur zwei Befehlen max = 2 setzen und die letzte Befehlszeile löschen.)

Und schon kann’s losgehen! Damit es nicht ganz so theoretisch ist, hier ein Beispiel. Es werden, wenn man eine Taste drückt, drei Buttons (BUTTON.1 usw.) der Reihe nach ein- und danach alle ausgeschaltet. Dabei soll jeweils nur ein Button leuchten. (Die betreffende Taste sei wie oben belegt worden.) Alle Tasten werden zum Programmstart dunkel geschaltet:

const
  max = 4;

var
  i, k: integer;
  Ausloeser: string;
  Befehl: array[0..max] of string;


procedure OnLoad;
begin
  Ausloeser := 'WEITERSCHALTEN';
  Befehl[1] := 'BUTTON.1 ON; BUTTON.2 OFF; BUTTON.3 OFF';
  Befehl[2] := 'BUTTON.1 OFF; BUTTON.2 ON; BUTTON.3 OFF';
  Befehl[3] := 'BUTTON.1 OFF; BUTTON.2 OFF; BUTTON.3 ON';
  Befehl[4] := 'BUTTON.1 OFF; BUTTON.2 OFF; BUTTON.3 OFF';
  for i := 1 to max - 1 do
    ExecuteCommand('BUTTON.' + IntToStr(i) + ' OFF');
  k := 1;
end;


procedure OnExecuteCommand(Command: string);
begin
  if Command = Ausloeser then begin
    k := k + 1;
      if k = max + 1 then
        k := 1;
    ExecuteCommand(Befehl[k]);
  end;
end;


begin
end.

Zur Erinnerung (bzw. zur Erklärung für diejenigen, die’s noch nicht gewußt hatten): Verschiedene Befehle können (nicht nur in Skripten, auch in der Konfiguration!) durch Semikola getrennt eingegeben werden. Sie werden dann nacheinander abgearbeitet. Sollen die Befehle nicht unmittelbar aufeinanderfolgen, kann man den Befehl SLEEP(<Zeit>) dazwischen setzen, der eine Pause von <Zeit> Millisekunden erzeugt.

Durchgeschaltete Grüße

TSD