2008-12-18 44 views
6

Trong Delphi năm 2007, trong một sự kiện chuột di chuyển, tôi cố gắng để thay đổi con trỏ chuột với:Làm cách nào để thay đổi con trỏ chuột khi nút chuột trái bị hỏng?

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; 

ví dụ. Tuy nhiên, khi nút chuột trái bị tắt và tôi di chuyển chuột, con trỏ không thay đổi thành crDrag hoặc crNoDrop. Mã được thực thi (ví dụ: Con trỏ: = crDrag;) nhưng con trỏ không thay đổi. Khi nút chuột trái bật lên và tôi di chuyển chuột, con trỏ sẽ không thay đổi.

(Tôi ban đầu cố gắng sử dụng một số Kéo & sự kiện Drop và tài sản, nhưng không thể có được tất cả mọi thứ để làm việc theo cách tôi muốn.)

Edit: làm rõ hành vi mong muốn, và mã định dạng.

Chỉnh sửa: Cảm ơn bạn, Gamecat, nhưng tôi muốn con trỏ thay đổi khi nút chuột trái bị tắt và trong khi chuột di chuyển con trỏ phải thay đổi qua lại giữa crDrag và crNoDrop.

+0

Đã thêm thông tin, vì vậy có thể sử dụng được khi di chuyển chuột. –

Trả lời

11

Nếu bạn đặt con trỏ chuột trong onmousedown và đặt lại nó trong onMouseUp, bất cứ điều gì hoạt động tốt:

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; 

Nếu bạn muốn mousecursor phản ứng tại di chuyển chuột, sử dụng như sau:

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; 

Cần có chuột lên, nếu không con trỏ sẽ không thay đổi lại nếu nó di chuyển lên trên điều khiển.

Đảm bảo sử dụng Screen.Cursor ở mọi nơi.

5

Hơi off-topic, nhưng có lẽ hữu ích cho bạn.

Tôi đã tạo ngăn xếp chung để cho phép thay đổi con trỏ lồng nhau. Nó cho phép bất kỳ đoạn mã nào đặt con trỏ chuột vào những gì chúng muốn mà không phải lo lắng về những gì người gọi hoặc callee đặt nó.

Ví dụ:

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; 

Cả thủ tục phải lo lắng về những gì nêu rõ nhu cầu khác hoặc rời khỏi con trỏ chuột.

//=============================================================== 
// 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; 
Các vấn đề liên quan