フォームの再描画
日付 | 2008/02/05 |
---|---|
ID | 08-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に最描画の機会を与えているのです。この方法は、再描画に限らず、フォームを利用して繰り返し動作をさせたい時などにも応用が利きます。