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.