DelphiScript와 Delphi의 차이점
DelphiScript와 Delphi의 차이점
이 섹션에서는 DelphiScript 스크립팅 언어와 Embarcadero의 Delphi 프로그래밍 언어 간의 핵심 차이점, 그리고 이것이 Altium Designer API에 어떻게 적용되는지 다룹니다.
Altium Designer 스크립팅 시스템은 비정형(untyped) DelphiScript 언어를 사용하므로 스크립트에는 데이터 타입이 없습니다. 가독성을 위해 변수와 그 타입을 선언하거나 함수/프로시저 또는 메서드 매개변수의 타입을 지정할 수는 있지만, DelphiScript는 스크립트 실행 시 선언되지 않은 변수를 변환합니다. 따라서 예를 들어 레코드나 클래스를 정의할 수 없습니다.
Delphi Script 변수
스크립트의 모든 변수는 Variant 타입이며, 변수 선언에서의 Types는 무시되므로 생략할 수 있습니다. 따라서 다음 세 가지 선언은 모두 올바릅니다:
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 연산자도 지원하지 않습니다. 반면 Delphi 언어에는 Set 타입이 있으며 Set 연산자를 지원합니다.
DelphiScript 스크립트에서 Set을 사용하려면, 스크립트에서 set을 조작하는 내장 함수를 사용하십시오.
자세한 내용은 DelphiScript에서 Set 사용하기 항목을 참고하십시오.
내부 함수 또는 프로시저
함수와 프로시저 inside a Function or Procedure를 사용할 때 권장되는 접근 방식은 독립형(standalone) 함수/프로시저를 작성하는 것입니다 — 재귀 프로시저/함수는 허용됩니다.
다음 함수 스니펫은 권장되지 않습니다:
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;
중첩 루틴
중첩 루틴은 지원되지만, 최상위 함수의 변수는 중첩된 루틴에서 사용할 수 없습니다.
배열 요소
배열 요소의 Type은 무시되며 생략할 수 있으므로, 다음 두 선언은 동일합니다:
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 선언
Open Array 선언은 지원되지 않습니다.
Case 키워드
Case 키워드는 어떤 타입에도 사용할 수 있습니다. 따라서 다음은 유효합니다:
Case UserName of
'Alex', 'John' : IsAdministrator := true;
'Peter' : IsAdministrator := false;
Else
Raise('Unknown user');
End;
클래스 선언
DelphiScript에서는 새 클래스를 정의할 수 없지만, 기존 DelphiScript 클래스를 사용하고 인스턴스화할 수는 있습니다. 예를 들어 TList 및 TStringList 클래스는 생성하여 스크립트에서 사용할 수 있습니다.
See also
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;
See also
CreateObject 함수.
예외 발생(Raise)
Raise 키워드는 매개변수 없이 사용하여 마지막 예외를 다시 발생(re-raise)시킬 수 있습니다. Raise는 문자열 매개변수와 함께 사용하여 지정된 메시지 문자열로 예외를 발생시킬 수도 있습니다. DelphiScript에서는 Exception 객체가 지원되지 않는데, 이는 On 키워드가 지원되지 않기 때문입니다.
Example:
Raise(Format('Invalid value : %d', [Height]));
See also
Try, Finally 및 Raise 키워드.
ThreadVar
Delphiscript에서 Threadvar 키워드는 Var로 취급됩니다. Embarcadero Delphi에서는 Threadvar 키워드로 선언된 변수는 각 스레드마다 서로 다른 값을 갖는다는 점에 유의하십시오.
Set 연산자
Set 연산자 In는 지원되지 않습니다. InSet 연산자는 값이 set의 멤버인지 확인하는 데 사용할 수 있습니다. 예:
If InSet(fsBold, Font.Style) then
ShowMessage('Bold');
Delphi set 연산자 +, -, *, <=, >=는 올바르게 동작하지 않는다는 점에 유의하십시오. 대신 내장 Delphiscript 함수 MkSet, MkSetRange, SetUnion, SetDifference, SetIntersection, SubSet and InSet를 사용합니다:
ASet := BSet + CSet; \\ should be changed to
ASet := SetUnion(BSet, CSet);
[...] set 생성자는 지원되지 않습니다 — MkSet 함수를 사용하여 Set을 생성하십시오:
Font.Style := MkSet(fsBold, fsItalic);
See also
MkSet 키워드
MkSetRange 키워드
InSet 키워드
SetDifference 키워드
SetIntersection 키워드
SetUnion 키워드
SubSet 키워드
InSet 키워드
연산자
^ 및 @ 연산자는 지원되지 않습니다.
지시문(Directives)
다음 지시문은 지원되지 않습니다(일부는 폐기(obsolete)되었으며 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.
또한 Uses 절의 in 지시문은 무시됩니다.
무시되는 키워드
interface, implementation, program 및 unit 키워드는 DelphiScript에서 무시됩니다. 스크립트에 포함될 수는 있지만 아무 효과가 없습니다 — 다만 이러한 키워드는 스크립트의 가독성을 높일 수 있습니다.
지원되지 않는 키워드
다음 키워드는 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.pas 파일)의 함수는 지원되지 않습니다(예: RGB 함수는 지원되지 않음).
스크립트에서 Altium Designer API 사용하기
DelphiScript를 사용해 자체 레코드나 클래스 타입을 만들고 스크립트에서 인스턴스화할 수는 없지만, Altium Designer API의 특정 클래스를 사용할 수는 있습니다. 예를 들어 TStringList 및 TList 클래스는 인스턴스화하여 (보통 동일 타입의) 데이터 저장 컨테이너로 사용함으로써 스크립트의 요구를 충족할 수 있습니다.
Altium Designer 객체를 나타내는 API의 Object Interface는 스크립트에서 사용할 수 있습니다. 예를 들어 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;
스크립트에서 다음 API를 사용할 수 있습니다:
- 일부 Embarcadero Delphi™ 함수 및 클래스, 그리고 DelphiScript 확장
- Client API
- PCB Server API
- Schematic Server API
- Workspace Manager Server API
- Integrated Library API
- Altium Designer API 함수
- 파라메트릭 프로세스
추가 정보
downloadable 스크립트 컬렉션의 스크립트를 확인하여, Altium Designer Object Interface와 함수, 그리고 스크립트에서 사용되는 Delphi 객체 및 함수를 살펴보십시오.
Altium Designer용 스크립트 작성에 대한 정보는 기본 Scripting 문서를 참고하십시오.
스크립트에서 설계 객체와 해당 인터페이스를 사용하는 방법에 대한 자세한 내용은 Using the Altium Designer API 가이드를 참고하십시오.
스크립트를 위한 Altium Designer API 범위와 해당 Interface Object에 대한 정보는 Altium Designer API Reference를 참고하십시오.