0

私は非常に奇妙な問題を抱えています。Win7 プラットフォームで D2007 を使用しています。

アプリケーションは最初の Win7 マシン (私のもの) では問題なく動作しますが、2 番目の Win7 システム (サムスン タブレット) では UI が正しく更新されません。

タブレットでリモート デバッグを使用しています。評価とデバッグの長いサイクルの後、WM_SIZEフレームの 1 つに が起動されていないことがわかりました。各フレームは、彼女の親とAlign = alClient.

私のマシンでは、このメッセージは適切に送信され、もちろん、UI は適切に動作します。

WM_Size メッセージ コードを送信する Windows ユニットの外部関数はどれですか?


問題を詳しく説明します。

アプリケーションを最大化またはサイズ変更すると、2 台の Win7 マシン間で UI の更新の動作が異なります。

一部のフレームは正しくサイズ変更されていますが、そのうちの 1 つはそうではありません。構造は次のとおりです。

MainForm -> 一部のフレーム -> PageControl -> TabSheet -> Frame1 -> Frame2。

ご了承ください :

  • UI はほとんどのコンピューターで正しく動作します。

  • 標準の Windows メカニズムを使用します

この構造では、含まれる TabSheet までのすべてのフレームがサイズ変更されますが、Frame1 はサイズ変更されません。フレームは実行時に作成されます。

TabSheet の名前はわかっているので、ブレーク ポイントで停止して WMSize を表示できます。

でいくつかの条件付きブレーク ポイントを使用しTWinControl.AlignControls、 のハンドルをキャッチしFrame1ます。

ブレークポイントをオンClasses.StdWndProcにすると、 に送信されたメッセージを追跡できましたFrame1.Handle

すべてが OK の場合:

  • $0046 : WM_WINDOWPOSCHANGING

  • $0083 : WM_NCCALCSIZE

  • $0085 : WM_NCPAINT

  • $0014 : WM_ERASEBKGND

  • $0047 : WM_WINDOWPOSCHANGED

  • $0005 : WM_SIZE

サイズ変更に失敗した場合:

  • $0046 : WM_WINDOWPOSCHANGING

  • $0085 : WM_NCPAINT

  • $0014 : WM_ERASEBKGND

  • $0047 : WM_WINDOWPOSCHANGED

どちらもコードは同じで、OSもWin7なので、よくわかりません。WM_NCCALCSIZE私は 2 つのメッセージを知っているだけWM_SIZEで、2 番目のケースでは送信されません。

WM_SIZEそのため、応答を返す関数を探します。

4

2 に答える 2

0

金曜日に投稿できなかったという返事をします。後になって、この問題は Win7 / VCL D2007 のバグに起因するように思われることがわかりました。問題を解決するDXE3でコンパイルされたexeを試してみました。

于 2013-02-04T07:05:37.337 に答える
0

サイズが変更された後、WM_SIZE がウィンドウに送信されます。つまり、サイズが変更された後、システムはフレームに WM_SIZE を自動的に送信します。フレームを更新するには、次のいずれかを呼び出すことをお勧めします: + UpdateWindow API + YourFrame.Invalidate または YourFrame.Repaint

于 2013-02-01T08:56:20.610 に答える