2008-12-18 13 views
6

In Delphi 2007, in einem Mausbewegungsereignis, versuche ich mit dem Mauszeiger zu ändern:Wie ändere ich den Mauszeiger, wenn die linke Maustaste gedrückt ist?

procedure TFr_Board_Display.PaintBox_Proxy_BoardMouseMove(Sender: TObject; 
    Shift: TShiftState; X, Y: Integer); 
begin 

    if left_mouse_button_down then begin 
    if some_condition then begin 
     Cursor := crDrag; 
    end 
    else begin 
     Cursor := crNoDrop; 
    end; 
    end 
    else begin 
    if some_other_condition then begin 
     Cursor := crHandPoint; 
    end 
    else begin 
     Cursor := crDefault; 
    end; 
    end; 
end; 

zum Beispiel. Wenn jedoch die linke Maustaste gedrückt ist und ich die Maus bewege, ändert sich der Cursor nicht in crDrag oder crNoDrop. Der Code wird ausgeführt (z. B. Cursor: = crDrag;), aber der Cursor ändert sich nicht. Wenn die linke Maustaste gedrückt ist und ich die Maus bewege, ändert sich der Cursor nicht.

(I ursprünglich versucht, einige Drag & Drop-Ereignisse und Eigenschaften zu verwenden, aber nicht alles bekommen konnte, wie ich wollte zu arbeiten.)

Edit: Geklärte gewünschte Verhalten und formatiert Code.

Edit: Danke, Gamecat, aber ich möchte den Cursor ändern, wenn die linke Maustaste gedrückt ist und während der Mauszeiger bewegt wird, sollte der Cursor zwischen crDrag und crNoDrop hin und her wechseln.

+0

Weitere Informationen hinzugefügt, so dass es bei Mausbewegung verwendbar ist. –

Antwort

11

Wenn Sie den Mauszeiger in der OnMouseDown gesetzt und zurückgesetzt es im OnMouseUp, alles funktioniert gut:

procedure TForm4.FormMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    Cursor := crCross; 
end; 

procedure TForm4.FormMouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    Cursor := crDefault; // Or you can restore a saved cursor. 
end; 

Wenn Sie den Mauscursor wollen bei der Mausbewegung zu reagieren, verwenden Sie die folgenden Schritte aus:

procedure TForm4.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    if ssLeft in Shift then begin 
    if X<100 then 
     Screen.Cursor := crCross 
    else 
     Screen.Cursor := crHourGlass; 
    end else 
    Screen.Cursor := crDefault; // Or you can restore a saved cursor. 
end; 

procedure TForm4.FormMouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    Screen.Cursor := crDefault; // Or you can restore a saved cursor. 
end; 

Die MouseUp wird benötigt, sonst wird der Cursor nicht zurück geändert, wenn er sich über einem Steuerelement befindet.

Stellen Sie sicher, dass Screen.Cursor überall verwendet wird.

5

Etwas außer Thema, aber vielleicht nützlich für Sie.

Ich habe einen globalen Stapel erstellt, um geschachtelte Cursoränderungen zu ermöglichen. Es lässt jedes Stück Code den Mauszeiger auf das setzen, was sie wollen, ohne sich darum kümmern zu müssen, was der Anrufer oder Angerufene festgelegt hat.

Zum Beispiel:

procedure AskUserWhatToDo; 
begin 
    PushMouseCursor(crArrow); 
    try 
    if MessageDlg('Abort?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then 
     SysUtils.Abort; 
    finally 
    PopMouseCursor; 
    end; 
end; 

procedure LongProcess; 
begin 
    PushMouseCursor(crHourglass); 
    try 
    // do something 
    if QuestionableState then 
     AskUserWhatToDo; 
    // do something 
    finally 
    PopMouseCursor; 
    end; 
end; 

Weder Verfahren hat Grund zur Sorge in welchem ​​Zustand sich die anderen Bedürfnisse oder verlässt den Mauszeiger.

//=============================================================== 
// in a universal utility module (mine is called CraftWindows.pas) 

function SetMouseCursor(ACursor : TCursor) : TCursor; 
begin 
    Result := Screen.Cursor; 
    Screen.Cursor := ACursor; 
end; 

var 
    GlobalMouseCursorStack : TList = nil; 

procedure PushMouseCursor(ACursor : TCursor); 
begin 
    if GlobalMouseCursorStack = nil then 
     GlobalMouseCursorStack := TList.Create; 

    GlobalMouseCursorStack.Add(Pointer(SetMouseCursor(ACursor))); 
end; 

procedure PopMouseCursor; 
begin 
    if (GlobalMouseCursorStack <> nil) and (GlobalMouseCursorStack.Count > 0) then 
    begin 
     SetMouseCursor(TCursor(GlobalMouseCursorStack.Last)); 
     GlobalMouseCursorStack.Delete(GlobalMouseCursorStack.Count - 1); 
    end; 
end; 

... 

finalization 
    GlobalMouseCursorStack.Free; 
Verwandte Themen