- ベストアンサー
Delphi6 OnMouseUp
deiphi6です。 OnMouseDown,OnMouseMoveイベントで返ってくるX,Y座標値と、OnMouseUpで返ってくるX,Y座標値に違いがあります。 例えば、 ScrollBoxの中にPaintBoxを置いて、PaintBoxのWidth(Height)を32768以上にします。 実行させ、スクロールさせてPaintBoxが32768以上のポイントでマウスボタンを押して離すと。 OnMouseUpで返ってくるX(Y)座標はマイナスになります。 また、65536以上にするとまた1から始まるプラスのX座標がかえってきます。 OnMouseDown,OnMouseMoveでは正常なプラス値です。 つまり、Intergerで返ってきてないってことですか? OnMouseMoveでの座標を代用して使ってますが、マウスの早い動きには正確を欠きます。 何かいい回避方法はありませんでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var p : TPoint; begin if (Sender <> nil) then begin p := (Sender as TControl).ScreenToClient(mouse.CursorPos); X := p.X; Y := p.Y; end else exit; caption := Format('%d %d',[x,y]); end; procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin caption := Format('%d %d',[x,y]); end; 既存のコードを変更したくないのでしたら こんなふうに x,yに代入するといいです
その他の回答 (1)
マウスの取得ができないという疑問に さいごは、動作速度をあげたいと・・・。 どちらも初歩的内容ですので 動作速度のほうは 別話題で投稿されることをお勧めします。 procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin caption := Format('%d %d',[x,y]) end; >OnMouseUpで返ってくるX(Y)座標はマイナスになります。 確かにそうなるようですね。 delphi2005でも同じなので ソースコードをみましたら DoMouseDown DoMouseUp で コードに少し違いが見られ DoMouseUpでコードが 一部省いてあるようなので そこが原因かもしれないですね。 delphiは 初心者では解決への糸口をみつけるのは苦労するので はじめたばかりでしたら、vs2005を使った方がいいとおもいますよ vs2005は参考書や関連サイトもたくさんありますし・・・ 一つの提案として 楽な順 ・with PaintBox1.ScreenToClient(mouse.CursorPos) do caption := Format('%d %d',[x,y]) ・他の言語へ乗り換え ・Controls.pasソースコードを変更してコンパイル ・別の手段を考える
お礼
ご回答ありがとうございます。 とりあえずOnMouseMoveイベントで獲た座標を使います。
お礼
>p := (Sender as TControl).ScreenToClient(mouse.CursorPos); この記述がわかりませんでした。 助かりました。ありがとうございます。