4D-jp 4D Japan Technical Support Team

条件に合致するフォームオブジェクトをすべてのフォームから削除したい

2023-01-17

すべてのフォームのデザインを見直す必要に迫られることがあると思います。 オブジェクトの属性の変更や削除や追加など、条件が明確であれば、メソッドで自動化して処理することが可能かもしれません。

例えば、ある共通する名前で始まるようなオブジェクトをすべて削除するようなケースを考えてみます。

最初に、すべてのフォームのソースにアクセスする方法ですが、Folderコマンドを使うと1行で表現することが可能です。

$files:=Folder("/PACKAGE/Project/Sources").files(fk recursive+fk ignore invisible).query("fullName = 'form.4DForm'")

Folderコマンドにわたすパスは、プラットフォームに関係なくPOSIX形式です。 上記の場合、Folderコマンドによって/PACKAGE/Project/Sources配下にあるファイルすべてがリスト化され、さらにquery()を使いファイル名がform.4DFormであるファイルに絞り込みしています。 このようにドット記法で接続すると、複数の動作をたった1行にまとめることができます。

そして、このリストをループして処理し、条件に合うオブジェクトを削除するコードは、次のようになります。

$files:=Folder("/PACKAGE/Project/Sources").files(fk recursive+fk ignore invisible).query("fullName = 'form.4DForm'")
For each ($fileForm; $files)  //フォームソースファイルを順次処理する
	$form:=JSON Parse($fileForm.getText())  //ソースを読み出してオブジェクト変数に収める
	$edited:=False  //フォームの編集フラグを初期化
	For each ($page; $form.pages)  //フォームの各ページを処理する
		For each ($name; $page.objects)  //各ページに配置されたフォームオブジェクトを処理する
			If ($name="Button_sample@")  //対象となるオブジェクトであるか?
				OB REMOVE($page.objects; $name)  //オブジェクトを削除
				$edited:=True  //削除したことを編集フラグに記録
			End if 
		End for each 
	End for each 
	If ($edited)  //編集したフォームか?
		$fileForm.setText(JSON Stringify($form; *))  //ソースをテキスト化して保存
	End if 
End for each 

このサンプルコードでは、フォームオブジェクト名が”Button_sample”で始まる文字列であることが、唯一の条件になっています。

フォームは構造体として表現されているので、オブジェクト変数に収めると、各構造に容易にアクセスできるようになります。 フォームの構造を理解することが重要ですが、オブジェクト記法に慣れてしまうと、プログラムが容易にできる良い例であると思います。

今回の条件は単純ですが、オブジェクトのタイプや属性などは、フォームの構造体としてオブジェクト変数でアクセスできますから、かなり複雑な条件でもプログラムすることが可能です。

なお、フォームの構造については、リファレンスをご参照ください。

ダイナミックフォーム