Tips

同じ用途のウィンドウを重複して開かない

日付2020/03/11
ID20-001
バージョンv17以降
プラットフォームWindows, Mac

複数のウィンドウを開いて処理をしたいが、同じ処理(同じメソッド)のウィンドウを複数開くたくないことは良くあります。ここで紹介する例題は、同じ処理のウィンドウが既に存在するときは、ウィンドウを開かず、当該処理のウィンドウを最前面にします。

ポイントは、New procesに*オプションを渡すことと、プロセスに処理の内容を反映する名前をつけることです。例題では、メソッド名をそのままプロセス名に転用しています。


  //同じ用途のウィンドウを重複して開かない

If (Current process name=Current method name)
	
	C_LONGINT($window)
	
	  //メソッド名と同じプロセス名のときはウィンドウを表示
	
	$window:=Open form window("Form Dialog")
	DIALOG("Form Dialog")
	
Else 
	
	C_LONGINT($proc;$loop)
	C_BOOLEAN($is_opened)
	ARRAY LONGINT($list;0)
	
	  //メソッド名と異なるプロセス名のときは新しいプロセスを起動する
	
	$proc:=New process(Current method name;0;Current method name;*)  //*オプション:同じ名称のプロセスは起動しない
	
	  //ウィンドウが開かれるのを待つ
	$is_opened:=False
	For ($loop;60;0;-1)  //60回(3秒)待っても開かないときはタイムアウトとしてループを抜ける
		WINDOW LIST($list)
		For ($i;1;Size of array($list))
			If (Window process($list{$i})=$proc)
				$is_opened:=True  //起動したプロセスでウィンドウが開かれた
			End if 
		End for 
		If ($is_opened)
			$loop:=0  //ループを終了する
		Else 
			DELAY PROCESS(Current process;5)  //ウィンドウが開かれていなければ待ち合わせする
		End if 
	End for 
	
	  //ウィンドウが開かれたなら最前面に移動する
	BRING TO FRONT($proc)
	
End if