Строка состояния системы OSX - PullRequest
1 голос
/ 04 марта 2012

Я написал код в delphi для вставки элемента состояния в системную строку состояния, код работает нормально и отображается элемент состояния.Я использовал прозрачный значок, и я должен щелкнуть точно на значок (не значок прямоугольника), чтобы открыть меню.Но если я нажму на прозрачную область значка, ничего не произойдет!Я пишу тот же код 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;

Спасибо.

1 Ответ

0 голосов
/ 26 января 2016

Когда вы устанавливаете свойство меню, действие не запускается.Так что уберите строку меню.Тогда вам нужна цель.Создайте для него делегата и установите его в качестве цели.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...