Unterschiede zwischen DelphiScript und Delphi

Unterschiede zwischen DelphiScript und Delphi

Dieser Abschnitt behandelt die wesentlichen Unterschiede zwischen der Skriptsprache DelphiScript und der Programmiersprache Delphi von Embarcadero sowie deren Auswirkungen auf die Altium Designer-API.

Das Skriptsystem von Altium Designer verwendet die typfreie Sprache DelphiScript, sodass es in Skripten keine Datentypen gibt. Sie können zwar Variablen und deren Typen deklarieren sowie die Typen für Funktionen/Prozeduren oder Methodenparameter aus Gründen der Lesbarkeit angeben, doch DelphiScript konvertiert nicht deklarierte Variablen bei der Ausführung eines Skripts. So können Sie beispielsweise keine Datensätze oder Klassen definieren.

DelphiScript-Variablen

Alle Variablen in einem Skript sind vom Typ „Variant“, und Typangaben in einer Variablendeklaration werden ignoriert und können weggelassen werden. Die folgenden drei Deklarationen sind also korrekt:

Var
a : Integer;
 
Var
b : Integer;
 
Var
  c, d;

Auch Typangaben für Parameter in einer Prozedur- oder Funktionsdeklaration werden ignoriert und können weggelassen werden. Dieser Code ist beispielsweise korrekt:

Function Sum(a, b) : Integer;
Begin
  Result := a + b;
End;

Im Allgemeinen können Varianten verwendet werden, um beliebige Datentypen zu speichern und zahlreiche Operationen sowie Typkonvertierungen durchzuführen. Ein Variant wird zur Laufzeit typgeprüft und ausgewertet. Der Compiler gibt keine Warnung vor möglichen Fehlern im Code aus, die nur durch umfangreiche Tests aufgedeckt werden können. Insgesamt können die Codeabschnitte, die Variants verwenden, als interpretierter Code betrachtet werden, da viele Operationen erst zur Laufzeit aufgelöst werden können. Dies kann sich auf die Geschwindigkeit des Codes auswirken.

Das hat zur Folge, dass eine Variant-Variable, sobald sie deklariert wurde und einen Variant-Wert angenommen hat, in jeden kompatiblen oder inkompatiblen Datentyp kopiert werden kann:

Var
V;
Begin
  // variable V can be assigned values of several different types:
  V := 10;
  V := 'Hello, World';
  V := 45.55;
End;

Wurde einer Variablen ein inkompatibler Datentyp zugewiesen, führt der DelphiScript-Interpreter, soweit möglich, eine Konvertierung durch. Andernfalls wird ein Laufzeitfehler ausgegeben. In der Praxis speichert eine Variant neben den Daten auch Typinformationen, sodass DelphiScript langsamer ist als der entsprechende kompilierte Embarcadero Delphi-Code.

Sets in Skripten

DelphiScript verfügt nicht über Set-Typen und unterstützt keine Set-Operatoren, im Gegensatz zur Sprache Delphi, die über Set-Typen verfügt und Set-Operatoren unterstützt.

Um Sets in DelphiScript-Skripten zu verwenden, nutzen Sie die integrierten Funktionen, die Sets in einem Skript bearbeiten.

Weitere Informationen finden Sie im Eintrag „Verwendung von Mengen in DelphiScript“

Interne Funktionen oder Prozeduren

Wenn Sie erwägen, Funktionen und Prozeduren inside eine Funktion oder Prozedur, empfiehlt es sich, eigenständige Funktionen/Prozeduren zu schreiben – obwohl rekursive Prozeduren/Funktionen zulässig sind.

Der folgende Funktionsausschnitt wird nicht empfohlen:

Function A
Function B
Begin
// blah
End;
Begin
B;
End;

Empfohlene Funktionsstruktur:

Function B
Begin
// blah
End;

Function A
Begin
B;
End;

Schlüsselwort „Result“

Verwenden Sie das Result Schlüsselwort, um den Rückgabewert innerhalb eines Funktionsblocks festzulegen. Beispiel:

Function Foo : String;
Begin
Result := 'Foo Foo';
End;

Verschachtelte Routinen

Verschachtelte Routinen werden unterstützt, jedoch können Variablen der übergeordneten Funktion nicht aus der verschachtelten Routine heraus verwendet werden.

Array-Elemente

Der Typ von Array-Elementen wird ignoriert und kann weggelassen werden, daher sind diese beiden Deklarationen gleichwertig:

Var
x : array [1..2] of double;

Var
x : array [1..2];

Beachten Sie, dass Sie keine Array-Typen deklarieren können, wohl aber Arrays für Variablen.

