Tips

すべてのフォームで共通する初期化メソッドを実行させる

日付2019/03/07
ID19-001
バージョンv15以降
プラットフォームWindows. Mac

あるとき、突如としてすべてのフォームを同じメソッドを利用して初期化しなくてはならないという問題に直面したとき、大量にあるフォームのフォームメソッドを更新するのは大変な作業になります。フォームにフォームメソッドが存在しない可能性もありますから、一つづつフォームをチェックしてコードを書き換えるのを考えるだけで気が遠くなる方もいるかもしれません。そのようなときには、メソッドを書き換えるプログラムを作成して、プログラムにメソッドを書き換えさせることを検討してください。

実際に動作する例題を作成してみましたので、ご参考にいただければと思います。

後述のコードは、プロジェクトフォームとテーブルフォームのフォームメソッドの最初の行に「Method_form_init」というプロジェクトメソッドの呼び出しを記述する例題です。Method_form_init メソッドにForm eventのOn Loadを捉えて初期化を実行するプログラムを記述することで、すべてのフォームで同じ初期化を実行することができます。

  //挿入するメソッド名
$NEW_METHOD_NAME:="Method_form_init"

$ref_prog:=Progress New   //進行状況表示

  //プロジェクトフォーム
FORM GET NAMES($form_name)
METHOD GET PATHS FORM($method_name)
For ($i;1;Size of array($form_name))
	$path:=METHOD Get path(Path project form;$form_name{$i})
	Progress SET MESSAGE ($ref_prog;"Method: "+$path)  //進行状況表示
	If (Find in array($method_name;$path)>0)
		METHOD GET CODE($path;$code)
	Else 
		$code:=""
	End if 
	Case of 
		: (Match regex("(?m)^"+$NEW_METHOD_NAME+"(\\s|\\r)";$code;1;$pos;$len))
			  //すでに挿入済みなので何もしない
		: (Match regex(".*%attributes.*";$code;1;$pos;$len))
			  //メタデータが存在するときはメタデータの後に挿入する
			$code:=Substring($code;1;$pos+$len)+$NEW_METHOD_NAME+"\r"+Substring($code;$pos+$len+1)
			METHOD SET CODE($path;$code)
		Else 
			  //先頭に挿入
			$code:=$NEW_METHOD_NAME+"\r"+$code
			METHOD SET CODE($path;$code)
	End case 
End for 

  //テーブルフォーム
For ($table_NO;1;Get last table number)
	If (Is table number valid($table_NO))
		FORM GET NAMES(Table($table_NO)->;$form_name)
		METHOD GET PATHS FORM(Table($table_NO)->;$method_name)
		For ($i;1;Size of array($form_name))
			$path:=METHOD Get path(Path table form;Table($table_NO)->;$form_name{$i})
			Progress SET MESSAGE ($ref_prog;"Method: "+$path)  //進行状況表示
			If (Find in array($method_name;$path)>0)
				METHOD GET CODE($path;$code)
			Else 
				$code:=""
			End if 
			Case of 
				: (Match regex("(?m)^"+$NEW_METHOD_NAME+"(\\s|\\r)";$code;1;$pos;$len))
					  //すでに挿入済みなので何もしない
				: (Match regex(".*%attributes.*";$code;1;$pos;$len))
					  //メタデータが存在するときはメタデータの後に挿入する
					$code:=Substring($code;1;$pos+$len)+$NEW_METHOD_NAME+"\r"+Substring($code;$pos+$len+1)
					METHOD SET CODE($path;$code)
				Else 
					  //先頭に挿入
					$code:=$NEW_METHOD_NAME+"\r"+$code
					METHOD SET CODE($path;$code)
			End case 
		End for 
	End if 
End for 

Progress QUIT ($ref_prog)