Programmcode Befehle Syntax Beispiele

Aus PC_DIMMER
Version vom 3. Juni 2022, 09:44 Uhr von Dg3nec (Diskussion | Beiträge) (ORD() - ASCII ermitteln)
Wechseln zu: Navigation, Suche

Programmcode Befehle Syntax Beispiele

Vorwort:

Seit 05/2022 gibt es Code-Szenen in der Szenenverwaltung. Vorher konnte Code nur bei einem Button im Kontrolpanel hinterlegt werden. Dieses Tutorial ist deshalb vermutlich für beides gültig.
Hier werden die Befehle beschrieben die in einer Code-Szene verwendet werden können. Es wird auch auf Delphi Befehle eingegangen. Möglichst immer mit einem Beispiel. Ich erweitere dieses Tutorial Befehl für Befehl. Immer dann wenn ich den Befehl in der Praxis selbst probiert habe. Eine Kurzhilfe hat Christian jeweils im "Edit-Modus" hinterlegt.

Grundlegendes

CodeSzene - Prinzipieller Aufbau

Sobald eine neue CodeSzene in der Szenenverwaltung hinzugefügt wird beinhaltet sie bereits diesen grundlegenden Programmcode. Eueren Programmcode schreibt ihr in die "procedure StartScene;" zwischen "begin" und "end;". Als Beispiel ist ein Befehl (rot markiert) dort zu finden.

Vieleicht schreibt Christian was zu "procedure InitScene;" und "procedure StopScene;". Ich müsste raten.

interface
procedure InitScene;
procedure StartScene;
procedure StopScene;
implementation

procedure InitScene;
begin
end;

procedure StartScene;
begin
  ShowMessage('Hello World');
end;

procedure StopScene;
begin
end;

end.

Zeile mit ; abschließen

Jede Programmcode Zeile muss mit ; (Strichpunkt) enden. Der Hintergrund ist, dass der Programmcode nicht Zeilenweise abgearbeitet wird. Der Strichpunkt löst die Befehlsabarbeitung aus.

Sollte man diesen vergessen, vermischt der Befehlsinterpreter euren Code. Es kommt zu den irrsinnigsten Fehlermeldungen.

Es gibt jedoch Ausnahmen. Befehle die wiederum Code enthalten. Zum Beispiel "if". Dieser Code wird meist in geschweifte Klammern gesetzt.

 for (int i=0;i<10;i++)
   if( values[i]>0&&values[ i+1 ]>0 )
   {
     out.println ("found!");
     break;
   }

// Bemerkung

Es ist sehr empfehlenswert Bemerkungen im Code zu hinterlassen. Eine Bemerkung wird mit // gestartet. Es ist kein ; als Abschluss notwendig. Die Bemerkung endet mit dem Zeilenende (Umbruch) automatisch. Kann auch hinter einer Befehlszeile angewendet werden.

procedure StartScene;
begin
  // Mein erster Code    
  ShowMessage( 'Hello World' ); // Eine Messagebox
   
end;

Befehle

PCDimmer

get_globalvar() - globale Variable lesen

Der Befehl (Funktion) get_global(variableNummer) gibt die globale Variable typ Variant zurück die unter "variableNummer" abgelegt ist. Wurde die globale Variable vorher nicht mit get_global(variableNummer, inhalt) gesetzt so ist diese leer.

procedure StartScene;
  var variableNummer, testVariable:variant;
begin
  variableNummer := 5;
  testVariable := get_globalvar(variableNummer);
  ShowMessage( 'Inhalt Variable ' + VarToStr(variableNummer) + ': ' + VarToStr(testVariable) );
end;

get_lastmidi() - letzen MIDI Input abfragen

Der Befehl (Funktion) get_lastmidi() gibt einen String zurück mit drei Zeichen Länge. Die drei Zeichen sind MIDI_MSG, MIDI_Data1 und MIDI_Data2. Im Beispiel wird gezeigt wie man diese zerrlegt und in eine Zahl umwandelt.

procedure StartScene;
  var
  MIDI_last_MSG, MIDI_last_Data1, MIDI_last_Data2, MIDI_last_in:variant;
