Sự khác biệt giữa DelphiScript và Delphi

Sự khác biệt giữa DelphiScript và Delphi

Phần này trình bày những điểm khác biệt cơ bản giữa ngôn ngữ kịch bản DelphiScript và ngôn ngữ lập trình Delphi của Embarcadero, cũng như cách áp dụng những điểm này vào API của Altium Designer.

Hệ thống kịch bản của Altium Designer sử dụng ngôn ngữ DelphiScript không có kiểu dữ liệu, do đó không có kiểu dữ liệu trong các kịch bản. Mặc dù bạn có thể khai báo biến và kiểu của chúng, cũng như chỉ định kiểu cho các hàm/thủ tục hoặc tham số phương thức để tăng tính dễ đọc, DelphiScript sẽ tự động chuyển đổi các biến chưa được khai báo khi kịch bản được thực thi. Ví dụ, bạn không thể định nghĩa các bản ghi (records) hoặc lớp (classes).

Biến trong DelphiScript

Tất cả các biến trong tập lệnh đều thuộc kiểu Variant, và các kiểu trong khai báo biến sẽ bị bỏ qua và có thể được bỏ qua. Vì vậy, ba khai báo sau đây là đúng:

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

Kiểu dữ liệu của các tham số trong khai báo thủ tục/hàm cũng bị bỏ qua và có thể bỏ qua. Ví dụ, đoạn mã này là đúng:

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

Nói chung, biến Variant có thể được sử dụng để lưu trữ bất kỳ kiểu dữ liệu nào và thực hiện nhiều thao tác cũng như chuyển đổi kiểu. Variant được kiểm tra kiểu và tính toán tại thời điểm chạy. Trình biên dịch sẽ không đưa ra cảnh báo về các lỗi có thể xảy ra trong mã, mà chỉ có thể phát hiện được thông qua quá trình kiểm thử kỹ lưỡng. Nhìn chung, các phần mã sử dụng variant có thể được coi là mã được giải thích, vì nhiều thao tác không thể được giải quyết cho đến khi chạy. Điều này có thể ảnh hưởng đến tốc độ của mã.

Kết quả là, một khi biến biến thể đã được khai báo và nhận được giá trị biến thể, nó có thể được sao chép sang bất kỳ kiểu dữ liệu tương thích hoặc không tương thích nào:

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

Nếu một kiểu dữ liệu không tương thích được gán cho một biến, trình thông dịch DelphiScript sẽ thực hiện chuyển đổi nếu có thể. Nếu không, một lỗi thời gian chạy sẽ được phát ra. Trong thực tế, biến dạng lưu trữ thông tin kiểu cùng với dữ liệu, do đó DelphiScript chậm hơn so với mã biên dịch Embarcadero Delphi tương đương.

Các tập hợp trong kịch bản

DelphiScript không có kiểu dữ liệu tập hợp (Set) và không hỗ trợ các toán tử tập hợp, khác với ngôn ngữ Delphi vốn có kiểu dữ liệu tập hợp và hỗ trợ các toán tử tập hợp.

Để sử dụng tập hợp trong các kịch bản DelphiScript, hãy sử dụng các hàm tích hợp sẵn để thao tác với tập hợp trong kịch bản.

Xem mục Sử dụng tập hợp trong DelphiScript để biết thêm thông tin

Hàm hoặc thủ tục nội bộ

Khi xem xét việc sử dụng các hàm và thủ tục inside một hàm hoặc thủ tục, cách tiếp cận được khuyến nghị là viết các hàm/thủ tục độc lập — mặc dù các thủ tục/hàm đệ quy vẫn được phép.

Đoạn mã hàm sau đây không được khuyến nghị:

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

Cấu trúc hàm được khuyến nghị:

Function B
Begin
// blah
End;

Function A
Begin
B;
End;

Từ khóa Result

Sử dụng Result để đặt giá trị trả về trong khối hàm. Ví dụ:

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

Các hàm lồng nhau

Các hàm lồng nhau được hỗ trợ, nhưng các biến của hàm cấp cao nhất không thể được sử dụng từ hàm lồng nhau.

Các phần tử mảng

Loại của các phần tử mảng bị bỏ qua và có thể không cần khai báo, do đó hai cách khai báo sau đây là tương đương:

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

Var
x : array [1..2];

Lưu ý rằng bạn không thể khai báo kiểu mảng, nhưng có thể khai báo mảng cho các biến.

Illegal example:

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

Legal example:

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

Tuyên bố mảng mở

Lệnh Open Array không được hỗ trợ.

Từ khóa Case

Từ Case có thể được sử dụng cho bất kỳ kiểu nào. Do đó, đoạn mã sau đây là hợp lệ:

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

Khai báo lớp

Không thể định nghĩa các lớp mới trong DelphiScript, nhưng bạn có thể sử dụng các lớp DelphiScript hiện có và khởi tạo chúng. Ví dụ như từ khóa TListTStringList có thể được tạo ra và sử dụng trong các tập lệnh của bạn.
See also
TList
TStringList

Hàm CreateObject

Hàm CreateObject hàm này có thể được sử dụng để tạo các đối tượng sẽ được giải phóng ngầm định khi không còn được sử dụng nữa.

Vì vậy, thay vì:

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

...bạn có thể viết:

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

See also
HàmCreateObject.

Gây ra ngoại lệ

Từ khóa Raise có thể được sử dụng mà không cần tham số để tái ném ngoại lệ cuối cùng. Raise cũng có thể được sử dụng với một tham số chuỗi để ném ngoại lệ với chuỗi thông báo được chỉ định. Các đối tượng Exception không được hỗ trợ trong DelphiScript, vì từ khóa On từ khóa này không được hỗ trợ.

