DelphiScript和Delphi之间的区别
DelphiScript 与 Delphi 的区别
本节介绍 DelphiScript 脚本语言与 Embarcadero 的 Delphi 编程语言之间的主要区别,以及这些区别如何应用于 Altium Designer API。
Altium Designer 脚本系统使用无类型的 DelphiScript 语言,因此脚本中没有数据类型。虽然您可以声明变量及其类型,并为函数/过程或方法参数指定类型以提高可读性,但 DelphiScript 会在执行脚本时转换未声明的变量。因此,您不能定义记录或类。
Delphi 脚本变量
脚本中的所有变量都是 Variant 类型,变量声明中的 Types 会被忽略,可以跳过。因此这三个声明是正确的:
Var a : Integer; Var b : Integer; Var c, d;
存储过程/函数声明中的参数类型也会被忽略,可以跳过。例如,以下代码是正确的:
Function Sum(a, b) : Integer; Begin Result := a + b; End;
一般来说,变量可用于存储任何数据类型,并执行大量操作和类型转换。变体在运行时进行类型检查和计算。编译器不会对代码中可能存在的错误发出警告,这些错误只能通过大量测试才能发现。总的来说,使用变体的代码部分可被视为解释型代码,因为许多操作要到运行时才能解决。这会影响代码的运行速度。
其结果是,一旦变量被声明并获得变量值,它就可以被复制到任何兼容或不兼容的数据类型中:
Var V; Begin // variable V can be assigned values of several different types: V := 10; V := 'Hello, World'; V := 45.55; End;
如果给变量分配了不兼容的数据类型,DelphiScript 解释器会尽可能执行转换。否则,运行时将出错。实际上,变量与数据一起存储了类型信息,因此 DelphiScript 的运行速度要比 Embarcadero Delphi 编译后的代码慢。
脚本中的集合
DelphiScript 没有集合类型,也不支持集合运算符,这与拥有集合类型并支持集合运算符的 Delphi 语言不同。
要在 DelphiScript 脚本中使用集合,请使用可在脚本中操作集合的内置函数。
有关详细信息,请参阅在 DelphiScript 中使用集合条目
内部函数或过程
在考虑使用函数和过程时
不推荐使用以下函数片段:
Function A Function B Begin // blah End; Begin B; End;
推荐的函数结构:
Function B Begin // blah End; Function A Begin B; End;
结果关键字
使用 Result
Function Foo : String; Begin Result := 'Foo Foo'; End;
嵌套例程
支持嵌套例程,但不能在嵌套例程中使用顶层函数的变量。
数组元素
数组元素的类型会被忽略,可以跳过,因此这两个声明是等价的:
Var x : array [1..2] of double; Var x : array [1..2];
请注意,您不能声明数组类型,但可以将数组声明为变量。
Type TVertices = Array [1..50] Of TLocation; Var NewVertices : TVertices;
Var NewVertices : Array [1..50] of TLocation;
开放数组声明
不支持 Open Array
大小写关键字
关键字 Case
Case UserName of 'Alex', 'John' : IsAdministrator := true; 'Peter' : IsAdministrator := false; Else Raise('Unknown user'); End;
类声明
DelphiScript 中不能定义新类,但可以使用现有的 DelphiScript 类并将其实例化。例如 TListTStringList
TList
TStringList
创建对象函数
该 CreateObject
因此,可以用
Procedure Proc; Var l; Begin l := TList.Create; Try // do something with l Finally L.Free; End;
...你可以写
Procedure Proc; Var l; Begin l := CreateObject(TList); // Do something with l End;
CreateObject函数。
引发异常
关键字 RaiseOn
Raise(Format('Invalid value : %d', [Height]));
Try、Finally 和 Raise 关键字。
线程变量
在 Delphiscript 中,关键字 ThreadvarVarThreadvar
集合操作符
Set 操作符 InInSet
If InSet(fsBold, Font.Style) then ShowMessage('Bold');
请注意,Delphi 的集合运算符 +, -, *, =, >=MkSet, MkSetRange, SetUnion, SetDifference, SetIntersection, SubSet and InSet
ASet := BSet + CSet; \\ should be changed to ASet := SetUnion(BSet, CSet);
不支持 [...]MkSet
Font.Style := MkSet(fsBold, fsItalic);
MkSet 关键字
MkSetRange 关键字
InSet 关键字
SetDifference 关键字
SetIntersection 关键字
SetUnion 关键字
子集关键字
InSet 关键字
操作符
运算符 ^@
指令
不支持以下指令(注意有些指令已经过时,Embarcadero Delphi 也不支持): 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.
此外,请注意 inUses
忽略的关键字
关键字 interfaceimplementationprogramunit
不支持的关键字
DelphiScript 不支持以下关键字:
-
as, asm, class, dispinterface, exports, finalization, inherited, initialization, inline, interface, is, library, object, out, property, record, resourcestring, set, supports, type.
DelphiScript 不支持以下 Delphi RTL 函数:
-
Abort, Addr, Assert, Dec, FillChar, Finalize, Hi, High, Inc, Initialize, Lo, Low, New, Ptr, SetString, SizeOf, Str, UniqueString, VarArrayRedim, VarArrayRef, VarCast, VarClear, VarCopy.
Delphi 的 Windows 单元(即 windows.pasRGB
在脚本中使用 Altium Designer API
您无法使用 DelphiScript 创建自己的记录或类类型并在脚本中将其实例化,但您可以使用 Altium Designer API 中的某些类。例如 TStringListTList
代表 Altium Designer 对象的 API 对象接口可在脚本中使用。例如,通过使用 Schematic 对象接口和 PCB 对象接口,您可以更新 Schematic 和 PCB 文档中的设计对象。
按照惯例,接口名称前面会加上一个 "I"。例如 IPCB_Board
脚本示例中的 PCB 接口:
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;
脚本中可使用以下应用程序接口:
- 某些 Embarcadero Delphi™ 函数和类,以及 DelphiScript 扩展程序
- 客户端 API
- PCB 服务器 API
- 原理图服务器 API
- 工作区管理器服务器 API
- 集成库 API
- Altium Designer API 功能
- 参数流程
更多信息
查看可下载脚本集中的脚本,了解 Altium Designer 对象接口和函数,以及脚本中使用的 Delphi 对象和函数。
有关为 Altium Designer 编写脚本的信息,请参阅主脚本文档。
有关如何在脚本中使用设计对象及其接口的详细信息,请参阅使用Altium Designer API指南。
有关 Altium Designer API 及其脚本接口对象的信息,请参阅 Altium Designer API参考。