2015-03-24 6 views
5

डेल्फी 6 में, मैं माउस कर्सर Screen.Cursor का उपयोग कर सभी रूपों के लिए बदल सकता है:Screen.Cursor Firemonkey

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Screen.Cursor := crHourglass; 
end; 

मैं Firemonkey में बराबर तलाश कर रहा हूँ।

के बाद समारोह काम नहीं करता:

procedure SetCursor(ACursor: TCursor); 
var 
    CS: IFMXCursorService; 
begin 
    if TPlatformServices.Current.SupportsPlatformService(IFMXCursorService) then 
    begin 
    CS := TPlatformServices.Current.GetPlatformService(IFMXCursorService) as IFMXCursorService; 
    end; 
    if Assigned(CS) then 
    begin 
    CS.SetCursor(ACursor); 
    end; 
end; 

जब मैं प्रक्रिया के अंत में एक Sleep(2000); डालें, मैं 2 सेकंड के लिए कर्सर देख सकते हैं। लेकिन इंटरफ़ेस शायद मुक्त हो जाता है और इसलिए, कर्सर स्वचालित रूप से प्रक्रिया के अंत में रीसेट हो जाता है। मैंने इंटरफेस को मुक्त करने के लिए CS को वैश्विक चर के रूप में परिभाषित करने की कोशिश की और प्रक्रिया के अंत में CS._AddRef जोड़ें। लेकिन यह या तो मदद नहीं की। रोलबैक करने के लिए तो

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Application.MainForm.Cursor := crHourGlass; 
end; 

जब से मैं सभी रूपों के लिए कर्सर को बदलना चाहते हैं, मैं सभी रूपों के माध्यम से पुनरावृति करने की आवश्यकता होगी, लेकिन:

कोड काम करता है के बाद, लेकिन केवल मुख्य रूप के लिए काम करेंगे पिछले कर्सर मुश्किल है, क्योंकि मुझे हर रूप के लिए पिछले कर्सर को जानने की जरूरत है।

मेरे इरादे:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    prevCursor: TCursor; 
begin 
    prevCursor := GetCursor; 
    SetCursor(crHourglass); // for all forms 
    try 
    Work; 
    finally 
    SetCursor(prevCursor); 
    end; 
end; 

उत्तर

1

IFMXCursorService कैसे FMX ढांचे कर्सर प्रबंध करती है। यह आपके उपयोग के लिए नहीं है। जिस तंत्र का आप उपयोग करना चाहते हैं वह फॉर्म Cursor संपत्ति है।

इसका मतलब है कि इसे पुनर्स्थापित करने के लिए आपको प्रत्येक फ़ॉर्म के लिए कर्सर को याद रखना होगा। मेरा सुझाव है कि आप ऐसा करने के लिए एक शब्दकोश का उपयोग करें। कार्यक्षमता को एक छोटी कक्षा में लपेटें और फिर कम से कम दर्द उस वर्ग के कार्यान्वयन के लिए स्थानीयकृत हो। आप कॉल साइट पर कोड को उचित बना सकते हैं।

+0

धन्यवाद। शब्दकोश के साथ विचार अच्छा है। यह मेरा वर्तमान कोड है: http://pastebin.com/KC3AedTJ। यह डेल्फी 6 के लिए काम करता है, लेकिन एक एक्सई 7 फायरमोनकी परियोजना के साथ काम नहीं करता है। कोड वीसीएल ** और ** एफएमएक्स परियोजनाओं के लिए काम करना चाहिए। यह वास्तव में कष्टप्रद है कि यह पता लगाने के लिए कोई संकलक स्विच नहीं है कि परियोजना एफएमएक्स है या नहीं। --- प्रश्न # 2: कोड 'CS.SetCursor (ACursor) क्यों है; नींद (5000); 'अपेक्षित परिणाम है (5 सेकंड के लिए)? –

+1

क्योंकि जब आप खिड़की पर माउस की तरह चीजें करते हैं तो फ्रेमवर्क 'SetCursor' को ही कॉल करता है। तो यह आपके द्वारा किए गए परिवर्तनों को आसानी से पूर्ववत करता है। –

+0

