2010-12-14 36 views
-2

このコードは、Delphi XEに私のために働いていないされていません。フォーム上にマウスがありますか?

http://delphi.about.com/cs/adptips2000/a/bltip0800_5.htm

procedure TForm1.FormDeactivate(Sender: TObject) ; 
begin 
    ReleaseCapture; 
end; 

procedure TForm1.FormMouseMove 
(Sender: TObject; Shift: TShiftState; X,Y: Integer) ; 
begin 
    If GetCapture = 0 then 
    SetCapture(Form1.Handle) ; 
    if PtInRect(Rect(Form1.Left, 
        Form1.Top, 
        Form1.Left + Form1.Width, 
        Form1.Top + Form1.Height), 
        ClientToScreen(Point(x, y))) then 
    Form1.Caption := 'Mouse is over form' else 
    Form1.Caption := 'Mouse is outside of form'; 
end; 

エラーなし - それだけでは効果がありません。

助けてください。

EDIT 1

それは私が、私はこのような関数を作成したユニットにフォームを渡しているためでもマウスFormMouseEnterとFormMouseLeaveが働いていない、問題はコードではなく、判明:

手順スライド(フォーム:TForm;表示:ブール);

私はこの手順の中からShowメソッドを呼び出しています。どうすればこの問題を解決できますか?

ありがとうございました。私は今、投稿機能を使用したくない

EDIT 2

。人々が以下に示唆したもの(FormMouseEnterとFormMouseLeave)を使用したいが、それは私の場合でもうまくいきません。

+0

問題が何ですか。 – miku

+3

将来的には:リンクからできるだけ多くの情報をあなたの質問に含めるようにして、他の人が質問に答えるためにリンクをナビゲートする必要がないようにしてください。 – jpfollenius

+0

マウスをフォームの内外に移動しているときにフォームのキャプションが変更されていないかどうかは、私にとってはうまくいっています – Bharat

答えて

5

マウスカーソルをキャプチャせずにマウスがフォーム上にあるかどうかを追跡するために、OnMouseEnterおよびイベントを使用できます。

1

私が理解する限り、このためにSetCaptureを使用することは悪い考えです。あなたが望むように機能していれば、あなたはマウスを追跡するためのよりよい方法がわからないので、マウスメッセージの他のすべてを奪ってしまうでしょう。

しかし、MSDNでは、SetCaptureを使用しても、外部からのマウスメッセージはあなたのウィンドウにリダイレクトされません(http://msdn.microsoft.com/en-us/library/ms646262(VS.85).aspx)マウスボタンが押されている(おそらく、あなたが達成しようとしているものを正当な理由なくマウスを盗むことを防ぐ手段)。

Show()をどこから呼び出すのかは関係ありません。そのため問題はありません。

3

これは、対応するフォームのOnMouseEnterイベントとOnMouseLeaveイベントに必要なコードを入力するだけです。私の場合、私がしたすべてだった:

必要
場合は、オブジェクトインスペクタの[イベント]タブにオブジェクトインスペクタ
スイッチに
ゴーで作業しているフォームを選択デルファイ
で を新しいプロジェクトを作成します。 OnMouseEnterイベントまでスクロールして、その横の空白をダブルクリックしてEventHandlerを生成します。あなたは、イベントハンドラに次のコードで終わることを確認してください:

procedure TForm1.FormMouseEnter(Sender: TObject); 
begin 
    Self.Caption := 'Mouse in form'; 
end; 

ゴーオブジェクトインスペクタに再び
新しいイベントを生成するために、それの右側の白い領域でOnMouseLeaveイベントをダブルクリックして下さいハンドラは、と...アプリを実行し、それ

procedure TForm1.FormMouseLeave(Sender: TObject); 
begin 
    Self.Caption := 'Mouse outside form'; 
end; 

に次のコードを追加し、フォーム上にマウスを移動し、キャプションは、「フォーム内マウス」に変更し、フォームの外に移動すると、キャプションが言うだろう「マウス外形」

魅力として動作します(Delphi 2010でテスト済み)

0

大幅に変更されたキャプションを含むフォーム(frmTasks)が必要でした。だから、私は隠されたキャプションを持つフォームを作成しました。私は必要なものを描画するTImage(imgRedLogo)でキャプションをシミュレートします。 このコードを使用すると、ユーザーは偽のキャプション(画像)をクリックしてフォームを移動できます。マウスをキャプチャすることなく魅力的に動作します。マウスの右ボタンでも機能します(この '機能'を無効にするには、imgRedLogoMouseDownの 'Button'パラメータをテストする必要があります)。

FULL作業コード:

VAR 
    Dragged : Boolean= FALSE; 
    IsOverImg: Boolean= FALSE; { True if mouse if over the image } 
    OldPos : TPoint; 

procedure TfrmTasks.imgRedLogoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
Dragged:= True; 
GetCursorPos(OldPos); 
end; 

procedure TfrmTasks.imgRedLogoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
VAR NewPos: TPoint; 
begin 
if Dragged AND IsOverImg then 
    begin 
    GetCursorPos(NewPos); 
    frmTasks.Left:= frmTasks.Left- OldPos.X + NewPos.X; 
    frmTasks.Top := frmTasks.Top - OldPos.Y + NewPos.Y; 
    OldPos:= NewPos; 
    end; 
end; 

procedure TfrmTasks.imgRedLogoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
if Dragged 
then Dragged:= False; 
end; 

procedure TfrmTasks.imgRedLogoMouseEnter(Sender: TObject); 
begin 
IsOverImg:= TRUE; 
end; 

procedure TfrmTasks.imgRedLogoMouseLeave(Sender: TObject); 
begin 
IsOverImg:= FALSE; 
end; 

をお楽しみください。

関連する問題