begin
  MIDI_last_in := get_lastmidi());
  MIDI_last_MSG := Ord(Copy(MIDI_last_in,1,1); 
  MIDI_last_Data1 := Ord(Copy(MIDI_last_in,2,1));
  MIDI_last_Data2 := Ord(Copy(MIDI_last_in,3,1));
   
  ShowMessage( IntToStr(MIDI_last_MSG) + '-' + IntToStr(MIDI_last_Data1) + '-' + IntToStr(MIDI_last_Data2));
   
end;

ShowMessage() - Nachrichtenbox anzeigen

Der Befehl ShowMessage() erzeugt eine Nachrichtenbox (kleines Fenster) mit einem Button "OK". Die Box wird mit klick auf "OK" geschlossen. Die Nachricht wird als String übergeben.

procedure StartScene;
begin
  ShowMessage('Hello World');
end;

procedure StopScene;
begin
end;

Delphi / Pascal

COPY() - Substring aus String

Der Befehl COPY(source, ab Position, Zeichenzahl) gibt einen String zurück der anhand der Parameter definiert ist. Im Beispiel wird der letzte MIDI Input (String, drei Zeichen lang) zerrlegt in einzelne Strings (Länge 1).

procedure StartScene;
  var
  MIDI_last_MSG, MIDI_last_Data1, MIDI_last_Data2, MIDI_last_in:variant;
begin
  MIDI_last_in := get_lastmidi();
  MIDI_last_MSG := Ord(Copy(MIDI_last_in,1,1)); 
  MIDI_last_Data1 := Ord(Copy(MIDI_last_in,2,1));
  MIDI_last_Data2 := Ord(Copy(MIDI_last_in,3,1));
   
  ShowMessage( IntToStr(MIDI_last_MSG) + '-' + IntToStr(MIDI_last_Data1) + '-' + IntToStr(MIDI_last_Data2));
   
end;

IntToStr() - Variable Integer zu String umwandeln

Der Befehl IntToStr(integer) gibt einen String zurück. Im Beispiel wird der letzte MIDI-ASCII-Wert (abgelegt als Integer) umgewandelt nach String da ShowMessage() nur String aktzeptiert.

procedure StartScene;
  var
  MIDI_last_MSG, MIDI_last_Data1, MIDI_last_Data2, MIDI_last_in:variant;
begin
  MIDI_last_in := get_lastmidi();
  MIDI_last_MSG := Ord(Copy(MIDI_last_in,1,1)); 
  MIDI_last_Data1 := Ord(Copy(MIDI_last_in,2,1));
  MIDI_last_Data2 := Ord(Copy(MIDI_last_in,3,1));
   
  ShowMessage( Ord(IntToStr()MIDI_last_MSG)) + '-' + Ord(IntToStr()MIDI_last_Data1)) + '-' + Ord(IntToStr()MIDI_last_Data2)));
   
end;

ORD() - ASCII ermitteln

Der Befehl ORD(string) gibt ein Integer zurück der dem ASCII Code des Strings entspricht. Im Beispiel wird der letzte MIDI Input (String mit drei Zeichen) zerrlegt und das Zeichen nach ASCII umgewandelt - was dem MIDI-Wert entspricht.

procedure StartScene;
  var
  MIDI_last_MSG, MIDI_last_Data1, MIDI_last_Data2, MIDI_last_in:variant;
begin
  MIDI_last_in := get_lastmidi();
  MIDI_last_MSG := Ord(Copy(MIDI_last_in,1,1)); 
  MIDI_last_Data1 := Ord(Copy(MIDI_last_in,2,1));
  MIDI_last_Data2 := Ord(Copy(MIDI_last_in,3,1));
   
  ShowMessage( IntToStr(MIDI_last_MSG) + '-' + IntToStr(MIDI_last_Data1) + '-' + IntToStr(MIDI_last_Data2));
   
end;

random () - Zufallszahl

Die Funktion random(maxWert) gibt eine pseudo Zufallszahl zurück. Der Rückgabewert liegt zwischen 0 und maxWert+1. Wird kein maxWert übergeben, so erhält man einen Rückgabewert zurück zwischen 0 und 1. Im Beipiel wird die Drehrichtung angepasst (bei gleicher Geschwindigkeit) um für Abwechslung zu sorgen. Das Gerät hat eine Typischen DMX Kanal bei dem Geschwindigkeit und Drehrichtung auf einem DMX-Kanal liegen. Langsam(links)-Schnell(links)-AUS-Schnell(rechts)-Langsam(rechts).

  // Gerätewert alt ermiteln
  Geraet_WertAlt:=get_channel(Geraet_ID, Geraet_Kanal);  
  // Berechnung des neuen Gerätewertes
  Geraet_WertNeu:=(Geraet_Max-Geraet_Min)*(BPMKanal_Wert/255)+Geraet_Min;
  Geraet_WertAnAus:=get_channel(Geraet_ID, 'SHUTTER');
  // Drehung invertieren per Zufall
  if random(100)>50 then begin
    Geraet_WertNeu:=(120-Geraet_WertNeu)+135;
  end;
  // Wert an Gerät ausgeben
    if Geraet_WertAnAus >0 then begin
      set_channel(Geraet_ID, Geraet_Kanal, Geraet_WertAlt, Geraet_WertNeu, Geraet_Fadetime);  
    end else begin
      set_channel(Geraet_ID, Geraet_Kanal, Geraet_WertAlt, 0, Geraet_Fadetime);
    end;

var - Variablen declaration

Mit dem Befehl "var" werden die Viariablen deklariert. Dies muss gemacht werden. Ansonsten kommt es zu Fehlern. Die Variablen sind nur innerhalb des Codes gültig und werden vor dem eigentlichem Code definiert. Der Inhalt der Variablen wird nicht dauerhaft gespeichert. Ist somit beim nächsten Aufruf nicht mehr gesetzt. Weiterhin muss am Ende durch : getrennt der Variablentyp angegeben werden. Typisch wäre "integer", "real", "boolean" und "string". Am flexibelsten ist allerdings "variant". Dieser ändert sich je nach Verwendung automatisch. Man muss also etwas mitdenken! Benötigt man verschiede Typen an Variablen so muss der Befehl "var" pro Typ einmal verwendet werden.

procedure StartScene;
  var MIDI_last_MSG, MIDI_last_Data1, MIDI_last_Data2, MIDI_last_in:variant;
begin
  MIDI_last_in := get_lastmidi();
  MIDI_last_MSG := Ord(Copy(MIDI_last_in,1,1)); 
  MIDI_last_Data1 := Ord(Copy(MIDI_last_in,2,1));
  MIDI_last_Data2 := Ord(Copy(MIDI_last_in,3,1));
   
  ShowMessage( IntToStr(MIDI_last_MSG) + '-' + IntToStr(MIDI_last_Data1) + '-' + IntToStr(MIDI_last_Data2));
   
end;