Tips

他のプロセス上のリスト表示にデータ更新を反映させる

日付2018/05/30
ID18-004
バージョンv16以降
プラットフォームWin, Mac

リストボックスやサブフォームで表示されているセレクションは、ウィンドウの再描画に合わせて再描画されます。あるプロセスで変更された内容が、直ちに他のプロセスで表示されているセレクションに反映されるわけではありません。セレクションを再描画してレコードの更新を反映させたい場合には、明示的にREDRAWを使う必要があります。

参考資料:REDRAWコマンドリファレンス(4D v16)

あるプロセスで変更したフィールドの値を全てのプロセスに表示されたセレクションに反映したい場合には、目的のプロセスでREDRAWを実行しなければなりません。フォームメソッドごとにREDRAWを実行するようにプログラムするのは大変ですが、フォームメソッドを書き換えることなくREDRAWをフォームで実行させることは可能です。

ポイントは次のとおりです

  1. フォーム上にあるリストボックスとサブフォームを調べて再描画させるメソッドを用意する
  2. すべての表示中ウィンドウに対して上記メソッドを実行させるメソッドを用意する

このように2つメソッドを用意してレコードを更新したときには、上記2番目のメソッドを実行するようにするだけです。

フォーム上にあるリストボックスとサブフォームを調べて再描画させるメソッド

FORM GET OBJECTS($name_object)

For ($i;1;Size of array($name_object))
	$type:=OBJECT Get type(*;$name_object{$i})
	Case of 
		: ($type=Object type listbox)
			REDRAW(OBJECT Get pointer(Object named;$name_object{$i})->)
		: ($type=Object type subform)
			REDRAW(OBJECT Get pointer(Object named;$name_object{$i})->)
	End case
End for 

すべての表示中ウィンドウに対して上記メソッドを実行させるメソッド

WINDOW LIST($ref_window)

For ($i;1;Size of array($ref_window))
	CALL FORM($ref_window{$i};"前述のメソッド名")
End for 

この記事での例題メソッドは、コードを簡単にするために、再描画が必要のないウィンドウにも再描画の指示をしています。実際に運用するためには、無駄な指示をしない、あるいは減らす工夫が必要になると思います。