Tips

フォームの再描画

日付2008/02/05
ID08-003
バージョン6.0~2004
プラットフォームMac & Win

この記事は、最新ではないバージョンに関連した方法について解説しています。

最新のバージョンでは推奨されていないか、または他の方法で簡単に実現できる可能性があります。

メソッドでループ処理中の結果をフォームに表示しながら処理をしたいと考えたとき、フォームの再描画が上手くいかず諦めることがあるかもしれません。4Dの再描画は最適化されているので、例えば REDRAW のような再描画を指示するコマンドを明示的に記述しても、直ちに再描画される訳ではないので注意が必要です。

では、リアルタイムで更新される情報をフォームに表示する方法は無いのでしょうか。

リアルタイムにフォームで最描画を行うためには、フォームイベントをひとまず終了させることを考えてください。なぜなら、フォームイベントの終了のタイミングでは、必ず4Dは再描画を行うからです。

例えば、次のようなコードを思いついたとします。

C_LONGINT(Variable1)
Case of 
	\ (Form event=On Load )
		For ($i;1;10)
			Variable1:=$i
			REDRAW(Variable1)
			DELAY PROCESS(Current process;60)  `1秒
		End for 
End case 

期待しているのは、1秒間おきにカウントアップされていく変数がフォームに表示されることです。しかし実際には、ウィンドウに何も表示されずに10秒間待たされた後、フォームが表示されたときには変数に10と表示されていることになります。このような動作になってしまうのは、4DがOn Loadイベントが終了するのを待ってフォームの表示(再描画)を行っているからです。

期待通りの動作を行うためには次のようにコードを記述します。

C_LONGINT(Variable1)
Case of 
	\ (Form event=On Load )
		Variable1:=1  `初期化
		   SET TIMER(60)  `1秒
	\ (Form event=On Timer )
		SET TIMER(0)  `タイマーイベントのクリア
		Variable1:=Variable1+1
		If (Variable1#10)
			SET TIMER(60)  `1秒
		End if 
End case 

この例では、On Timerイベントを使うことでフォームイベントを終了させ、4Dに最描画の機会を与えているのです。この方法は、再描画に限らず、フォームを利用して繰り返し動作をさせたい時などにも応用が利きます。