उस स्पष्टीकरण के लिए धन्यवाद। यह समझ में आता है। हां, 'फॉर्म। कर्सर' सबसे अच्छा समाधान प्रतीत नहीं होता है। सबसे पहले, यह केवल कर्सर को फॉर्म पर सेट करता है, लेकिन अपने बच्चों (बटन आदि) पर नहीं, और किसी कारण से, कर्सर बदल नहीं जाता है, जब मैं मुख्य धागे में काम कर रहा हूं, उदा। 'स्लीप (2000)' का उपयोग करके, और 'एप्लिकेशन। हैंडलमेसेस' काम नहीं करता है। –

2

आपको अपनी कर्सर सेवा लागू करना होगा जो एक निश्चित कर्सर को लागू करना संभव बनाता है।

unit Unit2; 

interface 

uses 
    FMX.Platform, FMX.Types, System.UITypes; 

type 
    TWinCursorService = class(TInterfacedObject, IFMXCursorService) 
    private 
    class var FPreviousPlatformService: IFMXCursorService; 
    class var FWinCursorService: TWinCursorService; 
    class var FCursorOverride: TCursor; 
    class procedure SetCursorOverride(const Value: TCursor); static; 
    public 
    class property CursorOverride: TCursor read FCursorOverride write SetCursorOverride; 

    class constructor Create; 
    procedure SetCursor(const ACursor: TCursor); 
    function GetCursor: TCursor; 
    end; 

implementation 

{ TWinCursorService } 

class constructor TWinCursorService.Create; 
begin 
    FWinCursorService := TWinCursorService.Create; 

    FPreviousPlatformService := TPlatformServices.Current.GetPlatformservice(IFMXCursorService) as IFMXCursorService; // TODO: if not assigned 

    TPlatformServices.Current.RemovePlatformService(IFMXCursorService); 
    TPlatformServices.Current.AddPlatformService(IFMXCursorService, FWinCursorService); 
end; 

function TWinCursorService.GetCursor: TCursor; 
begin 
    result := FPreviousPlatformService.GetCursor; 
end; 

procedure TWinCursorService.SetCursor(const ACursor: TCursor); 
begin 
    if FCursorOverride = crDefault then 
    begin 
    FPreviousPlatformService.SetCursor(ACursor); 
    end 
    else 
    begin 
    FPreviousPlatformService.SetCursor(FCursorOverride); 
    end; 
end; 


class procedure TWinCursorService.SetCursorOverride(const Value: TCursor); 
begin 
    FCursorOverride := Value; 
    TWinCursorService.FPreviousPlatformService.SetCursor(FCursorOverride); 
end; 

end. 

MainUnit:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    i: integer; 
begin 
    TWinCursorService.CursorOverride := crHourGlass; 
    try 
    Sleep(2000); 
    finally 
    TWinCursorService.CursorOverride := crDefault; 
    end; 
end; 
+0

यह मदद नहीं करता है। हां यह एक कस्टम कर्सर की अनुमति देता है। लेकिन यह किसी भी व्यवहार को नहीं बदलता है जो कि रिन्टेक रिपोर्टिंग कर रहा है। -1 –

+0

@ सेबेस्टियन जेड: इस विचार के लिए धन्यवाद। मैंने इसे इस तरह कार्यान्वित करने का प्रयास किया है: http://pastebin.com/rYND0eYQ। यह माउस के कर्सर को हर रूप के लिए बदलता है, और उसके बच्चे, जैसे बटन। हां, मुझे डेविड के समाधान में एक ही समस्या है।ऐसा लगता है जैसे ऑन-क्लिक फ़ंक्शन समाप्त होने पर कर्सर-अपडेट जैसे जीयूआई ईवेंट केवल तभी ट्रिगर होते हैं। यहां तक ​​कि 'आवेदन। प्रोसेस मैसेज' ने भी मदद नहीं की। हो सकता है कि फायरमॉन्की में जीयूआई/कर्सर को जीयूआई-संचालित इवेंट (ऑनक्लिक) में बदलने के दौरान संभव नहीं है। –

+0

क्या आपने 'पिछला प्लैटफॉर्म सेवा। CetCursor (कर्सर ओवरराइड) को कॉल करने का प्रयास किया है; '' कर्सर ओवरराइड 'सेट करते समय? –

संबंधित मुद्दे