Строка состояния системы OSX
Я написал код в 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 ответ
Когда вы устанавливаете свойство меню, действие не запускается. Так что удалите строку меню. Тогда вам нужна цель. Создайте для него делегата и установите его в качестве цели.
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;