Sto lavorando all'applicazione Delphi XE2 destinata a Mac OS e Windows. E voglio avere l'integrazione nel menu contestuale. Per Windows questo è un compito semplice. Ma per Mac OS non so come farlo.Come aggiungere voci di menu a Mac OS Finder in Delphi XE2
Ho letto la documentazione Providing a Service e ho provato un codice simile in Delphi ma senza fortuna.
Consulta il codice semplice per le prove di integrazione di Finder.
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.
configurazione Aggiunto a 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>
Quando eseguire questo su hungs applicazione per Mac OS e, a volte si blocca con ' Errore bus error '.
Qualcuno può aiutare con questo problema?
O forse Delphi XE2 non supporta questo tipo di funzionalità?
La domanda correlata che si presume che si stia utilizzando Cocoa + ObjectiveC, potrebbe essere adattata, utilizzando l'abilità DelphiXE2/Firemonkey per richiamare le API basate su messaggi cocoa/objectiveC: http://stackoverflow.com/questions/9420361/add-an-item -in-finder-contextual-menu-with-cocoa - Sarei tentato di scrivere l'intero bit dei servizi di creazione usando Cocoa/ObjectiveC e trovare un modo per poi semplicemente richiamare quella libreria condivisa oggettivo nativo dalla tua app delphi. –
Penso che se è fattibile lo troverai nella documentazione o nei forum gratuiti pascal dato che XE2 usa pascal gratuito per OSX. E dal momento che free pascal è stato su OSX per molto tempo sono sicuro che avrà più dei forum di Delphi. – adrianj98