DelphiScript と Delphi の違い

DelphiScript と Delphi の違い

このセクションでは、DelphiScript スクリプト言語と Embarcadero の Delphi プログラミング言語の本質的な違い、およびそれが Altium Designer API にどのように関係するかを説明します。

Altium Designer のスクリプトシステムは、型なしの DelphiScript 言語を使用するため、スクリプト内にデータ型はありません。変数とその型を宣言したり、可読性のために関数/プロシージャやメソッドのパラメータ型を指定したりできますが、DelphiScript はスクリプト実行時に未宣言の変数を変換します。そのため、たとえばレコードやクラスを定義することはできません。

Delphi Script の変数

スクリプト内のすべての変数は Variant 型であり、変数宣言における Types は無視されるため省略できます。したがって、次の 3 つの宣言はいずれも正しいです。

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 を操作する組み込み関数を使用してください。

詳細は Using Sets in DelphiScript の項目を参照してください。

内部関数またはプロシージャ

Functions と Procedures を使用する際に inside 関数またはプロシージャを検討する場合、推奨されるアプローチは、スタンドアロンの関数/プロシージャとして記述することです(再帰プロシージャ/関数は許可されています)。

次の関数スニペットは推奨されません。

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 は無視されるため省略できます。したがって、次の 2 つの宣言は同等です。

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 宣言はサポートされません。

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 function.

例外の Raise

Raise キーワードは、パラメータなしで最後の例外を再送出するために使用できます。Raise は文字列パラメータとともに使用して、指定したメッセージ文字列で例外を送出することもできます。DelphiScript では Exception オブジェクトはサポートされません。これは On キーワードがサポートされていないためです。

Example:

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

See also
Try, Finally and Raise keywords.

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 コンストラクタはサポートされません。Set を作成するには MkSet 関数を使用してください。:

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

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

演算子

^ および @ 演算子はサポートされません。

ディレクティブ

次のディレクティブはサポートされません(いくつかは廃止されており、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 ディレクティブは無視される点に注意してください。

無視されるキーワード

DelphiScript では 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.pas ファイル)の関数はサポートされません(たとえば RGB 関数はサポートされません)。

スクリプトで Altium Designer API を使用する

DelphiScript を使用して独自のレコード型やクラス型を作成し、スクリプト内でインスタンス化することはできません。ただし、Altium Designer API の特定のクラスは使用できます。たとえば TStringList および TList クラスはインスタンス化でき、(通常は同一型の)データ格納用コンテナとして、スクリプトの要件を満たすために使用できます。

Altium Designer オブジェクトを表す API の Object Interface は、スクリプトで使用できます。たとえば、Schematic オブジェクトインターフェースおよび PCB オブジェクトインターフェースを使用して、回路図および 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:

  • Certain Embarcadero Delphi™ functions and classes, and DelphiScript extensions
  • Client API
  • PCB Server API
  • Schematic Server API
  • Workspace Manager Server API
  • Integrated Library API
  • Altium Designer API functions
  • Parametric processes

詳細情報

downloadable scripts collection にあるスクリプトを確認し、Altium Designer の Object Interface と関数、さらに Delphi のオブジェクトや関数がスクリプト内でどのように使用されているかを確認してください。

Altium Designer 用スクリプトの作成に関する情報は、メインの Scripting ドキュメントを参照してください。

スクリプトで設計オブジェクトとそのインターフェースを使用する方法の詳細は、Using the Altium Designer API ガイドを参照してください。

スクリプト向けの Altium Designer API の範囲とその Interface Object に関する情報は、Altium Designer API Reference を参照してください。

AI-LocalizedAI で翻訳
問題が見つかった場合、文字/画像を選択し、Ctrl + Enter キーを押してフィードバックをお送りください。
機能の可用性

利用できる機能は、所有する Altium ソリューション (Altium DevelopAltium Agile のエディション (Agile Teams、または Agile Enterprise)、または Altium Designer (有効な期間)) によって異なります。

説明されている機能がお使いのソフトウェアに表示されない場合、Altium の営業担当者にお問い合わせください

従来のドキュメント

Altium Designer のドキュメントは、バージョンごとに掲載されなくなりました。Altium Designer の旧バージョンのドキュメントは、Other Installers ページの Legacy Documentation の項目をご覧ください。

Content