2010-11-24 6 views
1

ほとんどのGUIアプリケーションには、editboxトリガーのオートコンプリート、リストボックスのアイコンと製品の説明の変更、ラジオボタンのトリガーのテキスト更新など、複数の自動処理オプションがあります。イベントをトリガーすることなくUIの状態を更新するパターン

残念ながら、かなり頻繁に連結コントロールのautotriggersを遮断すると同時に、プログラムでこれらのコントロールのいくつかの状態を変更するために必要なの

、リストボックスonselecteditemchange、ラジオボックスonselecteditemchangeなど

はどのようにパターンがありますあなたはこれを達成する?私は各コントロールに "m_bDisablEventTrigger"変数を追加し、UIアップデートの前後に設定することが可能だと思いますが、あまり醜いコードで同じことを達成できるより良い方法があります。

+0

イベントをプログラムで送信して、制御状態の変化をシミュレートすることができます。私はなぜあなたがコントロールの更新を引き起こしたくないのかわからないのですか? –

答えて

1

あなたはただ、次のを使用して(IDC_YOURCONTROLを言うことができます)所望の制御を無効にできます。

GetDlgItem(IDC_YOURCONTROL) - > EnableWindow(偽);

これを使用すると、yor制御の関連トリガーはトリガーされません。完了したら、コントロールを有効にすることができます。

0

IMHO特定の実装の詳細を掘り下げずにこのような質問に答えることは不可能です。明らかにそのようなパターンが存在する。いくつかの「自動」振る舞いをブロックする「マスタ」フラグまたは「制御ごと」フラグの存在は、これらの「自動」調整に使用されるフレームワークによってのみ決定されます。

0

私はこれを私のDelphiアプリケーションで行います。何が起こるかは、制御状態に影響を与える可能性がある変更が行われるたびに、その効果にメッセージが送信されることです。このメッセージは、アプリがアイドル状態になると、つまり既存のメッセージが処理を完了した後に処理されます。

このメッセージの処理では、すべてのコントロールのUI状態が設定され、ジョブが実行されます。もちろんVCLは基になるWin32 APIを非常に便利にまとめているので、Delphiでは非常に簡単です。

+0

メッセージをポストする点は、Windows InvalidateRect/WM_PAINTの最適化と同じようなものを複製して、必要以上にUI状態を更新しないようにすることです。複数のメッセージを投稿しないようにする必要がありますので、PeekMessageをポストする前にコールして、キューに待機中のメッセージがないことを確認してください。 –

関連する問題