Estoy trabajando en la aplicación Delphi XE2 dirigida a Mac OS y Windows. Y quiero tener integración en el menú contextual. Para Windows, esta es una tarea simple. Pero para Mac OS no sé cómo hacer esto.Cómo agregar el elemento de menú al Finder de Mac OS en Delphi XE2
He leído Providing a Service documentación y he intentado con un código similar en Delphi, pero sin suerte.
Mire el código simple para las pruebas de integración de 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.
configuración Agregado 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>
Cuando se realiza esto en hungs aplicación de Mac OS y, a veces bloquea con ' Error de bus 'excepción.
¿Alguien puede ayudar con este problema?
¿O quizás Delphi XE2 no es compatible con este tipo de funcionalidad?
Pregunta relacionada suponiendo que está utilizando Cocoa + ObjectiveC, podría ser adaptada, utilizando la capacidad de DelphiXE2/Firemonkey para invocar API basadas en mensajes de cacao/objetivoC: http://stackoverflow.com/questions/9420361/add-an-item -in-finders-contextual-menu-with-cocoa - Me sentiría tentado de escribir todo el bit de los servicios de creación usando Cocoa/ObjectiveC y encontrar la manera de invocar esa biblioteca nativa de objetivo C desde su aplicación delphi. –
Creo que si es factible lo encontrará en la documentación o foros pascal gratuitos ya que XE2 usa pascal libre para OSX. Y dado que el pascal libre ha estado mucho tiempo en OSX, estoy seguro de que tendrá más que los foros de Delphi. – adrianj98