フォームを最小化したときにループ処理を休ませるには?

解決


?  2008-08-26 14:48:48  No: 31656  IP: 192.*.*.*

ApplicationEventsコンポーネントを使って、

  procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
    var Done: Boolean);
  begin


    (CPU使用率100%のループ処理が入ります)


    //アプリケーションが非アクティブになったらスリープ
    if (Application.Active = False) then Sleep(1);
    //フォームを最小化したらスリープ
    if (Form1.WindowState = wsMinimized) then Sleep(1);
  end;

と記述して実行してみたところ、非アクティブ状態ではCPU使用率が
5%程度になるのですが、フォームを最小化してもCPU使用率が100%の
ままであり、スリープしていないようです。
最小化時にスリープをはさむことは可能でしょうか?

編集 削除
igy  2008-08-26 15:54:25  No: 31657  IP: 192.*.*.*

if (Form1.WindowState <> wsMinimized) then
  begin
    (CPU使用率100%のループ処理が入ります)
  end;

のような処理では、ダメですか?

編集 削除
?  2008-08-26 16:29:50  No: 31658  IP: 192.*.*.*

返信ありがとうございます。
igyさんにご指摘していただいた方法を試してみましたが、
CPU使用率が100%になってしまいました。
ならば、ということで

  procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
  begin
    Sleep(1);
  end;

と記述して実行しても、やはり100%になってしまいます。

編集 削除
ttt  2008-08-26 17:09:50  No: 31659  IP: 192.*.*.*

最小化しててもメインフォームのWindowStateはwsNormalのままになりますね。
ApplicationのOnMinimizeをつかまえてみたらどうでしょうか?
……と思ったらすでにAppEventsを使ってやっているようですが
最小化した瞬間だけSleepしても意味がないので、フラグ立てるなりしないと駄目ですね。

編集 削除
?  2008-08-26 17:50:16  No: 31660  IP: 192.*.*.*

tttさんの助言に従い、予めisMinimizedというBooleanを定義して、

  procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
    var Done: Boolean);
  begin


    (CPU使用率100%のループ処理が入ります)


    //アプリケーションが非アクティブになったらスリープ
    if (Application.Active = False) then Sleep(1);
    //フォームを最小化したらスリープ
    if (isMinimized = True) then Sleep(1);
  end;

  procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
  begin
    isMinimized:=True;
  end;

  procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
  begin
    isMinimized:=False;
  end;

と記述して実行したところ、無事最小化したときスリープが入るようになりました。
助言してくださったtttさん、igyさん、ありがとうございました。

編集 削除
?  2008-08-26 17:52:28  No: 31661  IP: 192.*.*.*

解決しました。
ありがとうございました。

編集 削除