DelphiScript와 Delphi의 차이점
DelphiScript와 Delphi의 차이점
이 섹션에서는 DelphiScript 스크립트 언어와 Embarcadero의 Delphi 프로그래밍 언어 간의 주요 차이점, 그리고 이것이 Altium Designer API에 어떻게 적용되는지에 대해 다룹니다.
Altium Designer 스크립팅 시스템은 타입이 지정되지 않은 DelphiScript 언어를 사용하므로 스크립트에는 데이터 유형이 없습니다. 가독성을 위해 변수와 그 유형을 선언하고, 함수/프로시저 또는 메서드 파라미터의 유형을 지정할 수는 있지만, DelphiScript는 스크립트 실행 시 선언되지 않은 변수를 변환합니다. 따라서 예를 들어, 레코드나 클래스를 정의할 수 없습니다.
DelphiScript 변수
스크립트 내의 모든 변수는 Variant 유형이며, 변수 선언 시 명시된 유형은 무시되므로 생략할 수 있습니다. 따라서 다음 세 가지 선언은 모두 올바른 형태입니다:
Var a : Integer; Var b : Integer; Var c, d;
프로시저/함수 선언에서 파라미터의 타입도 무시되므로 생략할 수 있습니다. 예를 들어, 다음 코드는 올바른 예입니다:
Function Sum(a, b) : Integer; Begin Result := a + b; End;
일반적으로 Variant는 모든 데이터 유형을 저장하고 다양한 연산 및 유형 변환을 수행하는 데 사용할 수 있습니다. Variant는 실행 시점에 유형 검사가 이루어지고 계산됩니다. 컴파일러는 코드에 발생할 수 있는 오류에 대해 경고를 제공하지 않으므로, 이러한 오류는 광범위한 테스트를 통해서만 발견할 수 있습니다. 전반적으로, Variant를 사용하는 코드 부분은 많은 연산이 실행 시점까지 해결되지 않기 때문에 해석형 코드로 간주될 수 있습니다. 이는 코드의 실행 속도에 영향을 미칠 수 있습니다.
그 결과, Variant 변수가 선언되고 Variant 값을 할당받으면, 호환되거나 호환되지 않는 모든 데이터 유형으로 복사될 수 있습니다:
Var V; Begin // variable V can be assigned values of several different types: V := 10; V := 'Hello, World'; V := 45.55; End;
변수에 호환되지 않는 데이터 유형이 할당된 경우, DelphiScript 인터프리터는 가능한 경우 변환을 수행합니다. 그렇지 않으면 런타임 오류가 발생합니다. 실제로 Variant는 데이터와 함께 유형 정보를 저장하므로, DelphiScript는 동등한 Embarcadero Delphi 컴파일된 코드보다 속도가 느립니다.
스크립트의 집합(Set)
DelphiScript에는 Set 유형이 없으며 Set 연산자도 지원하지 않습니다. 이는 Set 유형을 가지고 Set 연산자를 지원하는 Delphi 언어와는 다릅니다.
DelphiScript 스크립트에서 집합을 사용하려면, 스크립트 내에서 집합을 조작하는 내장 함수를 사용하십시오.
자세한 내용은 ‘DelphiScript에서 집합 사용하기’ 항목을 참조하십시오.
내부 함수 또는 프로시저
함수나 프로시저를 사용할 때
다음과 같은 함수 코드 조각은 권장되지 않습니다.
Function A Function B Begin // blah End; Begin B; End;
권장되는 함수 구조:
Function B Begin // blah End; Function A Begin B; End;
Result 키워드
함수 블록 내에서 반환 값을 설정하려면 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
Case UserName of 'Alex', 'John' : IsAdministrator := true; 'Peter' : IsAdministrator := false; Else Raise('Unknown user'); End;
클래스 선언
DelphiScript에서는 새로운 클래스를 정의할 수 없지만, 기존 DelphiScript 클래스를 사용하여 인스턴스를 생성할 수 있습니다. 예를 들어 TListTStringList
TList
TStringList
CreateObject 함수
이 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 키워드.
ThreadVar
DelphiScript에서는 ThreadvarVarThreadvar
Set 연산자
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 키워드
SubSet 키워드
InSet 키워드
연산자
The ^@
지시문
다음 지시어는 지원되지 않습니다(일부는 더 이상 사용되지 않으며, 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.
다음 Delphi RTL 함수들은 DelphiScript에서 지원되지 않습니다:
-
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;
스크립트에서는 다음 API를 사용할 수 있습니다:
- 특정 Embarcadero Delphi™ 함수 및 클래스, 그리고 DelphiScript 확장 기능
- 클라이언트 API
- PCB 서버 API
- Schematic 서버 API
- 워크스페이스 매니저 서버 API
- 통합 라이브러리 API
- Altium Designer API 함수
- 파라메트릭 프로세스
추가 정보
다운로드 가능한 스크립트 모음에서 스크립트를 확인하여 Altium Designer 객체 인터페이스 및 함수는 물론, 스크립트에서 사용되는 Delphi 객체와 함수를 살펴보십시오.
Altium Designer용 스크립트 작성에 대한 정보는 스크립팅 주요 문서를 참조하십시오.
스크립트에서 설계 객체 및 해당 인터페이스를 사용하는 방법에 대한 자세한 내용은 Altium Designer API 사용 가이드를 참조하십시오.
스크립트용 Altium Designer API의 범위 및 해당 인터페이스 객체에 대한 정보는 Altium Designer API 참조를 참조하십시오.