フォーム&コンポーネント
グラフィカルコンポーネントの概要
スクリプティングシステムは、2種類のコンポーネント(ビジュアルコンポーネント/非ビジュアルコンポーネント)を扱います。
ビジュアルコンポーネントはユーザーインターフェースの構築に使用し、非ビジュアルコンポーネントは、Timer、OpenDialog、MainMenu コンポーネントのように、さまざまなタスクに使用します。
Timer非ビジュアルコンポーネントは、スケジュールされた間隔で特定のコードを実行するために使用でき、ユーザーの目に触れることはありません。Button、Edit、Memoコンポーネントはビジュアルコンポーネントです。
どちらのタイプのコンポーネントも設計時には表示されますが、非ビジュアルコンポーネントは実行時には表示されません。Tool Palette パネルのコンポーネントはオブジェクト指向で、次の3つの項目を持ちます。
- プロパティ
- イベント
- メソッド
Property は、オブジェクトの見た目の振る舞い、またはオブジェクトの動作に影響を与える特性です。たとえば Visible プロパティは、スクリプトフォーム上でそのオブジェクトが表示されるかどうかを決定します。
Event は、スクリプトによって検出されるアクションまたは発生事象です。スクリプトでは、マウスクリックなどの特定のイベントを捕捉するために設計された各イベントハンドラに対して、プログラマがコードを書きます。
Method は、常にオブジェクトに関連付けられる手続きであり、オブジェクトの振る舞いを定義します。
すべてのスクリプトフォームには、1つ以上のコンポーネントがあります。コンポーネントは通常、情報を表示したり、ユーザーがアクションを実行できるようにしたりします。たとえば、Label は固定テキストの表示に使用し、Edit ボックスはユーザーがデータを入力できるようにするために使用し、Button はアクションを開始するために使用できます。
フォームには任意の組み合わせのコンポーネントを配置でき、スクリプトの実行中、ユーザーはフォーム上の任意のコンポーネントと対話できます。ユーザーがボタンをクリックしたとき、または Edit ボックス内のテキストを変更したときに何が起こるかを決めるのは、プログラマの役割です。
スクリプティングシステムには、スクリプト向けに複雑なユーザーインターフェースを作成するために使用できる多数のコンポーネントが用意されています。フォームにコンポーネントを配置するには、 Tool Palette パネルでそのアイコンを見つけ、ダブルクリックします。この操作により、アクティブなフォーム上にコンポーネントが配置されます。ほとんどのコンポーネントの見た目はプロパティで設定します。コンポーネントは最初、フォーム上の既定位置に配置されますが、必要に応じて再配置(ドラッグ)やサイズ変更(伸縮)できます。また、Object Inspector パネルを使用して、後からサイズや位置を変更することもできます。
コンポーネントをフォームにドロップすると、スクリプティングシステムはコンポーネントを使用するために必要なコードを自動生成し、スクリプトフォームを更新します。必要なのは、プロパティを設定し、イベントハンドラのコードを実装して、目的のメソッドを使用できるようにすることだけです。これにより、フォーム上のコンポーネントが動作するようになります。
スクリプトフォームの設計
スクリプトフォームは、環境内でユーザーと対話するために設計されます。スクリプトフォームの設計は、ビジュアル開発の中核です。
実際には、すべてのコンポーネントはスクリプトフォーム上に配置され、設定された各プロパティは、フォームを記述するファイル(*.DFM ファイル)に保存されます。このファイルは、関連するスクリプトコード(*.PAS ファイル)と関係を持ちます。各スクリプトフォームには、.PAS ファイルと、それに対応する .DFM ファイルがあります。
スクリプトフォームとそのコンポーネントを扱う際、すべての要素のプロパティは Object Inspector パネルで確認および変更できます。複数のコンポーネントを選択するには、コンポーネントを Shift+クリックするか、フォーム上でコンポーネントを囲む選択矩形をドラッグします。スクリプトフォームにはタイトルがあり(Object Inspector パネルの Caption プロパティ)、これで設定します。
新しいスクリプトフォームの作成
スクリプトプロジェクトを開いた状態で、Projects パネル内のプロジェクトを右クリックし、ポップアップのコンテキストメニューで Add New to Project 項目をクリックして、Delphi Script Form 項目を選択します。既定名が EditScript1.pas の新しいスクリプトフォームが開きます。
スクリプトフォームの表示
スクリプトフォームを実行する際、フォームを表示する手続きをスクリプトに用意する必要があります。この手続き内で、フォームに対して ShowModal メソッドを呼び出せます。スクリプトフォームの ShowModal メソッドが正しく動作するには、フォームの Visible プロパティを false にする必要があります。
ShowModal example:
Procedure RunDialog;
Begin
DialogForm.ShowModal;
End;
ShowModal の例は、RunDialog 手続きが呼び出されたときにスクリプトフォームを表示するための、非常にシンプルな方法です。DialogForm.ShowModal メソッドを呼び出す前に、DialogForm オブジェクトのコンポーネントに値を代入できる点に注意してください。
以下に示す ModalResult プロパティの例は、もう少し複雑です。次のメソッドは、スクリプトフォーム上のボタンに使用されます。これらのメソッドにより、ユーザーが OK または Cancel ボタンをクリックするとダイアログが終了し、ShowModal メソッドからそれぞれ mrOk または mrCancel が返されます。
ModalResult Example:
Procedure TForm.OKButtonClick(Sender: TObject);
Begin
ModalResult := mrOK;
End;
Procedure TForm.CancelButtonClick(Sender: TObject);
Begin
ModalResult := mrCancel;
End;
Procedure RunShowModalExample;
Begin
// Form's Visible property must be false for ShowModal to work correctly.
If Form.ShowModal = mrOk Then ShowMessage('mrOk');
If Form.ShowModal = mrCancel Then ShowMessage('mrCancel');
End;
このスクリプトフォームでユーザーがいずれかのボタンをクリックすると、ダイアログボックスは閉じます。ModalResult メソッドが設定されるとスクリプトエンジンが自動的にスクリプトフォームを閉じるため、Close メソッドを呼び出す必要はありません。
ユーザーが Esc キーを押したときにフォームの ModalResult を Cancel に設定したい場合は、Object Inspector パネルで Cancel ボタンの Cancel プロパティを True に設定するか、フォームのボタン CancelButtonClick イベントハンドラに Sender.Cancel := True を挿入してください。
ユーザーからの入力を受け付ける
ユーザー入力を受け付けられる一般的なコンポーネントの1つが TEdit コンポーネントです。このコンポーネントには、ユーザーが文字列を入力できるフィールドがあります。なお、Delphi には TMaskEdit のような他のコンポーネントもあり、これは入力マスクを文字列として保持する edit コンポーネントで、入力を制御/フィルタリングします。
以下の例は、ユーザーが edit ボックスに何かを入力した後にボタンをクリックしたときの処理を示しています。ユーザーが edit コンポーネントに何も入力していない(空白)場合、イベントハンドラは警告メッセージで応答します。
Procedure TScriptForm.ButtonClick(Sender : TObject);
Begin
If Edit1.Text = '' Then
Begin
ShowMessage('Warning - empty input!');
Exit;
End;
// do something else for the input
End;
ユーザーは Tab キーを使用するか、フォーム内の別のコントロールをクリックすることで、ダイアログの入力フォーカスを変更できる点に注意してください。
イベントへの応答
フォーム上のボタンまたはコンポーネントがクリックされると、スクリプティングシステムは Altium Designer からイベント通知を受け取り、適切なイベントハンドラメソッドを呼び出して応答します。
See also
scripts collection の Scripts\DelphiScript Scripts\General\ フォルダにある HelloWorld プロジェクト。
scripts collection の Scripts\DelphiScript Scripts\General\ フォルダにある ShowModal のサンプルスクリプト。
イベントハンドラの作成
フォームスクリプト内の各コンポーネントにはイベント名のセットがあり、これらはスクリプトのイベントハンドラで使用され、Altium Designer におけるユーザー操作に対してスクリプトがどのように反応するかを決定します。たとえば、ユーザーがフォーム上のボタンをクリックすると、Altium Designer はスクリプトにメッセージを送信し、スクリプトはこの新しいイベントに反応します。ボタンの OnClick イベントが指定されている場合、それが実行されます。
イベントに応答するコードは通常 DelphiScript のイベントハンドラに含まれ、すべてのコンポーネントには反応可能なイベントのセットがあります。たとえば、クリック可能なコンポーネントには、ユーザーがコンポーネントをクリックしたときに発火する OnClick イベントがあります。これらのコンポーネントには、フォーカスの取得/喪失に関するイベントもあります。ただし、OnEnter と OnExit のコードが指定されていない場合(OnEnter - コントロールがフォーカスを受け取った、OnExit - コントロールがフォーカスを失った)、そのイベントはスクリプトによって無視されます。
要するに、イベントとは、ボタンのクリックなど Altium Designer 内で発生した事象と、その事象に応答するコード片を結び付けるリンクです。応答するコードがイベントハンドラです。このコードはプロパティ値を変更し、メソッドを呼び出します。
コンポーネントのプロパティ
コンポーネントのプロパティ一覧を表示するには、コンポーネントを選択し、Object Inspector パネルの Properties タブを開きます。
コンポーネントのイベント
コンポーネントが反応できるイベント一覧を表示するには、コンポーネントを選択し、Object Inspector パネルの Events タブを開きます。イベント処理手続きを作成するには、コンポーネントに反応させたいイベントを選択し、イベント名をダブルクリックします。スクリプティングシステムがイベントハンドラの枠組みコードを自動的に挿入します。
たとえば、Tool Palette パネルから TButton コンポーネントを選択してスクリプトフォームにドロップし、Object Inspector パネルで OnClick イベント名の横をダブルクリックします。スクリプティングシステムは Code Editor にフォーカスを移し、OnClick イベント用のスケルトンコードを作成します。

