4D 18 R5 では、フォームマクロが導入されました。これらは、繰り返し行う作業の時間を短縮する理想的な方法を提供するなど、非常に便利なものです。このブログ記事では、マクロがどのように機能し、どのような可能性を提供するのか、いくつかの基本的な例を紹介します。以下のサンプルはすべてGitHubで公開されています。
例1: フォームオブジェクトの属性を変更する
これは、選択されたすべてのフォームオブジェクトのフォントカラーを赤に設定するマクロです。
FormMacros.jsonファイルで、マクロを宣言しています。
{ "macros": { "Set Red": { "class": "SetRedColor" } }
クラスを作成し、“currentSelection” プロパティで、選択されたフォーム・オブジェクトのコレクションを取得します。次に、フォーム・オブジェクトのプロパティを変更します。最後に、”currentPage“という属性で、4Dを通知するための変更点を返します。
そのコードです。
Function onInvoke // Set stroke to red for each selected objects($editor:Object) :Object
var $name :Text
If ($editor.editor.currentSelection.length>0)
For each ($name;$editor.editor.currentSelection)
$editor .editor.currentPage.objects[$name]。stroke:="red"
End for each
Else
ALERT ("Please, select a form object.")
End if
// 4Dに修正を通知
$0 :=New object("currentPage";$editor.editor...currentPage)
SetRedColor” クラスは、マクロのコードを含んでおり、GitHub の“HDI_FormMacro” コンポーネントで利用可能です。
例2: JSONマクロファイル内のパラメータを使用する
あるテキストは赤で、別のテキストは緑で表示する必要があります。2つのマクロを作成してそれぞれを関連付けることもできますし、色などのパラメータを指定して2つのマクロを作成し、同じクラスに関連付けることもできますね。
FormMacros.jsonファイルで、同じクラスと color パラメータを使用する 2 つのマクロを宣言しています。
{ "macros": { "Set Font Color to Red": { "class": "SetFontColor", "color": "red" }, "Set Font Color to Green": { "class": "SetFontColor", "color": "green" }, }
クラスのコンストラクタで、color パラメータを取得します。
Class constructor
var . := .$1 Object
Thiscolor$1color
onInvoke 関数では、例 1 と同じコードを使うことができます。唯一の違いは、文字列 “red” の代わりに、変数 “This.color“.
SetFontColor” クラスにマクロのコードが含まれており、GitHub の“HDI_FormMacro” コンポーネントで公開されています。
例 3: メソッド付きのフォームオブジェクトを追加する
マクロを使えば、フォームオブジェクトをメソッドで追加することもできます。メソッドを関連付けたり追加したりするには、いくつかの方法があります。可能性のすべてを説明しているドキュメントのこのページを読むことをお勧めします。
この例では、メソッドの行のコードだけが4Dに渡されます。実行すると、4Dは対応するメソッドファイルを作成し、名前を付けます。
Function onInvoke
($editor:Object)->$result:Object
var $btnHello :Object
// Create a "Hello" button $btnHello :=New object("type"; "button";\
"text"; "Hello World!";\
"method";New object("source"; "ALERT(\"coucou")");\
"events";New collection("onClick");\
"width";120;\
"height";20;\
"top";0;\
"left";0).
// Add button in the current page
$editor.editorcurrentPage
.objects.btnHello:=$btnHello
// Select the new button in the form editor
$editor.editor .currentSelection.clear()
$editor.editor .currentSelection.push("btnHello")
// Notify 4D of the modification $result :=New object
$result .currentSelection:=$editor.editor.currentSelection
$result .currentPage:=$editor.editor.currentPage
フォームオブジェクトをフォームの中に簡単に配置し、他のプロパティを(必要に応じて)変更するために、“currentSelection“上で単純なclear() とpush() を使ってフォームオブジェクトを選択します。このとき、変更したことを4Dに通知するために“currentSelection” を忘れずに返します。
AddButton“クラスにマクロのコードが含まれており、GitHubの“HDI_FormMacro“コンポーネントで公開されています。
例4: フォーム内の画像のパスをチェックする
フォームを変更しないマクロを書くこともできます。このマクロを使うと、フォームの情報、属性、プロパティを検証することができます。たとえば、複数ページにわたるフォームの画像パスを検証する場合です。
CheckImagePath” クラスにこのマクロのコードが含まれており、 GitHub の“HDI_FormMacro” コンポーネントで利用できます。
例 5: マクロでモーダルダイアログを使用する
マクロでは、モーダルダイアログを表示することもできます。たとえば、現在のページのオブジェクトのリストを、そのタイプ、名前、CSS クラス、またはその他の必要なパラメータとともに表示することができます。開発者がダイアログのSelectボタンをクリックすると、選択されたオブジェクトはフォームエディタでも選択されます。
ObjectList” クラスにマクロのコードが含まれており、GitHub の“HDI_FormMacro” コンポーネントで公開されています。
例 6: オブジェクトへの整列
4Dでオブジェクトを参照オブジェクトに整列させるには、整列ダイアログを表示する必要があります。複数のオブジェクトを選択し、クリックした位置の下にあるオブジェクトを参照オブジェクトとして決定してはどうでしょうか。このように、あなたのコードで
- で選択されたオブジェクトのリストを受け取ったら、”currentSelection” プロパティ
- に、クリックコンテキスト下のオブジェクトの名前が”target” プロパティに表示されます。
Voilà!この情報のおかげで、好きなだけアラインメントや分布を作成することができます。AlignOnTarget” クラスでは、オブジェクトに対して、左、右、上、下にアライメントする例を示しています。このマクロではグループは実装されていないので、もしこのオプションを追加したら、またGitHubでシェアしてください