2013-04-09 24 views
5

実行時に新しいスタイルを適用すると、アプリケーションのMainFormが新しいウィンドウハンドルを作成します。これをやめたり、ハンドルを再割り当てする方法はありますか? :Delphi XE2、vclスタイルのウィンドウハンドルの再作成

'システムエラー。コード:1400.無効なウィンドウハンドル '

新しいハンドルを強制的に割り当てるプロセスを操作する方法はありますか?

は、私は、これはやって解決し、以下:

私のメインフォームが表示されることはありません目に見えない「ヘルパー」フォームを作成し、それは視覚的な要素を持っている - それはそれはこれらを再描画しようとしていたハンドルエラーを投げていました私は関連するコンポーネントを代わりにオブジェクトに置き換えました(私はこのコードを最初に書きませんでした)。

+1

ウィンドウハンドルのコピーを(特にスレッド内に)保存しないでください。['PostMessageが無効なウィンドウハンドルをスレッドに返す '](http://stackoverflow.com/q/3474227/576719)を参照してください。 –

+1

はい、それを避ける方法があります。それがなぜ起こるのか教えていただければ、助けてくれるでしょう。だから、なぜあなたは古い窓のハンドルを持っていますか? –

答えて

5

ウィンドウハンドルの再作成を避ける方法はありません。代わりに、ウィンドウの再作成時に通知されるように、ウィンドウのCreateWndDestroyWndメソッドをオーバーライドします。

また、破損する可能性のあるウィンドウのハンドルに永続的な参照を保存しないようにしてください。代わりに、必要なたびにHandleプロパティをお読みください。その後、通知を監視する必要はありません。

別のスレッドからHandleを読んでください。ただし、ウィンドウが間違ったスレッドに関連付けられる可能性があります。 VCLウィンドウと対話する必要があるコードは、SynchronizeまたはQueueで呼び出すメソッドにラップします。

関連する問題