Delphi 5 アプリを D2010 に移植していますが、少し問題があります。1 つのフォームには、マウスが画像上に移動するたびにラベルを更新する OnMouseMove イベントを持つ TImage コンポーネントがあります。これは元のアプリでは問題なく機能していましたが、今では OnMouseMove イベントは、画像が動いているかどうかにかかわらず、マウスが画像の上にあるときは常に発生し、ラベルがひどくちらつきます。
これの原因と修正方法を知っている人はいますか?
Delphi 5 アプリを D2010 に移植していますが、少し問題があります。1 つのフォームには、マウスが画像上に移動するたびにラベルを更新する OnMouseMove イベントを持つ TImage コンポーネントがあります。これは元のアプリでは問題なく機能していましたが、今では OnMouseMove イベントは、画像が動いているかどうかにかかわらず、マウスが画像の上にあるときは常に発生し、ラベルがひどくちらつきます。
これの原因と修正方法を知っている人はいますか?
私の精神的なデバッグ感覚は、あなたが Windows を使用していて、ラベルがツールチップ ウィンドウであり、マウスを動かすたびに更新していることを示しています。
真面目な話、Vista に切り替えたときに、ツールチップ ウィンドウでこれとまったく同じものを見たことがあります。最近のバージョンの Windows ツールチップ ウィンドウでは、更新時に何らかの形で WM_MOUSEMOVE メッセージが生成されるようです。私が見つけた唯一の修正は、テキストが実際に変更されたときにのみラベルを更新することでした。
したがって、Windows を使用していない場合は、無視してください。ただし、Windows を使用している場合は、ラベル テキストが実際に変更された場合にのみ、ラベル テキストを更新してみてください。
コメントを追加できなかったため、回答セクションを使用してこの動作の変更を確認しています。Delphi 2007で開発されたプロジェクトがありOnMouseMove、マウスの位置が変わったときにのみイベントが呼び出されます。OnMouseMoveXEでは常に同じコードが呼び出されていることがわかりました。どちらも。によってトリガーされるため、理由はわかりませんWM_MOUSEMOVE。
これの最後に到達するまで私がしていることは、前のXY座標を比較し、変更がない場合は終了することです。
if ( x = ZoomRect.Right ) and ( y = ZoomRect.Bottom ) then exit ;
Mason、これは Windows XP SP2 上の新しい D2010 (Update 4 & 5) VCL Forms アプリケーションであることを再現できません。これが私がしたことです:
手順 TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: 整数);
始める
Label1.Caption := Format('X: %d Y: %d', [X, Y]);
終わり;
最初に画像の上にマウスを移動するまで、ラベルには "Label1" (もちろんデフォルトのキャプション) が表示されていました。その後、X 座標と Y 座標を表示するように正しく更新されました。マウス ポインターを画像の外に移動するとすぐに、ラベルの更新が停止しました。
Delphi 2010自体ではなく、特定のコード内の何か、または使用しているWindowsのバージョンに固有のもののようです。