![]() |
MacOS Menüeinträge
Hallo,
das ist ein bisschen eine Neverending Story, aber ich hab gerade ein Problem mit diversen Eigenheiten unter Mac. So gibt es ja das Services-Menu mit seinen Service Preferences, im deutschen ist der Dienste Eintrag. Das gleiche gilt für die Hilfe. Ich weiß das in der NSApplication ein servicesMenu und ein helpMenu sich befindet. Wie kann ich die in mein Menü eintragen? Ein anderes Problem ist das wenn ich dynamische Menüeinträge erstellen möchte ich via:
Delphi-Quellcode:
das gesamte Menü neu erstellen muss. Geht das nicht etwas einfacher?
mmMain.RecreateOSMenu;
NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication); MainMenu := NSApp.MainMenu; if assigned(MainMenu) then begin AppItem := MainMenu.itemAtIndex(0); MainMenu.removeItem(AppItem); end; |
AW: MacOS Menüeinträge
Ich hab jetzt folgendes mal gemacht:
Delphi-Quellcode:
Jetzt fügt er zwar in mein Menü an der 2ten Stelle das Services-Item ein, aber das hat kein Submenu. Hat jemand eine Idee? :(
AppItem := MainMenu.itemAtIndex(0);
if AppItem.hassubmenu then begin Services := TNSMenuItem.Create; Services := TNSMenuItem.Wrap(Services.initWithTitle(NSSTR('Services'),nil,NSSTR(''))); Services.setSubmenu(NSApp.servicesMenu); AppItem.submenu.insertItem(Services,2); Services.release; end; |
AW: MacOS Menüeinträge
Das ist so auch nicht ganz korrekt. Probiers mal so:
Delphi-Quellcode:
Der Einfachheit halber nehme ich den Index des Menuitems, da dieses in der Regel dem im Mac-Menü entspricht.var ServicesMenu: NSMenu; ... Services := AppItem.submenu.itemAtIndex(mnuServices.Index); ServicesMenu := TNSMenu.create; ServicesMenu := TNSMenu.Wrap(ServicesMenu.init); Services.setSubmenu(ServicesMenu); NSApp.setServicesMenu(ServicesMenu); |
AW: MacOS Menüeinträge
Der Code geht unter XE8 nicht mehr. Gibt es eine Möglichkeit das Platformhandle des MenuItems auszulesen um sowas zu machen?
NSApp.setServicesMenu(ServiceMenu1). Peter |
AW: MacOS Menüeinträge
Ich beantworte das mal, da ich ebenfalls auf das Problem gestoßen bin.
Es scheint irgend ein Problem mit submenu zu geben. Sobald man ein Element im Untermenü holen will, gibt es eine Exception. Irgendwie finde ich den Plattform Code auch etwas undurchsichtig, aber wenn man "eh" schon selber Hand anlegen muss, kann man auch seinen eigenen Code einbinden: In
Delphi-Quellcode:
habe ich folgendes ergänzt:
constructor TFMXOSMenuItem.Create(const AFMXMenuItem: TMenuItem);
Delphi-Quellcode:
So braucht man den TAG vom Servicemenü lediglich auf -99 setzen und schon wird das Menü hinzugefügt. Der Vorteil ist dabei, dass man nicht dauernd prüfen muss, ob das Menü neu aufgebaut wurde. Eine Helferklasse wäre natürlich besser, aber man(n) ist ja etwas faul ;)
if AFMXMenuItem.Tag = -99 then
begin ServiceMenu := TNSMenu.Create; ServiceMenu := TNSMenu.Wrap(ServiceMenu.init); NSMenuItem(Super).setSubmenu(ServiceMenu); TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication). setServicesMenu(ServiceMenu); end; Christian |
AW: MacOS Menüeinträge
Eine Kleinigkeit habe ich hier noch. Aus unerklärlichen Gründen geht unter Delphi Berlin der Spotlightmenu Eintrag nicht.
Abhilfe schafft folgender Code in procedure TPlatformCocoa.CreateOSMenu(AForm: TCommonCustomForm; const AMenu: IItemsContainer);
Delphi-Quellcode:
Christian
if J = VisibleItemCount - 1 then
begin LNewMenu := NewNSMenu(SSpotlightFeature); TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication). setHelpMenu(LNewMenu); //+++ end else LNewMenu := NewNSMenu(''); |
AW: MacOS Menüeinträge
Zugegebenermaßen ist der Thread schon etwas älter, aber bei der neuen Version von Delphi ist mir etwas unangenehm aufgefallen.
Geht man über den Menüpunkt Anwendung beenden, wird diese terminiert und nicht geschlossen. Dadurch wird u.a. alles was on OnDestroy steht nicht ausgeführt. Man muss also
Delphi-Quellcode:
aus dem Terminate(nil) ein Stop(nil) machen. Das steht schon in einem älteren Report hier:
procedure TPlatformCocoa.Terminate;
begin FRunning := False; FTerminating := True; NSApp.Stop(nil); //*** end; ![]() Generell halte ich das was dort in TPlatformCocoa an Menüeinträgen zusammengezimmert ist ziemlich gewagt. Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz