2016-03-24 10 views
-3

愚かに聞こえるかもしれませんが、アプリケーションが何が起こっているかを表示しないようにするには、いくつかの状況が発生しました。別の特定のアクションが起こるまで(stringGridsはデータで満たされ、UIは準備されています...)アプリケーションからOSにメッセージが送信されないようにする方法はありますか?Delphi - システムメッセージの保持/ UI再描画の防止?

ので、

application.processmessages 

にはいくつかのopositはありますか? 次のようなものがあります。

もちろん、別のスレッドでアクションを実行することもできますが、別のスレッドで実行したくない、または実行できない状況があります。

+0

*グリッド*とは何ですか? * Application.StopProcessingMessages *はありませんが、具体的に何をしているのかによって、一部のコンポーネントの画面の更新を停止する方法があります。しかし、実際の関連情報を投稿していないので、提案をするのは難しいです。あなたがコード用に投稿したものはかなりです*私はblah、blah、blahを行うコードを持っています。詳細は何もなく、そのコードの振る舞いをどのように変えるのですか?* –

+0

これをスキンする方法はいろいろあります。グリッド以上のコントロールを使用することから始まります。たとえば、仮想モードのリストビュー。すべてのデータをUIコントロールに保存することは、貧弱な設計です。あなたはただその結果を享受しているだけです。ペイントを抑制することは、パッチを適用する1つの方法です。それほど難しいことではありません。あなたは決して 'ProcessMessages'を呼び出すべきではありません。おそらく、Windowsメッセージの仕組みをよりよく理解すれば恩恵を受けるでしょう。 –

+0

私はグリッドの例に正確に固執したくありません。しかしこの場合はTStringGridについて話しています –

答えて

0

見ることWM_SETREDRAWメッセージを使用することが適切な解決策ですが、それにはいくつかの欠点があります。最大のものは、ユーザーがフォームをクリックすることができるということです。だから、最終的な解決策は単純にフォームが準備された後、パネルが縮小され、この

panel1.Left:= 0; 
    panel1.Top:= 0; 
    panel1.Width:= frmMain.Width; 
    panel1.Height:= frmMain.Height; 

のような全体の形の上に置か空TPanelで、目に見えない作っなどそれは確実にすべてのちらつきや他のものを隠し、それが」doesnのよく見えて、私はそれらをユーザーから隠したいと思う。

2

は(TStringsは含めて)いくつかのVCL/RTLクラスのデータ認識コントロールのためのチェックTDataSet.DisableControls、およびBeginUpdateメソッド/ EndUpdateメソッド、および - 述べTStringGridのための具体的な - 、それは私が考えているが、判明Delphi TStringGrid Flicker

+0

WM_SETREDRAW - それは私が必要としていたものです。私が提供した例は良くありません。 forループでグリッドを更新すると、各パスで行を追加しても「ちらつき」します。ありがとうございました... –

+0

WM_SETREDRAW?それはもっと早く言及されました。それはおそらくあなたが説明した問題の適切な解決策ではありません。 –

+0

@DavidHeffernanそれは、ここにリンクされているトピックを読むまで、私はそれが何をしているかわかりませんでした。私もあなたのコメントに投票しました。これは適切な解決策です。誰もがforループとグリッドを使用して、それほどうまくいきません。質問はかなり明確でした... –

関連する問題