NSStatusBar mit Cocoa Appliscript Application?

MichaHo

Aktives Mitglied
Thread Starter
Dabei seit
09.11.2010
Beiträge
121
Reaktionspunkte
8
Hallo,

ich beisse mir gerade die Zähne an einer AppleScript App aus.

Ich habe ein Cocoa App, das als Statusbar Icon App läuft. Also ohne Fenster, Menü usw.

Es sind lediglich 2 MenuItem Einträge.

Nun versuche ich (da ich mich mit Objective-C überhaupt nicht auskenne) das ganze in eine Cocoa Applescript Application zu übertragen.

Alle meine Versuche sind leider gescheitert, ich überseh irgendwas..... Nur WAS?

Hier der Auszug aus Objective-C für das Status Menü

Code:
#import "ctrlSpIndex.h"

@implementation ctrlSpIndex

@synthesize window = _window;

- (void)dealloc
{
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  
}

-(void)awakeFromNib{
    NSBundle *bundle = [NSBundle mainBundle];
    
    
    SpIndexMenuItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain];
    SpIndexImage = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"SpIndex" ofType:@"png"]];
    [SpIndexMenuItem setMenu:SpIndexMenu];
    [SpIndexMenuItem setHighlightMode:YES];
    [SpIndexMenuItem setImage:SpIndexImage];
     
}

und die .h Datei dazu:

Code:
#import <Cocoa/Cocoa.h>

@interface ctrlSpIndex : NSObject <NSApplicationDelegate>{
    NSWindow *window;
    IBOutlet NSMenu *SpIndexMenu;
    IBOutlet NSMenuItem *SpIndexMenuItemCell;
    NSStatusItem * SpIndexMenuItem;
    NSAppleScript *SpIndexStart;
    NSAppleScript *SpIndexQuit;
    NSImage *SpIndexImage;
    NSBundle *SpIndexImagePfad;
    
}

Das habe ich versucht nach Applescript zu übertragen (nur andere Namen):

Code:
script ltlHelpDelegate
	property parent : class "NSObject"
	property NSMenu : class "NSMenu"
    property NSStatusBar : class "NSStatusBar"
    property NSImage : class "NSImage"
    property NSBundle : class "NSBundle"
    property ltlHelpMenu : missing value
    property ltlHelpSysStatusBar : missing value
    property ltlHelpStatusItem : missing value
     
	on applicationWillFinishLaunching_(aNotification)
		set ltlHelpMenu to (NSMenu's alloc)'s initWithTitle_("ltlHelp")
        set ltlHelpSysStatusBar to NSStatusBar's systemStatusBar
        set ltlHelpStatusItem to ltlHelpSysStatusBar's statusItemWithLength_(16)
        tell ltlHelpStatusItem to setMenu_(ltlHelpMenu)
        tell ltlHelpStatusItem to setHighlightMode_(1)
        set menuImage to NSImage's imageNamed_("ltlHelpMenu.png")
        tell ltlHelpStatusItem to setImage_(menuImage)
	end applicationWillFinishLaunching_
	
	on applicationShouldTerminate_(sender)
		quit
		return current application's NSTerminateNow
	end applicationShouldTerminate_
	
end script

Der Build ist sucess, aber es gibt diesen Fehler im debugger:

HTML:
objc[4534]: Object 0x7fb7e8d01960 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

Kann mir bitte jemand erklären, welchen Fehler ich hier einbaue??

P.S. das Outlet ist auf ltlHelpMenu gesetzt.

Vielen Dank

Micha
 
Du verwendest eine automatische Speicherverwaltung, ohne diese korrekt eingebunden / initialisiert zu haben. Nein, ich weiss leider nicht wie das richtig geht.
Aber hier gibt ein Beispiel, bei dem du vermutlich einiges abkupfern kannst: http://www.jonn8.com/html/MenuApp_ASOC.html


Edit: ich nehme mal an, dass es an dieser Zeile liegt:

Code:
set ltlHelpMenu to (NSMenu's alloc)'s initWithTitle_("ltlHelp")

Ich denke mal , auf ein alloc muss immer irgendwo auch ein release / dealloc folgen ...
 
Zuletzt bearbeitet:
Hi,

danke für deinen Link....das haut mich erst mal um. wenns etwas simpleres gäbe würde ich wahrscheinlich eher durchblicken.

Das auf ein alloc ein release muss denke ich auch, hab nur keine Ahnung wie ich das in meinen Code einbauen kann.

Grüße

Micha
 
Hallo nochmal,

ich habe mittlerweile das Problem gefunden.

in den Build Settings des Projectes muss die Objective-C Garbage Collection auf Supported stehen, dann funktioniert auch das Menü Icon im Mac Statusmenü OHNE Einbindung von Objektive-C .h und .m Files.

Code:
        --Objects
        property parent : class "NSObject"
	property NSMenu : class "NSMenu"
	property NSStatusBar : class "NSStatusBar"
	property NSImage : class "NSImage"
	property NSMenuItem : class "NSMenuItem"
	property NSString : class "NSString"
	property NSWorkspace : class "NSWorkspace"
	
    --Outlets
    property sysStatusBar : missing value
    property statusItem : missing value
    property statusMenu : missing value
	
    
    
    
    
	on applicationWillFinishLaunching_(aNotification)
	set statusMenu to (NSMenu's alloc)'s initWithTitle_("mnuTest")
        set sysStatusBar to NSStatusBar's systemStatusBar
        set statusItem to sysStatusBar's statusItemWithLength_(32)
        tell statusItem to setMenu_(statusMenu)
        tell statusItem to setHighlightMode_(1)
        set menuImage to NSImage's imageNamed_("mnuTest.png")
        tell statusItem to setImage_(menuImage)   
	end applicationWillFinishLaunching_

Dieser Code erstellt ein NSStatusbar Icon.

Um dann noch Einträge in diese Menü zu bringen, kann man folgendes benutzen:

Code:
        set menuItem to (my NSMenuItem's alloc)'s init
        menuItem's setTitle_("Quit mnuTest")
        menuItem's setTarget_(me)
        menuItem's setAction_("btnQuit:")
        menuItem's setKeyEquivalent_("q")
        menuItem's setEnabled_(true)
        statusMenu's addItem_(menuItem)
        menuItem's release()

in der info.plist Datei des Projektes (Cocoa Applescript Application) muss ein Eintrag hinzugefügt werden:

HTML:
Application is agent (UIElement) - YES

Grüße

Micha
 
Zurück
Oben Unten