DelphiScriptとDelphiの違い

DelphiScriptとDelphiの違い

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

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

DelphiScriptの変数

スクリプト内のすべての変数はVariant型であり、変数宣言における型指定は無視されるため、省略可能です。したがって、以下の3つの宣言は正しいものです:

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

プロシージャや関数の宣言におけるパラメータの型も無視されるため、省略可能です。たとえば、次のコードは正しいです:

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

一般的に、バリアントを使用すると、あらゆるデータ型を格納したり、数多くの演算や型変換を実行したりできます。 バリアントは実行時に型チェックおよび計算が行われます。コンパイラはコード内の潜在的なエラーについて警告を出さないため、これらのエラーは徹底的なテストによってのみ検出可能です。全体として、バリアントを使用するコード部分は、多くの操作が実行時まで解決されないため、インタプリタ型コードと見なすことができます。これはコードの実行速度に影響を与える可能性があります。

その結果、バリアント変数が宣言され、バリアント値が割り当てられると、その変数は互換性のあるデータ型にも、互換性のないデータ型にもコピーできるようになります:

Var
V;
Begin
  // variable V can be assigned values of several different types:
  V := 10;
  V := 'Hello, World';
  V := 45.55;
End;

互換性のないデータ型が変数に代入された場合、DelphiScriptインタプリタは可能な限り型変換を行います。そうでない場合は、実行時エラーが発生します。実際には、バリアントはデータとともに型情報を格納するため、DelphiScriptは同等のEmbarcadero Delphiコンパイル済みコードよりも処理速度が遅くなります。

スクリプトにおけるセット

DelphiScriptにはセット型が存在せず、セット演算子もサポートされていません。これに対し、Delphi言語にはセット型があり、セット演算子もサポートされています。

DelphiScriptスクリプトでセットを使用するには、スクリプト内でセットを操作する組み込み関数を使用してください。

詳細については、「DelphiScript でのセットの使用」の項目を参照してください。

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

関数やプロシージャの使用を検討する場合 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;

ネストされたルーチン

ネストされたルーチンはサポートされていますが、最上位の関数の変数はネストされたルーチンからは使用できません。

配列要素

配列要素の型は無視されるため、省略可能です。したがって、次の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関数。

例外の発生

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

Example:

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

See also
Try、Finally、Raise キーワード

ThreadVar

DelphiScript では、 Threadvar キーワードは Varとして扱われます。なお、Embarcadero Delphi では、 Threadvar キーワードを使用して宣言された変数は、スレッドごとに異なる値を持つことに注意してください。

Set演算子

Set演算子 In はサポートされていません。 InSet 演算子を使用すると、値がセットの要素であるかどうかを確認できます。例:

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

Delphiの集合演算子は +, -, *, =, >= は正しく動作しません。代わりに、組み込みのDelphiscript関数 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); 

See also
MkSet キーワード
MkSetRange キーワード
InSet キーワード
SetDifference キーワード
SetIntersection キーワード
SetUnion キーワード
SubSet キーワード
InSet キーワード

演算子

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

ディレクティブ

以下のディレクティブはサポートされていません(一部は廃止されており、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.

また、 in ディレクティブ内の Uses 句内のディレクティブは無視されることに注意してください。

無視されるキーワード

` interfaceimplementationprogram および unit キーワードは、DelphiScript では無視されます。スクリプト内にこれらを含めることはできますが、何の効果もありません。ただし、これらのキーワードを使用することで、スクリプトの可読性を高めることができます。

サポートされていないキーワード

DelphiScript では、以下のキーワードはサポートされていません:

  • as, asm, class, dispinterface, exports, finalization, inherited, initialization, inline, interface, is, library, object, out, property, record, resourcestring, set, supports, type.

DelphiScript では、以下の Delphi RTL 関数はサポートされていません:

  • 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 のオブジェクトインターフェースは、スクリプト内で使用可能です。たとえば、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を使用できます:

  • 特定のエムバーカデロ Delphi™ 関数およびクラス、ならびに DelphiScript 拡張機能
  • クライアントAPI
  • PCBサーバーAPI
  • 回路図サーバーAPI
  • ワークスペース・マネージャー・サーバー API
  • 統合ライブラリ API
  • Altium Designer API 関数
  • パラメトリック処理

詳細情報

ダウンロード可能なスクリプト集内のスクリプトを確認し、Altium Designerのオブジェクトインターフェースや関数、およびスクリプト内で使用されているDelphiのオブジェクトや関数についてご確認ください。

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

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

Altium Designer API リファレンスを参照して、Altium Designer API の範囲およびスクリプト用のインターフェース・オブジェクトに関する情報を確認してください。

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

ご利用可能な機能は、お使いのAltiumソリューション(Altium DevelopAltium Agile TeamsAltium Agile Enterprise、または有効な契約期間中のAltium Designer)によって異なります。

実際にお使いのソフトウェアに文書化されている機能が表示されない場合は、詳細についてAltium Sales までお問い合わせください。

従来のドキュメント

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

Content