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 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 những khác biệt này áp dụng cho API của Altium Designer.

Hệ thống scripting của Altium Designer sử dụng ngôn ngữ DelphiScript không định kiểu, vì vậy không có kiểu dữ liệu trong script. 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 hàm/thủ tục hoặc tham số phương thức để tăng tính dễ đọc, DelphiScript sẽ chuyển đổi các biến chưa được khai báo khi script được thực thi. Vì vậy, chẳng hạn, bạn không thể định nghĩa record hoặc class.

Biến trong Delphi Script

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

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

Kiểu của tham số trong khai báo procedure/function cũng bị bỏ qua và có thể lược bỏ. Ví dụ, đoạn mã sau là hợp lệ:

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

Nói chung, variant có thể được 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. Một 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ể có trong mã; những lỗi này chỉ có thể được phát hiện thông qua kiểm thử kỹ lưỡng. Nhìn chung, các phần mã sử dụng variant có thể được xem như mã thông dịch, vì nhiều thao tác không thể được xác định cho đến khi chạy. Điều này có thể ảnh hưởng đến tốc độ của mã.

Kết quả là, sau khi một biến variant đã được khai báo và đã nhận một giá trị variant, 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 sinh. Trên thực tế, một variant lưu thông tin kiểu cùng với dữ liệu nên DelphiScript chậm hơn mã Delphi đã biên dịch tương đương của Embarcadero.

Tập hợp trong Script

DelphiScript không có kiểu Set và không hỗ trợ các toán tử Set, không giống ngôn ngữ Delphi vốn có kiểu Set và hỗ trợ các toán tử Set.

Để sử dụng Set trong các script DelphiScript, hãy dùng các hàm dựng sẵn thao tác với set trong script.

Xem mục Sử dụng Set trong DelphiScript để biết thêm thông tin

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

Khi cân nhắc sử dụng Function và Procedure inside một Function hoặc Procedure, cách tiếp cận được khuyến nghị là viết các function/procedure độc lập — mặc dù các procedure/function đệ quy vẫn được cho phép.

Đoạn function sau không được khuyến nghị:

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

Cấu trúc function được khuyến nghị:

Function B
Begin
// blah
End;

Function A
Begin
B;
End;

Từ khóa Result

Sử dụng từ khóa Result để đặt giá trị trả về bên trong khối function. Ví dụ:

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

Routine lồng nhau

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

Phần tử mảng

Kiểu của các phần tử mảng bị bỏ qua và có thể lược bỏ, vì vậy hai khai báo sau 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 bạn có thể khai báo mảng cho biến.

Illegal example:

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

Legal example:

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

Khai báo mảng mở

Khai báo Open Array không được hỗ trợ.

Từ khóa Case

Từ khóa Case có thể được dùng cho bất kỳ kiểu nào. Vì vậy, nội dung sau 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 class mới trong DelphiScript, nhưng bạn có thể sử dụng các class DelphiScript hiện có và khởi tạo chúng. Ví dụ, các class TListTStringList có thể được tạo và sử dụng trong script của bạn.
See also
TList
TStringList

Hàm CreateObject

Hàm CreateObject có thể được dùng để tạo các đối tượng sẽ tự động được giải phóng khi không còn được sử dụng.

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àm CreateObject.

Phát sinh ngoại lệ

Từ khóa Raise có thể được dùng mà không cần tham số để phát sinh lại ngoại lệ gần nhất. Raise cũng có thể được dùng với một tham số chuỗi để phát sinh 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 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, từ khóa Threadvar được xử lý như Var. Lưu ý rằng trong Delphi của Embarcadero, các biến được khai báo bằng từ khóa Threadvar có giá trị riêng biệt trong mỗi luồng.

Toán tử Set

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

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

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

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

Các bộ khởi tạo set [...] không được hỗ trợ — hãy dùng hàm MkSet để tạo một Set:

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

See also
MkSet keyword
MkSetRange keyword
InSet keyword
SetDifference keyword
SetIntersection keyword
SetUnion keyword
SubSet keyword
InSet keyword

Toán tử

Các toán tử ^@ không được hỗ trợ.

Chỉ thị

Các chỉ thị sau không được hỗ trợ (lưu ý rằng một số chỉ thị đã lỗi thời và cũng không được Embarcadero Delphi hỗ trợ): 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 trong mệnh đề Uses sẽ bị bỏ qua.

Từ khóa bị bỏ qua

Các từ khóa interface, implementation, programunit bị bỏ qua trong DelphiScript. Script 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 script.

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

Các từ khóa sau 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 Delphi RTL sau 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ừ unit Windows của Delphi (tệp windows.pas) không được hỗ trợ (ví dụ, hàm RGB không được hỗ trợ).

Sử dụng API Altium Designer trong script

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

Các Object Interface của API đại diện cho các đối tượng của Altium Designer có thể được sử dụng trong script. Ví dụ, bạn có thể cập nhật các đối tượng thiết kế trên tài liệu Schematic và PCB thông qua việc sử dụng các interface đối tượng Schematic và các interface đối tượng PCB.

Theo quy ước, tên interface được thêm ký tự 'I' ở phía trước tên. Ví dụ, IPCB_Board đại diện cho một interface của một tài liệu PCB hiện có.

Ví dụ về PCB Interface trong script:

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 có thể được sử dụng trong Script:

  • Một số hàm và class của Embarcadero Delphi™, cùng với các phần mở rộng của DelphiScript
  • Client API
  • PCB Server API
  • Schematic Server API
  • Workspace Manager Server API
  • Integrated Library API
  • Các hàm API của Altium Designer
  • Các quy trình tham số

Thông tin thêm

Hãy xem các script trong bộ sưu tập script có thể tải xuống để thấy các Object Interface và hàm của Altium Designer, cùng với các đối tượng và hàm Delphi được sử dụng trong script.

Tham khảo tài liệu chính về Scripting để biết thông tin về cách viết script 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à interface của chúng trong script của bạn.

Tham khảo Altium Designer API Reference để biết thông tin về phạm vi các API của Altium Designer và các Interface Object của chúng cho script.

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 có sẵn cho bạn phụ thuộc vào giải pháp Altium mà bạn đang sử dụng – Altium Develop, một phiên bản của Altium Agile (Agile Teams hoặc Agile Enterprise), hoặc Altium Designer (đang còn hiệu lực).

Nếu bạn không thấy tính năng được đề cập trong phần mềm 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