2008-12-18 32 views
6

En Delphi 2007, en un desplazamiento del ratón, trato de cambiar el cursor del ratón con:¿Cómo cambio el cursor del mouse cuando el botón izquierdo del mouse está presionado?

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; 

por ejemplo. Sin embargo, cuando el botón izquierdo del mouse está abajo, y muevo el mouse, el cursor no cambia a crDrag o crNoDrop. El código se ejecuta (por ejemplo, Cursor: = crDrag;) pero el cursor no cambia. Cuando el botón izquierdo del mouse está arriba, y muevo el mouse, el cursor no cambia ningún problema.

(Originalmente trató de usar algunas Arrastre & eventos gota y propiedades, pero no pudo conseguir que todo funcione de la manera que quería.)

Editar: comportamiento deseado clarificada, y el código de formato.

Editar: Gracias, Gamecat, pero quiero que el cursor cambie cuando el botón izquierdo del mouse esté hacia abajo y mientras el mouse se mueve, el cursor debería cambiar entre crDrag y crNoDrop.

+0

Se ha agregado más información, por lo que se puede usar en el movimiento del mouse. –

Respuesta

11

Si se establece el cursor del ratón en el OnMouseDown y vuelve a establecer en la onmouseup, nada funciona bien:

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; 

Si desea que el MouseCursor para reaccionar en el movimiento del ratón, utilice la siguiente:

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; 

Se necesita el MouseUp, de lo contrario, el cursor no cambiará si se coloca sobre un control.

Asegúrese de utilizar Screen.Cursor en todas partes.

5

Un poco fuera de tema, pero quizás sea útil para usted.

Creé una pila global para permitir cambios de cursor anidados. Permite que cualquier parte del código establezca el cursor del mouse en lo que desea sin preocuparse por lo que su interlocutor o destinatario establezca.

Por ejemplo:

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; 

Ninguno de estos procedimientos tiene que preocuparse por lo que afirmar que el otro necesita o deja el cursor del ratón.

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