2008-12-18 169 views
6

在德尔福2007年,在鼠标移动事件,我试图改变鼠标光标:如何在鼠标左键关闭时更改鼠标光标?

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; 

例如。但是,当鼠标左键关闭时,我移动鼠标,光标不会更改为crDrag或crNoDrop。代码被执行(例如Cursor:= crDrag;),但游标不会改变。当鼠标左键弹起时,我移动鼠标,光标变化没有问题。

(我最初试图用一些拖放&丢弃事件和属性,但不能得到的一切工作,我想要的方式。)

编辑:澄清所需的行为,并格式化代码。

编辑:谢谢Gamecat,但我希望光标在鼠标左键移动时改变,鼠标移动时光标应该在crDrag和crNoDrop之间来回切换。

+0

增加了更多信息,所以它在鼠标移动时可用。 – 2008-12-18 09:54:53

回答

11

如果您在onmousedown事件设置鼠标光标在OnMouseUp复位,任何正常工作:

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; 

如果你想在mousecursor在鼠标移动作出反应,使用以下命令:

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; 

需要MouseUp,否则如果光标悬停在控件上方,则光标不会变回。

一定要在任何地方使用Screen.Cursor。

5

稍有偏离主题,但可能对您有用。

我创建了一个全局堆栈以允许嵌套游标更改。它允许任何代码将鼠标指针设置为他们想要的,而不必担心它们的调用者或被调用者设置了它。

例如:

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; 

无论过程有担心什么状态等方面的需求或离开鼠标光标。

//=============================================================== 
// 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;