2011-11-04 15 views
31

में मैक ओएस फाइंडर में मेनू आइटम कैसे जोड़ें I डेल्फी XE2 एप्लिकेशन लक्ष्यीकरण मैक ओएस और विंडोज पर काम कर रहा हूं। और मैं संदर्भ मेनू में एकीकरण करना चाहता हूं। खिड़कियों के लिए यह आसान काम है। लेकिन मैक ओएस के लिए मुझे नहीं पता कि यह कैसे करें।डेल्फी XE2

मैंने Providing a Service दस्तावेज पढ़ा है और डेल्फी में समान कोड की कोशिश की लेकिन बिना किसी किस्मत के।

खोजक एकीकरण परीक्षणों के लिए सरल कोड देखें।

App.dpr

program App; 
uses 
    SysUtils, 
{$IFDEF MACOS} 
    AppKit, CocoaTypes, CoreFoundation, 
    CoreServices, Foundation, Mach, ObjCRuntime, 
    ObjectiveC, OCMarshal, OpenGL, QuartzCore, Security, 
    SystemConfiguration, 
{$ENDIF} 
    MessageProvider; 
{$IFDEF MACOS} 
var 
    app: NSApplication; 
    provider: TMessageProvider; 
{$ENDIF} 

begin 
    Application.Initialize; 

{$IFDEF MACOS} 
    provider := TMessageProvider.Create(); 

    app := TNSApplication.Alloc(); 
    app.setServicesProvider(provider); 
{$ENDIF} 

    Application.CreateForm(TFormOSVersion, FormOSVersion); 
    Application.Run; 
end. 

MessageProvider.pas

unit MessageProvider; 

interface 

uses 
    FMX.Dialogs 
{$IFDEF MACOS} 
    , AppKit, CocoaTypes, CoreFoundation, 
    CoreServices, Foundation, Mach, ObjCRuntime, 
    ObjectiveC, OCMarshal, OpenGL, QuartzCore, Security, 
    SystemConfiguration 
{$ENDIF} 
    ; 

type 
    TMessageProvider = class 
    public 
    procedure simpleMessage(var userData: string; var error: string); 
    end; 

implementation 

procedure TMessageProvider.simpleMessage(var userData: string; var error: string); 
begin 
    ShowMessage('Simple message from service.'); 
    error := ''; 
end; 

end. 

जोड़ा विन्यास Info.plist को

<key>NSServices</key> 
<array> 
    <dict> 
    <key>NSKeyEquivalent</key> 
    <dict> 
     <key>default</key> 
     <string>e</string> 
    </dict> 
    <key>NSMenuItem</key> 
    <dict> 
     <key>default</key> 
     <string>App/Message</string> 
    </dict> 
    <key>NSMessage</key> 
    <string>simpleMesage</string> 
    <key>NSPortName</key> 
    <string>App</string>    
    </dict> 
</array> 

जब मैक ओएस आवेदन hungs पर इस चलाने के लिए और कभी कभी के साथ 'दुर्घटनाओं बस त्रुटि 'अपवाद।

क्या कोई इस समस्या से मदद कर सकता है?

या शायद डेल्फी XE2 इस तरह की कार्यक्षमता का समर्थन नहीं करता है?

+3

संबंधित प्रश्न यह है कि आप कोको + ऑब्जेक्टिव सी का उपयोग कर रहे हैं, कोको/उद्देश्य सी संदेश-आधारित एपीआई का आह्वान करने के लिए डेल्फीएक्सई 2/फायरमोनकी क्षमता का उपयोग करके अनुकूलित किया जा सकता है: http://stackoverflow.com/questions/9420361/add-an-item -इन-फाइंडर्स-प्रासंगिक-मेनू-साथ-कोको - मैं कोको/ऑब्जेक्टिव सी का उपयोग करके पूरी मेक-सर्विस बिट लिखने का लुत्फ उठाऊंगा और उसके बाद उस मूल उद्देश्य को साझा करने का एक तरीका ढूंढूंगा जो आपके डेल्फी ऐप से साझा लाइब्रेरी है। –

+0