Example:

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

See also
Các từ khóa Try, Finally và Raise.

ThreadVar

Trong DelphiScript, Threadvar được coi là Var. Lưu ý rằng trong Embarcadero Delphi, các biến được khai báo bằng từ khóa Threadvar có các giá trị riêng biệt trong mỗi luồng.

Các toán tử Set

Toán tử Set In không được hỗ trợ. Toán tử InSet có thể được sử dụng để kiểm tra xem một giá trị có phải là thành viên của một tập hợp hay không. Ví dụ:

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

Lưu ý rằng các toán tử tập hợp của Delphi +, -, *, =, >= không hoạt động chính xác. Thay vào đó, các hàm Delphiscript tích hợp sẵn MkSet, MkSetRange, SetUnion, SetDifference, SetIntersection, SubSet and InSet thay thế:

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

Các [...] không được hỗ trợ — hãy sử dụng MkSet hàm này để tạo một tập hợp:

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

See also
Từ khóa MkSet
Từ khóa MkSetRange
Từ khóa InSet
Từ khóa SetDifference
Từ khóa SetIntersection
Từ khóa SetUnion
Từ khóa SubSet
Từ khóa InSet

Toán tử

Từ khóa ^@ không được hỗ trợ.

Chỉ thị

Các chỉ thị sau đây không được hỗ trợ (lưu ý rằng một số đã lỗi thời và cũng không được hỗ trợ bởi 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.

Ngoài ra, lưu ý rằng chỉ thị in hướng dẫn trong Uses sẽ bị bỏ qua.

Các từ khóa bị bỏ qua

Từ khóa interface, implementation, programunit bị bỏ qua trong DelphiScript. Các tập lệnh có thể chứa chúng nhưng chúng không có tác dụng — tuy nhiên, các từ khóa này có thể giúp tăng tính dễ đọc của tập lệnh.

Các từ khóa không được hỗ trợ

Các từ khóa sau đây không được hỗ trợ trong DelphiScript:

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

Các hàm RTL của Delphi sau đây không được hỗ trợ trong DelphiScript:

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

Các hàm từ đơn vị Windows của Delphi (tệp windows.pas tệp) không được hỗ trợ (ví dụ: hàm RGB hàm này không được hỗ trợ).

Sử dụng API Altium Designer trong tập lệnh

Bạn không thể tạo các kiểu bản ghi hoặc lớp của riêng mình bằng DelphiScript và khởi tạo chúng trong tập lệnh; tuy nhiên, bạn có thể sử dụng một số lớp nhất định từ API Altium Designer. Ví dụ: TStringListTList có thể được khởi tạo và sử dụng làm các vùng chứa dữ liệu (thường là cùng loại) để đáp ứng nhu cầu của tập lệnh.

Các Giao diện Đối tượng của API đại diện cho các đối tượng Altium Designer có sẵn để sử dụng trong tập lệnh. Ví dụ: bạn có thể cập nhật các đối tượng thiết kế trên các tài liệu Sơ đồ và PCB thông qua việc sử dụng các giao diện đối tượng Sơ đồ và các giao diện đối tượng PCB.

Theo quy ước, tên giao diện có thêm chữ 'I' ở phía trước tên. Ví dụ IPCB_Board đại diện cho một giao diện dành cho tài liệu PCB hiện có.

Ví dụ về các giao diện PCB trong tập lệnh:

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;

Các API sau đây có thể được sử dụng trong các tập lệnh:

  • Một số hàm và lớp Embarcadero Delphi™, cùng với các tiện ích mở rộng DelphiScript
  • API khách hàng
  • API máy chủ PCB
  • API máy chủ sơ đồ
  • API máy chủ Workspace Manager
  • API Thư viện tích hợp
  • Các hàm API của Altium Designer
  • Quy trình tham số

Thông tin thêm

Kiểm tra các tập lệnh trong bộ sưu tập tập lệnh có thể tải xuống để xem các giao diện và hàm đối tượng Altium Designer, cùng với các đối tượng và hàm Delphi được sử dụng trong các tập lệnh.

Tham khảo tài liệu chính về Lập trình kịch bản để biết thông tin về cách viết kịch bản cho Altium Designer.

Tham khảo hướng dẫn Sử dụng API Altium Designer để biết chi tiết về cách sử dụng các đối tượng thiết kế và giao diện của chúng trong các tập lệnh của bạn.

Tham khảo Tài liệu tham khảo API của Altium Designer để biết thông tin về các API của Altium Designer và các đối tượng giao diện của chúng dành cho các tập lệnh.

AI-LocalizedBản địa hóa bằng AI
Nếu bạn phát hiện vấn đề, hãy chọn văn bản/hình ảnh và nhấnCtrl + Enterđể gửi phản hồi cho chúng tôi.
Tính khả dụng của tính năng

Các tính năng bạn có thể sử dụng phụ thuộc vào giải pháp Altium mà bạn đang có – Altium Develop, Altium Agile Teams, Altium Agile Enterprise, hoặc Altium Designer (đang trong thời hạn hiệu lực).

Nếu bạn không thấy một tính năng được nêu trong tài liệu có trong phần mềm thực tế của mình, liên hệ Bộ phận Kinh doanh của Altium để tìm hiểu thêm.

Tài liệu cũ

Tài liệu Altium Designer không còn được phân phiên bản. Nếu bạn cần truy cập tài liệu cho các phiên bản cũ hơn của Altium Designer, hãy truy cập mục Tài liệu cũ trên trang Trình cài đặt khác.

Nội dung