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 Anwendung auf die Altium Designer API.

Das Skriptsystem von Altium Designer verwendet die untypisierte Sprache DelphiScript, daher gibt es in Skripten keine Datentypen. Obwohl Sie Variablen und ihre Typen deklarieren und die Typen für Funktionen/Prozeduren oder Methodenparameter zur besseren Lesbarkeit angeben können, konvertiert DelphiScript nicht deklarierte Variablen, wenn ein Skript ausgeführt wird. Daher können Sie beispielsweise keine Records oder Klassen definieren.

DelphiScript-Variablen

Alle Variablen in einem Skript sind vom Typ Variant, und Typen in einer Variablendeklaration werden ignoriert und können weggelassen werden. Daher sind diese drei Deklarationen korrekt:

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

Auch Typen von Parametern in einer Prozedur-/Funktionsdeklaration werden ignoriert und können weggelassen werden. Zum Beispiel ist dieser Code korrekt:

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

Im Allgemeinen können Variants 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 über mögliche Fehler im Code aus; diese können nur durch umfangreiche Tests erkannt werden. Insgesamt können die Codeteile, die Variants verwenden, als interpretierter Code betrachtet werden, da viele Operationen erst zur Laufzeit aufgelöst werden können. Dies kann die Geschwindigkeit des Codes beeinträchtigen.

Das Ergebnis ist, dass eine Variant-Variable, sobald sie deklariert wurde und einen Variant-Wert erhalten 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;

Wenn einer Variablen ein inkompatibler Datentyp zugewiesen wurde, führt der DelphiScript-Interpreter nach Möglichkeit eine Konvertierung durch. Andernfalls wird ein Laufzeitfehler ausgegeben. In der Praxis speichert ein Variant zusammen mit den Daten auch Typinformationen, sodass DelphiScript langsamer ist als der entsprechende kompilierte Code in Embarcadero Delphi.

Mengen in Skripten

DelphiScript besitzt keine Set-Typen und unterstützt keine Set-Operatoren, im Gegensatz zur Sprache Delphi, die Set-Typen besitzt und Set-Operatoren unterstützt.

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

Weitere Informationen finden Sie im Eintrag Using Sets in DelphiScript

Interne Funktionen oder Prozeduren

Wenn Sie die Verwendung von Funktionen und Prozeduren in Betracht ziehen inside eine Funktion oder Prozedur, besteht der empfohlene Ansatz darin, 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 Schlüsselwort Result, um den Rückgabewert innerhalb eines Funktionsblocks festzulegen. Zum Beispiel:

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

Verschachtelte Routinen

Verschachtelte Routinen werden unterstützt, aber Variablen der Funktion auf oberster Ebene können in der verschachtelten Routine nicht 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, aber Sie können Arrays für Variablen deklarieren.

Illegal example:

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

Legal example:

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

Deklaration offener Arrays

Die Deklaration Open Array wird nicht unterstützt.

Schlüsselwort Case

Das Schlüsselwort Case 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

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

Funktion CreateObject

Die Funktion CreateObject kann verwendet werden, um Objekte zu erstellen, die implizit freigegeben werden, wenn sie nicht mehr verwendet werden.

Also können Sie statt:

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

...Folgendes schreiben:

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

See also
CreateObject-Funktion.

Ausnahmen auslösen

Das Schlüsselwort Raise kann ohne Parameter verwendet werden, um die letzte Ausnahme erneut auszulösen. Raise kann auch mit einem String-Parameter verwendet werden, um eine Ausnahme mit der angegebenen Meldungszeichenfolge auszulösen. Exception-Objekte werden in DelphiScript nicht unterstützt, da das Schlüsselwort On 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 Schlüsselwort Threadvar als Var behandelt. Beachten Sie, dass in Embarcadero Delphi die mit dem Schlüsselwort Threadvar deklarierten Variablen in jedem Thread unterschiedliche Werte haben.

Set-Operatoren

Der Set-Operator In wird nicht unterstützt. Der Operator InSet kann verwendet werden, um zu prüfen, ob ein Wert Mitglied einer Menge ist. Zum Beispiel:

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

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

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

Die Set-Konstruktoren [...] werden nicht unterstützt — verwenden Sie die Funktion MkSet, um ein Set zu erstellen:

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

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

Operatoren

Die Operatoren ^ und @ werden nicht unterstützt.

Direktiven

Die folgenden Direktiven werden nicht unterstützt (beachten Sie, dass einige 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 Direktive in in der Klausel Uses ignoriert wird.

Ignorierte Schlüsselwörter

Die Schlüsselwörter interface, implementation, program und unit werden in DelphiScript ignoriert. Die Skripte können sie enthalten, aber sie haben 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 Delphis Windows-Unit (der Datei windows.pas) werden nicht unterstützt (zum Beispiel wird die Funktion RGB nicht unterstützt).

Verwendung der Altium Designer API in Skripten

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

Die Objekt-Interfaces der API, die Altium Designer-Objekte repräsentieren, stehen zur Verwendung in Skripten zur Verfügung. So können Sie beispielsweise Designobjekte in Schaltplan- und PCB-Dokumenten mithilfe von Schaltplan-Objekt-Interfaces und PCB-Objekt-Interfaces aktualisieren.

Konventionsgemäß wird Interface-Namen ein „I“ vorangestellt. Zum Beispiel repräsentiert IPCB_Board ein Interface für ein vorhandenes PCB-Dokument.

Beispiel für PCB-Interfaces in einem Skript:

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
  • Integrated Library API
  • Altium Designer API-Funktionen
  • Parametrische Prozesse

Weitere Informationen

Sehen Sie sich die Skripte in der downloadable-Skriptsammlung an, um Altium Designer-Objekt-Interfaces und -Funktionen sowie Delphi-Objekte und -Funktionen zu sehen, die in Skripten verwendet werden.

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

Einzelheiten zur Verwendung von Designobjekten und ihren Interfaces in Ihren Skripten finden Sie im Leitfaden Using the Altium Designer API. Informationen zum Umfang der Altium Designer APIs und ihrer Interface-Objekte für Skripte finden Sie in der Altium Designer API Reference.

AI-LocalizedAI-localized
Wenn Sie ein Problem feststellen, wählen Sie den Text/das Bild aus und drücken SieStrg + Eingabe, um uns Ihr Feedback zu senden.
Funktionsverfügbarkeit

Die Ihnen zur Verfügung stehenden Funktionen hängen davon ab, welche Altium-Lösung Sie verwenden – Altium Develop, eine Edition von Altium Agile (Agile Teams oder Agile Enterprise), oder Altium Designer (mit aktivem Abonnement).

Wenn Sie eine besprochene Funktion in Ihrer Software nicht sehen, kontaktieren Sie 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