Illegal example:

Type
TVertices = Array [1..50] Of TLocation;
Var
NewVertices : TVertices;

Legal example:

Var
NewVertices : Array [1..50] of TLocation;

Offene Array-Deklaration

Die Open Array Deklaration wird nicht unterstützt.

Schlüsselwort „Case“

Das Case Schlüsselwort kann für jeden Typ verwendet werden. Daher ist Folgendes gültig:

Case UserName of
'Alex', 'John' : IsAdministrator := true;
'Peter' : IsAdministrator := false;
Else
Raise('Unknown user');
End;

Klassendeklarationen

In DelphiScript können keine neuen Klassen definiert werden, aber Sie können vorhandene DelphiScript-Klassen verwenden und diese instanziieren. Zum Beispiel die TList und TStringList in Ihren Skripten erstellt und verwendet werden.
See also
TList
TStringList

CreateObject-Funktion

Mit der CreateObject Funktion kann verwendet werden, um Objekte zu erstellen, die implizit freigegeben werden, sobald sie nicht mehr benötigt werden.

Anstelle von:

Procedure Proc;
Var
  l;
Begin
    l := TList.Create;
  Try
    // do something with l
  Finally
  L.Free;
End;

...können Sie schreiben:

Procedure Proc;
Var
  l;
Begin
  l := CreateObject(TList);
  // Do something with l
End;

See also
CreateObject -Funktion.

Ausnahmen auslösen

Das Raise Schlüsselwort kann ohne Parameter verwendet werden, um die letzte Ausnahme erneut auszulösen. „Raise“ kann auch mit einem String-Parameter verwendet werden, um die Ausnahme mit der angegebenen Meldung auszulösen. Exception-Objekte werden in DelphiScript nicht unterstützt, da das On Schlüsselwort nicht unterstützt wird.

Example:

Raise(Format('Invalid value : %d', [Height]));

See also
Schlüsselwörter „Try“, „Finally“ und „Raise“.

ThreadVar

In DelphiScript wird das Threadvar Schlüsselwort als Var. Beachten Sie, dass in Embarcadero Delphi die mit dem Threadvar Schlüsselwort deklariert wurden, in jedem Thread unterschiedliche Werte haben.

Set-Operatoren

Der Set-Operator In wird nicht unterstützt. Mit dem InSet Operator kann verwendet werden, um zu prüfen, ob ein Wert zu einer Menge gehört. Beispiel:

If InSet(fsBold, Font.Style) then
ShowMessage('Bold');

Beachten Sie, dass die Delphi-Mengenoperatoren +, -, *, =, >= nicht korrekt funktionieren. Stattdessen werden die integrierten Delphiscript-Funktionen MkSet, MkSetRange, SetUnion, SetDifference, SetIntersection, SubSet and InSet werden stattdessen verwendet:

ASet := BSet + CSet; \\ should be changed to
ASet := SetUnion(BSet, CSet);

Die [...] Mengenkonstruktoren werden nicht unterstützt – verwenden Sie die MkSet Funktion zum Erstellen eines Sets:

Font.Style := MkSet(fsBold, fsItalic); 

See also
Schlüsselwort „MkSet“
Schlüsselwort „MkSetRange“
Schlüsselwort „InSet“
Schlüsselwort „SetDifference“
Schlüsselwort „SetIntersection“
Schlüsselwort „SetUnion“
Schlüsselwort „SubSet“
Schlüsselwort „InSet“

Operatoren

Das ^ und @ werden nicht unterstützt.

Direktiven

Die folgenden Direktiven werden nicht unterstützt (beachten Sie, dass einige davon veraltet sind und auch von Embarcadero Delphi nicht unterstützt werden): absolute, abstract, assembler, automated, cdecl, contains, default, dispid, dynamic, export, external, far, implements, index, message, name, near, nodefault, overload, override, package, pascal, private protected, public, published, read, readonly, register, reintroduce, requires, resident, safecall, stdcall, stored, virtual, write, writeonly.

Beachten Sie außerdem, dass die in Direktive in der Uses Klausel ignoriert wird.

Ignorierte Schlüsselwörter

Die interface, implementation, program und unit Schlüsselwörter werden in DelphiScript ignoriert. Die Skripte können sie enthalten, sie haben jedoch keine Wirkung – diese Schlüsselwörter können jedoch die Lesbarkeit von Skripten verbessern.

Nicht unterstützte Schlüsselwörter

Die folgenden Schlüsselwörter werden in DelphiScript nicht unterstützt:

  • as, asm, class, dispinterface, exports, finalization, inherited, initialization, inline, interface, is, library, object, out, property, record, resourcestring, set, supports, type.

