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
Đ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
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.
Type TVertices = Array [1..50] Of TLocation; Var NewVertices : TVertices;
Var NewVertices : Array [1..50] of TLocation;
Tuyên bố mảng mở
Lệnh Open Array
Từ khóa Case
Từ Case
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
TList
TStringList
Hàm CreateObject
Hàm CreateObject
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;
HàmCreateObject.
Gây ra ngoại lệ
Từ khóa RaiseOn
Raise(Format('Invalid value : %d', [Height]));
Các từ khóa Try, Finally và Raise.
ThreadVar
Trong DelphiScript, ThreadvarVarThreadvar
Các toán tử Set
Toán tử Set InInSet
If InSet(fsBold, Font.Style) then ShowMessage('Bold');
Lưu ý rằng các toán tử tập hợp của Delphi +, -, *, =, >=MkSet, MkSetRange, SetUnion, SetDifference, SetIntersection, SubSet and InSet
ASet := BSet + CSet; \\ should be changed to ASet := SetUnion(BSet, CSet);
Các [...]MkSet
Font.Style := MkSet(fsBold, fsItalic);
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 ^@
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ị inUses
Các từ khóa bị bỏ qua
Từ khóa interfaceimplementationprogramunit
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.pasRGB
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á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
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.