0

基本的な質問: Update プロシージャを呼び出すと、TStatusBar がちらつきます。これを無痛に修正する方法

実行されたコードは、質問の最初の投稿の最初の部分にあります (薄い灰色の区切り線が表示されます) ...

しかし、問題は、このコードが実行されている間、フォームが自動的にアクティブ化されず、他のすべてのアプリケーションの上部にフォーカスされないことです。

私はこれらの記事を読みました:

http://www.installationexcellence.com/articles/VistaWithDelphi/Original/Index.html
http://delphi.about.com/od/formsdialogs/l/aa073101b.htm

しかし、彼らによれば、それは何があっても機能するはずです。TApplicationEvents と TForm のすべてのイベントを Show で試しました。表示: 再描画; リフレッシュ; 前に持ってくる; ...何も機能しません。

したがって、マルチスレッドまたはWM_SYSCOMMANDメッセージのトラップと、SC_ACTIVEイベントでの単純なフォームの再描画の2つのオプションがあると思います。このシナリオは成功するでしょうか?

4

1 に答える 1

4

リンクされた記事のどれも、あなたが抱えている問題を扱っていません。表示されているのは、Windows メッセージを処理しないプログラムの動作であるため、無効になる部分を再描画せず、キーボードやマウスの入力 (マウスによる移動やサイズ変更、アプリのアクティブ化など) に反応しません。タスクバー ボタンを使用します)。

あなたのコードでは を呼び出すStatusBar1.Updateので、少なくともステータス バーのテキストは再描画されますが、アプリケーションはおそらくフォアグラウンドに移動するか、移動またはサイズ変更の要求を無視しています。

Windows メッセージをタイムリーに処理する必要があるため、たとえば 200 ミリ秒または 300 ミリ秒以上かかる実行パスでは、メッセージが確実に処理されるようにする必要があります。

基本的に 3 つのオプションがあります。

  • 実行時間の長いコードを保持し、呼び出しを挿入しApplication.ProcessMessagesます。これにより、Windows メッセージを処理できるようになります。たとえば、操作を開始するために使用されるすべてのコントロールを無効にするなどして、コードが再度入力されないようにしてください。

  • 一連のステップとして表示されるようにコードを作り直してください。各ステップの所要時間は 10 ミリ秒以内です。コードへの呼び出しをタイマー イベント ハンドラーに配置するか、Application.OnIdleハンドラーから呼び出します。

  • ワーカー スレッドでコードを呼び出し、メインの GUI スレッドにメッセージを投稿して UI を更新します。

これらすべてのオプションにはそれぞれ長所と短所があり、特にマルチスレッドについては、SO ですでに多くの質問と回答があります。これは、おもちゃのプログラム以外の作業をしている場合、全体としては最も難しいが最良のオプションです。

于 2009-07-20T11:04:17.693 に答える