Die folgenden Delphi-RTL-Funktionen werden in DelphiScript nicht unterstützt:

  • Abort, Addr, Assert, Dec, FillChar, Finalize, Hi, High, Inc, Initialize, Lo, Low, New, Ptr, SetString, SizeOf, Str, UniqueString, VarArrayRedim, VarArrayRef, VarCast, VarClear, VarCopy.

Die Funktionen aus der Windows-Unit von Delphi (die windows.pas Datei) werden nicht unterstützt (beispielsweise wird die RGB Funktion wird nicht unterstützt).

Verwendung der Altium Designer-API in Skripten

Sie können mit DelphiScript keine eigenen Datensätze oder Klassentypen erstellen und diese in einem Skript instanziieren; Sie können jedoch bestimmte Klassen aus der Altium Designer-API verwenden. Zum Beispiel die TStringList und TList Klassen instanziiert und als Container zur Datenspeicherung (in der Regel desselben Typs) verwendet werden, um den Anforderungen eines Skripts gerecht zu werden.

Die Objekt-Schnittstellen der API, die Altium Designer-Objekte repräsentieren, stehen in Skripten zur Verfügung. So haben Sie beispielsweise die Möglichkeit, Entwurfsobjekte in Schaltplan- und Leiterplatten-Dokumenten mithilfe der Schaltplan-Objekt-Schnittstellen und der Leiterplatten-Objekt-Schnittstellen zu aktualisieren.

Gemäß einer Konvention wird den Namen der Schnittstellen ein „I“ vorangestellt. Beispielsweise IPCB_Board steht für eine Schnittstelle für ein vorhandenes PCB-Dokument.

PCB-Schnittstellen in einem Skriptbeispiel:

Procedure ViaCreation;
Var
  Board : IPCB_Board;
  Via : IPCB_Via;
Begin
  Board := PCBServer.GetCurrentPCBBoard;
  If Board = Nil Then Exit;
 
  (\* Create a Via object\* )
  Via           := PCBServer.PCBObjectFactory(eViaObject, eNoDimension, eCreate_Default);
  Via.X         := MilsToCoord(7500);
  Via.Y         := MilsToCoord(7500);
  Via.Size      := MilsToCoord(50);
  Via.HoleSize  := MilsToCoord(20);
  Via.LowLayer  := eTopLayer;
  Via.HighLayer := eBottomLayer;
 
  (* Put this via in the Board object*)
  Board.AddPCBObject(Via);
End;

Die folgenden APIs können in Skripten verwendet werden:

  • Bestimmte Embarcadero Delphi™-Funktionen und -Klassen sowie DelphiScript-Erweiterungen
  • Client-API
  • PCB-Server-API
  • Schematic-Server-API
  • Workspace-Manager-Server-API
  • API der integrierten Bibliothek
  • Altium Designer-API-Funktionen
  • Parametrische Prozesse

Weitere Informationen

Sehen Sie sich die Skripte in der Sammlung herunterladbarer Skripte an, um sich über die Altium Designer-Objektschnittstellen und -Funktionen sowie über die in den Skripten verwendeten Delphi-Objekte und -Funktionen zu informieren.

Informationen zum Schreiben von Skripten für Altium Designer finden Sie in der Hauptdokumentation zum Skripting.

Im Leitfaden „Verwendung der Altium Designer-API“ finden Sie Einzelheiten zur Verwendung von Designobjekten und deren Schnittstellen in Ihren Skripten.

Informationen zum Umfang der Altium Designer-APIs und deren Schnittstellenobjekte für Skripte finden Sie in der Altium Designer-API-Referenz.

AI-LocalizedKI-lokalisiert
Wenn Sie ein Problem feststellen, wählen Sie den Text/das Bild aus und drücken SieCtrl + Enter, um uns Ihr Feedback zu senden.
Funktionsverfügbarkeit

Die Ihnen zur Verfügung stehenden Funktionen hängen davon ab, über welche Altium-Lösung Sie verfügen – Altium Develop, Altium Agile Teams, Altium Agile Enterprise oder Altium Designer (mit aktivem Laufzeitvertrag).

Wenn Sie eine dokumentierte Funktion in Ihrer tatsächlich verwendeten Software nicht sehen, wenden Sie sich an den Altium-Vertrieb, um mehr zu erfahren.

Legacy-Dokumentation

Die Dokumentation von Altium Designer wird nicht mehr versioniert. Wenn Sie auf Dokumentation für ältere Versionen von Altium Designer zugreifen müssen, besuchen Sie den Abschnitt Legacy-Dokumentation auf der Seite Andere Installer.

Inhalt