フォームエディターマクロ
4D のフォームエディターはマクロをサポートしています。 1つ以上のアクションを実行するための指示をマクロと呼びます。 呼び出されると、マクロは登録された指示を実行し、自動的に指定のアクションをおこないます。
たとえば、定期レポートに特定のフォーマットが指定されている場合 (例: テキストによってフォントカラーが赤や緑であるなど)、マクロを作成してフ ォントカラーの設定を自動でおこなうことができます。 4Dフォームエディターのマクロでは、次のことがおこなえます:
- 4Dコードを作成・実行する
- ダイアログを表示する
- オブジェクトを選択する
- フォームやフォームオブジェクトおよびそれらのプロパティを追加・編集・削除する
- プロジェクトファイルを編集する (更新・削除)
フォームエディター用のカスタム機能を定義するため、マクロコードは クラス関数 と JSON のフォームオブジェクトプロパティ を使用できます。
ホストプロジェクトおよび、プロジェクト内のコンポーネントにてマクロを定義することができます。 通常は開発用のコンポーネントにマクロをインストールして使用します。
マクロが呼び出されると、指定されている既存の動作はマクロによってオーバーライドされます。
例題
フォームの左上に "Hello World" アラートボタンを追加するマクロを作成します。
- プロジェクトの
Sources
フォルダー内に配置されたformMacros.json
ファイルに、次のように書きます:
{
"macros": {
"Add Hello World button": {
"class": "AddButton"
}
}
}
-
次に、
AddButton
という名前の 4Dクラスを作成します。 -
AddButton
クラスに次の関数を定義します:
Function onInvoke($editor : Object)->$result : Object
var $btnHello : Object
// "Hello" ボタンを作成します
$btnHello:=New object("type"; "button"; \
"text"; "Hello World!"; \
"method"; New object("source"; "ALERT(\"Hello World!\")"); \
"events"; New collection("onClick"); \
"width"; 120; \
"height"; 20; \
"top"; 0; \
"left"; 0)
// 現在のページにボタンを追加します
$editor.editor.currentPage.objects.btnHello:=$btnHello
// フォームエディター上で新規作成したボタンを選択します
$editor.editor.currentSelection.clear() //unselect elements
$editor.editor.currentSelection.push("btnHello")
// 4D に変更内容を通知します
$result:=New object("currentSelection"; $editor.editor.currentSelection;\
"currentPage"; $editor.editor.currentPage)
マクロを呼び出します:
フォームエディターでマクロを呼び出す
4Dプロジェクトにマクロが定義されていると、フォームエディターのコンテキストメニューを使ってマクロを呼び出すことができます:
このメニューは formMacros.json
マクロ定義ファイル をもとに作成されています。 マクロメニュー項目は ABC順に表示されます。
このメニューは、フォームエディター内で右クリックにより開くことができます。 選択オブジェクトがある状態や、フォームオブジェクトの上でマクロを呼び出した場合は、それらのオブジェクト名がマクロの onInvoke
関数の $editor.currentSelection
や $editor.target
パラメーターに受け渡されます。
1つのマクロによって複数の処理を実行することができます。 マクロで実行した処理は、フォームエディターの 取り消し 機能でもとに戻すことができます。
マクロファイルの場所
4Dフォームエディターマクロは、プロジェクトあるいはコンポーネントごとに 1つの JSONファイルによって定義されます: FormMacros.json
。
このファイルは、ホストまたはコンポーネントプロジェクトの Project > Sources フィルダーに配置しなければなりません:
マクロの宣言
formMacros.json
ファイルの構造は次の通りです:
{
"macros": {
<macroName>: {
"class": <className>,
<customProperty> : <value>
}
}
}
JSONファイルの説明です:
属性 | 型 | 説明 | ||
---|---|---|---|---|
macros | object | 定義されたマクロのリスト | ||
<macroName> | object | マクロ定義 | ||
class | string | マクロクラス名 | ||
<customProperty> | any | (任意) コンストラクターによって取得するカスタム値 |
カスタムプロパティはマクロの constructor 関数に受け渡されます。
例題
{
"macros": {
"Open Macros file": {
"class": "OpenMacro"
},
"Align to Right on Target Object": {
"class": "AlignOnTarget",
"myParam": "right"
},
"Align to Left on Target Object": {
"class": "AlignOnTarget",
"myParam": "left"
}
}
}
マクロのインスタンス化
プロジェクトおよびコンポーネントにおいてインスタンス化するマクロは、それぞれ 4Dクラス として宣言する必要があります。
クラスの名称は、formMacros.json
ファイルで class 属性に定義した名前と同一でなくてはなりません。
マクロは、アプリケーションの起動時にインスタンス化されます。 そのため、関数の追加やパラメーターの編集など、マクロクラスの構造や その コンストラクター になんらかの変更を加えた場合には、それらを反映するにはアプリケーションを再起動する必要があります。
マクロ関数
マクロクラスは、1つの Class constructor
のほかに、onInvoke()
および onError()
という 2つの関数を持つことができます。
Class constructor
Class constructor($macro : Object)
引数 | 型 | 説明 |
---|---|---|
$macro | Object | formMacros.json ファイルのマクロ宣言オブジェクト |
Class constructor 関数が定義されている場合、マクロはそれによってインスタンス化されます。
アプリケーションの起動時にクラスがインスタンス化される際に、このコンストラクターが呼び出されます。
マクロの宣言 に追加したカスタムプロパティは、クラスコンストラクターが引数として受け取ります。
例題
formMacros.json
ファイルに次のようなマクロ宣言をした場合:
{
"macros": {
"最後に選択したオブジェクトを基準に左揃え": {
"class": "AlignOnTarget",
"myParam": "left"
}
}
}
以下のように書くことができます:
// クラス "AlignOnTarget"
Class constructor($macro : Object)
This.myParameter:=$macro.myParam // left ...