【问题标题】:OSX System Status BarOSX 系统状态栏
【发布时间】:2012-03-04 08:04:53
【问题描述】:

我在delphi中编写了一个代码来插入一个状态项到系统状态栏,代码运行良好并且状态项显示出来。我使用了一个透明图标,我应该完全点击图标(而不是图标 rect)来打开菜单。但是如果我点击图标的透明区域,什么都不会发生! 我用 XCode 编写了相同的代码,一切正常。

有没有人对这个案子有想法? 我想通过单击状态图标的任意点(彩色和透明点)打开菜单。

代码:

procedure createStatusItem;
var
    app_delg: AppDelegate;
    statusBar: NSStatusBar;
    statusItem: NSStatusItem;
    menu: NSMenu;
    pImage: Pointer;
    nsImage: NSImage;
begin
    app_delg := TAppDelegate.Create;
    TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication()).setDelegate(AppDelegate(app_delg));
    statusBar := TNSStatusBar.Wrap(TNSStatusBar.OCClass.systemStatusBar);
    menu := TNSMenu.Wrap(TNSMenu.Alloc.initWithTitle(NSSTR('')));
    statusItem := statusBar.statusItemWithLength(NSVariableStatusItemLength);
    statusItem.retain;
    statusItem.setHighlightMode(true);
    statusItem.setAction(sel_getUid('onMenuClicked:'));
    statusItem.setMenu(menu);

    pImage := TNSImage.Alloc.initWithContentsOfFile(NSSTR('icon.ico'));
    nsImage := TNSImage.Wrap(pImage);
    statusItem.setImage(nsImage);
    nsImage.release;
end;

谢谢。

【问题讨论】:

  • OS X 中没有“系统状态栏”。
  • "没有系统状态栏" !亲爱的朋友,我很惊讶你的评论,你能告诉我这段代码应该做什么吗? NSStatusBar *statusBar = [NSStatusBar systemStatusBar];
  • 尝试在问题中包含您正在使用的代码以获得一些答案。
  • 我把专门编写的完整代码放在C++ Builder Here.987654321@中使用

标签: macos delphi delphi-xe2 statusbar system-status


【解决方案1】:

设置菜单属性时,不会触发该操作。所以删除 setmenu 行。 然后你需要一个目标。为其创建一个委托并将其设置为目标。

type
  IStatusBarDelegate = interface(NSObject)
    ['{5D8BF7A3-C695-45F8-A447-948524718E5F}']
    procedure StatusbarItemClick; cdecl;
  end;

  TStatusbarDelegate = class(TOCLocal)
  protected
    { TOCLocal }
    function GetObjectiveCClass: PTypeInfo; override;
  public
    procedure StatusbarItemClick; cdecl;
  end;

implementation

function TStatusbarDelegate.GetObjectiveCClass: PTypeInfo;
begin
  Result := TypeInfo(IStatusBarDelegate);
end;

procedure TStatusbarDelegate.StatusbarItemClick;
begin
  Showmessage('click');
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  statusBar: NSStatusBar;
  statusItem: NSStatusItem;
  statusBarDelegate : TStatusbarDelegate;
begin
  StatusBarDelegate := TStatusbarDelegate.Create;
  StatusBar := TNSStatusBar.Wrap(TNSStatusBar.OCClass.systemStatusBar);
  StatusBarItem := FStatusBar.statusItemWithLength(NSVariableStatusItemLength);
  StatusBarItem.retain;
  Statusbaritem.setHighlightMode(True);
  Statusbaritem.setTitle(StrToNSStr('test'));
  Statusbaritem.setEnabled(true);
  Statusbaritem.setToolTip(StrToNSStr('test tooltip'));
  Statusbaritem.setTarget(FStatusBarDelegate.GetObjectID);
  Statusbaritem.setAction(sel_getUid('StatusbarItemClick'));
 end;

【讨论】:

  • 谢谢,但这不是我的答案,1)您的解决方案与图形图标没有任何关系。2)看来问题与 osx 错误有关!因为我的状态栏图标在 El Capitan 中按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多