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 中使用集合条目

内部函数或过程

在考虑使用函数和过程时 inside 虽然允许使用递归过程/函数,但推荐的方法是编写独立的函数/过程。

不推荐使用以下函数片段:

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];

请注意,您不能声明数组类型,但可以将数组声明为变量。

Illegal example:

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

Legal example:

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类可以在脚本中创建和使用。
See also
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;

See also
CreateObject函数。

引发异常

关键字 Raise关键字可以在不带参数的情况下重新引发上一个异常。Raise 也可与字符串参数一起使用,以指定的消息字符串引发异常。DelphiScript 中不支持异常对象,因为不支持 On关键字。

Example:

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

See also
Try、Finally 和 Raise 关键字

线程变量

在 Delphiscript 中,关键字 Threadvar关键字被视为 Var.请注意,在 Embarcadero Delphi 中,使用 Threadvar关键字声明的变量在每个线程中都有不同的值。

集合操作符

Set 操作符 In不支持。操作符 InSet操作符可用于检查某个值是否是集合的成员。例如

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

请注意,Delphi 的集合运算符 +, -, *, =, >=不能正常工作。可使用内置的 Delphiscript 函数 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); 

See also
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.

此外,请注意 in子句中的 Uses子句中的指令将被忽略。

忽略的关键字

关键字 interface, implementation, programunit关键字在 DelphiScript 中被忽略。脚本可以包含这些关键字,但它们没有任何作用,不过,这些关键字可以增强脚本的可读性。

不支持的关键字

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.pas文件)中的函数不被支持(例如 RGB函数)。

在脚本中使用 Altium Designer API

您无法使用 DelphiScript 创建自己的记录或类类型并在脚本中将其实例化,但您可以使用 Altium Designer API 中的某些类。例如 TStringListTList类可以实例化并用作数据存储容器(通常为相同类型),以满足脚本的需要。

代表 Altium Designer 对象的 API 对象接口可在脚本中使用。例如,通过使用 Schematic 对象接口和 PCB 对象接口,您可以更新 Schematic 和 PCB 文档中的设计对象。

按照惯例,接口名称前面会加上一个 "I"。例如 IPCB_Board代表现有 PCB 文档的接口。

脚本示例中的 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参考

AI-LocalizedAI 翻译
如您发现任何问题,请选中相关文本/图片,并按 Ctrl + Enter 键向我们提交反馈。
功能可用性

您可使用的功能取决于您所选择的 Altium 解决方案 —— Altium DevelopAltium Agile(Agile Teams 或 Agile Enterprise 版本),或仍在有效订阅期内的 Altium Designer。

如果您在软件中未找到文中提及的功能,请联系 Altium 销售团队了解更多信息。

旧版文档

Altium Designer 文档不再提供版本区分。如果您需要访问 Altium Designer 旧版本的文档,请前往其他安装程序页面的旧版文档部分。

Content