【问题标题】:Delphi tray icon (NSStatusItem) for OSXOSX 的 Delphi 托盘图标 (NSStatusItem)
【发布时间】:2015-03-06 12:39:42
【问题描述】:

我正在尝试在 OSX 的 Delphi 应用程序中添加 NSStatusItem。搜索示例代码来帮助我,但在定义接口时卡住了:

代码如下:

// Source: https://forums.embarcadero.com/thread.jspa?threadID=108449

unit Unit2;

interface

uses Macapi.ObjectiveC, Macapi.CocoaTypes, Macapi.Foundation, Macapi.AppKit,
Macapi.Helpers, Macapi.ObjcRuntime, System.TypInfo, FMX.Platform, FMX.Platform.Mac;

type
TFMXTrayItem = class(TOCLocal)
private
NSStatItem : NSStatusItem;
public
constructor Create;
destructor Destroy; override;
function GetObjectiveCClass: PTypeInfo; override;
procedure call_mymethod; cdecl;
end;

implementation

constructor TFMXTrayItem.Create;
var
NSContMenu : NSMenu;
NSContItem : NSMenuItem;
NSStatBar : NSStatusBar;
NSImg : NSImage;
AppBundle : NSBundle;
NSpImg: Pointer;
Path: String;
begin
inherited Create;

NSStatBar := TNSStatusBar.Create;
NSStatBar := TNSStatusBar.Wrap(TNSStatusBar.OCClass.systemStatusBar);
NSStatItem:= NSStatBar.statusItemWithLength(NSVariableStatusItemLength);
NSStatItem.setTarget(GetObjectID);

// Create context menu
NSContMenu := TNSMenu.Create;
NSContMenu := TNSMenu.Wrap(NSContMenu.initWithTitle(StrToNSStr('The caption')));

NSContItem:=TNSMenuItem.Create;
NSContItem:=TNSMenuItem.Wrap(NSContItem.initWithTitle(StrToNSStr('1. menuitem'),sel_getUid(PAnsiChar('call_mymethod')),StrToNSStr('')));
NSContItem.setTarget(GetObjectID);
NSContMenu.addItem(NSContItem);
NSContItem.release;


// Add menu
NSStatItem.retain;
NSStatItem.setHighlightMode(true);
NSStatItem.setMenu(NSContMenu);
NSContMenu.release;

// Get path to dir
AppBundle := TNSBundle.Wrap(TNSBundle.OCClass.mainBundle);
Path:=AppBundle.bundlePath.UTF8String+'/Contents/yourimage16x16.png';
NSpImg := TNSImage.Alloc.initWithContentsOfFile(StrToNSStr(Path));
// Create Icon
NSImg := TNSImage.Create;
NSImg := TNSImage.Wrap(NSpImg);
NSStatItem.setImage(NSImg);
NSImg.release;
end;

destructor TFMXTrayItem.Destroy;
begin
NSStatItem.release;
inherited;
end;

function TFMXTrayItem.GetObjectiveCClass: PTypeInfo;
begin
Result :=TypeInfo(IFMXTrayItem);
end;

procedure TFMXTrayItem.call_properties;
begin
// your event code of the menu item
end;

end.

有人知道如何声明 IFMXTrayItem 接口吗?

【问题讨论】:

  • 那么,什么是 IFMXTrayItem?
  • 找到一个从 Cocoa 类派生的示例:stackoverflow.com/a/26408689 我相信 IFMXTrayItem 类似于该示例中定义的 MyNSWindow 接口,但我不确定它会继承什么。
  • 作者的意思可能是 TFMXTrayItem
  • 这也是我的想法,但我发现的大多数示例在从 GetObjectiveCClass 返回时都会传递一个接口。这是另一个:verydemo.com/demo_c134_i32581.html

标签: macos delphi nsstatusitem nsstatusbar


【解决方案1】:

让它像这样工作:

type

IFMXTrayItem = interface(NSObject)
['{7d2e4b38-61d9-4cf4-b78b-5f7c4188e9c0}']
  procedure call_mymethod; cdecl;
end;

稍后编辑:

在读取this后向界面添加了GUID:

编译器使用此 GUID 来唯一标识此接口。 严格来说,你可以使用没有 GUID 的界面,但是你 像 RTL 和大多数框架一样使用它们并不能走得太远 利用接口的用户需要有一个 GUID。

这是我生成的随机 GUID,但如果您在代码中使用它,您应该生成自己的 GUID。

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多