たとえば、ボタンの CloseClick イベントハンドラに Close メソッドがある場合、ボタンがクリックされるとボタンのイベントハンドラが OnClick イベントを捕捉し、イベントハンドラ内のコードが実行されます。その結果、Close メソッドによってスクリプトフォームが閉じられます。
まとめると、フォーム上で、または Object Inspector パネルを使用してボタンコンポーネントを選択し、Events ページを選択して、OnClick イベントの右側をダブルクリックすると、新しいイベントハンドラがスクリプトに追加されます。あるいは、ボタン自体をダブルクリックすると、スクリプティングシステムがこの OnClick イベントのハンドラを追加します。なお、他の種類のコンポーネントでは既定の動作が異なります。
コンポーネントのメソッド
コンポーネントのメソッド一覧については、Component Reference ドキュメントを参照してください。
スクリプトフォームへのコンポーネントのドロップ
Tool Palette panel のコンポーネントをスクリプトで使用するには、コンポーネントをフォーム上にドロップできるよう、事前にスクリプトフォームが存在している必要があります。通常、コンポーネントをスクリプトフォームにドロップした場合、これらのオブジェクトを作成/破棄する必要はありません。スクリプトフォームが自動的に行います。
また、スクリプティングシステムはコンポーネントを使用するために必要なコードを自動生成し、スクリプトフォームを更新します。あとはプロパティを設定し、イベントハンドラにコードを記述し、必要なメソッドを使用して、動作するスクリプトフォームを実装するだけです。
スクリプトでのコンポーネント作成
コンポーネントの Constructor に Nil パラメータを渡すことで、スクリプト内でコンポーネントを直接作成/破棄できます。通常はフォームのハンドルを渡す必要はありません。スクリプトフォームが自動的に処理するためです。たとえば、Open および Save ダイアログ(Embarcadero Delphi RTL の TOpenDialog および TSaveDialog クラス)を作成/破棄できます。
スクリプトフォームのカスタマイズ
スクリプトフォームをカスタマイズする際の要点は次のとおりです。
- フォームを他の開いているパネルより常に前面に表示させるには、
FormStyleプロパティをfsStayOnTopに設定します。 - フォームの既定の動作を定義するには、
FormKindを次のいずれかの値に設定します。fkNone、fkNormal、fkServerPanel、またはfkModal。 fkModalの場合、フォームはモーダルフォームになります。つまり、フォームを閉じるなど、処理を進める前にユーザー入力を待機します。fkServerPanelの場合、フォームは Server パネルとして表示されます。fkNormalの場合、フォームは通常の非モーダルフォームとして動作します。- フォームの既定のスクロールバーを削除するには、
HorzScrollBarおよびVertScrollBarプロパティの値を変更します。 - フォームを MDI フレームまたは MDI 子にするには、
FormStyleプロパティを使用します。 - フォームの境界線スタイルを変更するには、
BorderIconsおよびBorderStyleプロパティを使用します(結果は実行時に表示されます)。 - 最小化されたフォームのアイコンを変更するには、
Iconプロパティを使用します。 - アプリケーションウィンドウ内でのフォームの初期位置を指定するには、
Positionプロパティを使用します。 - フォームの初期状態(例:最小化、最大化、通常)を指定するには、
WindowStateプロパティを使用します。 - 実行時にフォームの作業領域を定義するには、
ClientHeightおよびClientWidthプロパティを使用します(ClientHeightとClientWidthはフォームの境界線内の領域を表し、HeightとWidthはフォーム全体の領域を表します)。 - 実行時にフォーム内で初期フォーカスを持つコントロールを指定するには、
ActiveControlプロパティを使用します。 - 選択されているコントロールに関係なく、すべてのキーボードイベントをフォームに渡すには、
KeyPreviewプロパティを使用します。 - フォームに複数のメニューが含まれる場合に特定のメニューを指定するには、
Menuプロパティを使用します。
スクリプトフォームとコンポーネントの再描画
たとえばコントロールが更新/再描画されないなど、スクリプトフォームの表示が最新でなくなると、コントロールがフリーズしたり表示が崩れたりして見えることがあります。これは、そのスクリプトによる集中的なバックグラウンド処理が原因である可能性があります。
スクリプトフォームの Update メソッド、および Tool Palette panel の多くのスクリプトコンポーネントには、フォームまたは特定のコントロールのグラフィカルな内容を更新する手段が用意されています。下の例では、Update メソッドを含む行がグレーでハイライトされています。
StatusBar component and its Update method Example:
Procedure TConverterForm.loadbuttonClick(Sender: TObject);
Begin
If OpenPictureDialog1.Execute then
Begin
XPProgressBar1.Position := 0;
XStatusBar1.SimpleText := ' Loading...';
XStatusBar1.Update;
// loading a monochrome bitmap only
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
// Check if image is monochrome, otherwise prompt a warning
If Image1.Picture.Bitmap.PixelFormat <> pf1bit Then
Begin
ShowWarning('The image is not a monochrome!');
Close;
End;
lImageSize.Caption := IntToStr(Image1.Picture.Width) + ' x ' +
IntToStr(Image1.Picture.Height) + ' mils';
convertbutton.Enabled := True;
LoadButton.Enabled := False;
XStatusBar1.SimpleText := ' Ready...';
XStatusBar1.Update;
End;
End;
上記のコードスニペットは PCB Logo Creator スクリプトプロジェクトのもので、downloadable スクリプトコレクションの Scripts\Delphiscript Scripts\Pcb\PCB Logo Creator フォルダにあります。