मुझे लगता है कि यदि यह करने योग्य है तो आपको इसे मुफ्त पास्कल दस्तावेज़ या फ़ोरम में मिल जाएगा क्योंकि XE2 ओएसएक्स के लिए मुफ्त पास्कल का उपयोग करता है। और चूंकि मुफ्त पास्कल ओएसएक्स पर बहुत लंबा रहा है, मुझे यकीन है कि इसमें डेल्फी मंचों से अधिक होगा। – adrianj98

उत्तर

1

मैं दो संभावित समस्याओं

  1. आप अपनी खुद की NSApplication वस्तु का आवंटन कर रहे हैं देखते हैं। मुझे संदेह है कि यह सही है - डेल्फी आंतरिक रूप से भी नहीं बनाता है? और यदि ऐसा नहीं होता है, तो आपको शायद NSApplication की run विधि को किसी बिंदु पर दर्ज करना होगा ताकि यह वास्तव में संदेशों को संभालने में सक्षम हो सके।

  2. सेवा प्रदाता applicationDidFinishLaunching: प्रतिनिधि विधि में पंजीयक होना चाहिए। आप अपना NSApplication उदाहरण बनाने के तुरंत बाद इसे पंजीकृत करने का प्रयास करते हैं।

मुझे लगता है कि आप के बजाय NSApplication के setServicesProvider: का उपयोग कर के दोनों समस्याओं से बचने के लिए यदि आप NSRegisterServicesProvider(id provider, NSString *portName) का उपयोग आपकी सेवा रजिस्टर करने के लिए प्रदान कर सकते हैं,।

+0

मेरे पास पहले आइटम के बारे में समान विचार थे। और, जैसा कि मुझे याद है, मैं टीएप्लिकेशन से एनएसएप्लिकेशन ऑब्जेक्ट प्राप्त करने के लिए कुछ रास्ता खोज रहा था। जब मैं उस परियोजना पर वापस आऊंगा तो मैं NSRegisterServicesProvider विधि का प्रयास करूंगा। जैसा कि मैं समझता हूं, इस विधि को एप्लिकेशन से ठीक पहले बुलाया जाना चाहिए। रून विधि? – GothAr

2

अंत में, मैं इस परियोजना में लौट आया और सफलतापूर्वक पंजीकृत सेवा प्रदाता और संभाला गया सेवा अनुरोध।

सबसे पहले मैंने NSRegisterServicesProvider विधि का उपयोग करने की कोशिश की, लेकिन मैकापी स्रोतों में ऐसी कोई विधि नहीं है, इसलिए मैंने एप्लिकेशनडिडफिनिश लॉन्चिंग प्रतिनिधि की खोज की। इसका इस्तेमाल करते हुए मैं अपने सेवा प्रदाता पंजीकृत:

procedure TApplicationDelegate.applicationDidFinishLaunching(Notification: Pointer); 
var 
    autoReleasePool: NSAutoreleasePool; 
    app: NSApplication; 
    provider: TMessageProvider; 
begin 
    autoReleasePool := TNSAutoreleasePool.Create; 
    try 
    autoReleasePool.init(); 

    app := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication); 

    provider := TMessageProvider.Create(); 
    app.setServicesProvider(provider.ObjId); 
    finally 
    autoReleasePool.release(); 
    end; 
end; 

इसके अलावा, मैं सेवा प्रदाता के लिए इंटरफेस (मुझे लगता है कि यह ObjectiveC-डेल्फी पुल का कार्य के लिए आवश्यक है) बनाया है:

IMessageProvider = interface(IObjectiveC)['{1EA9319A-8F99-4445-B435-48D5E73876FA}'] 
    procedure simpleMessage(pBoard: Pointer; userData: Pointer; error: PPointer); cdecl; 
end; 

और इस इंटरफ़ेस से TMessageProvider विरासत में मिला और TOCLocal कक्षा।

इसके बाद मेरा ऐप संदर्भ मेनू से सेवा अनुरोध पर प्रतिक्रिया कर सकता है।

मैंने अपनी परियोजना के स्रोत साझा किए हैं। Here वे हैं।

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