2008-12-18 25 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 में परिवर्तित नहीं होता है। कोड निष्पादित किया गया है (उदा। कर्सर: = crDrag;) लेकिन कर्सर बदल नहीं है। जब बायां माउस बटन ऊपर होता है, और मैं माउस को ले जाता हूं, तो कर्सर कोई समस्या नहीं बदलता है।

(मैं मूल रूप से कुछ खींचें & ड्रॉप घटनाओं और गुणों का उपयोग करने की कोशिश की, लेकिन जिस तरह से मैं चाहता था काम करने के लिए सब कुछ नहीं मिल सकता है।)

संपादित करें: स्पष्ट वांछित व्यवहार, और स्वरूपित कोड।

संपादित करें: धन्यवाद, गेमकैट, लेकिन मैं कर्सर को बदलना चाहता हूं जब बाएं माउस बटन नीचे हो और जब माउस चल रहा हो कर्सर को crDrag और crNoDrop के बीच आगे और पीछे बदलना चाहिए।

+0

अधिक जानकारी जोड़ा गया, इसलिए यह माउस चाल पर प्रयोग योग्य है। –

उत्तर

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; 

माउसअप की आवश्यकता है, अन्यथा कर्सर वापस नहीं बदलेगा अगर यह नियंत्रण से ऊपर हो जाता है।

स्क्रीन का उपयोग करना सुनिश्चित करें। हर जगह कर्सर।

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;