2012-03-04 3 views
1

Я набрал код в delphi, чтобы вставить элемент состояния в строку состояния системы, код работает хорошо и отображается статус. Я использовал прозрачную иконку, и я должен щелкнуть именно по значку (не справа), чтобы открыть меню. Но если я нажимаю на прозрачную область значка, ничего не происходит! Я пишу один и тот же код XCode, и все в порядке.Строка состояния OSX

Есть ли у любого тела идея для этого случая? Я хочу открыть меню, щелкнув любую точку значка состояния (цветные и прозрачные точки).

код:

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; 

Спасибо.

+0

В OS X нет «строки состояния системы». –

+2

«Нет строки состояния системы»! дорогой друг, я был удивлен вашим комментарием и могу ли вы сказать мне, что должен делать этот код? NSStatusBar * statusBar = [NSStatusBar systemStatusBar]; –

+0

Попробуйте включить код, который вы используете в вопросе, чтобы получить ответы. – RRUZ

ответ

0

Когда вы устанавливаете свойство меню, действие не запускается. Поэтому удалите строку 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; 
+0

Спасибо, но это не мой ответ: 1) ваш решение не имеет ничего о графическом значке .2) Кажется, проблема связана с ошибкой osx! потому что значок статусной панели работает в El Capitan. –

Смежные вопросы