AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

MacOS Menüeinträge

Ein Thema von Peter666 · begonnen am 29. Mai 2014 · letzter Beitrag vom 21. Aug 2019
Antwort Antwort
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

MacOS Menüeinträge

  Alt 29. Mai 2014, 09:19
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:
  mmMain.RecreateOSMenu;
  NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
  MainMenu := NSApp.MainMenu;
  if assigned(MainMenu) then
  begin
    AppItem := MainMenu.itemAtIndex(0);
    MainMenu.removeItem(AppItem);
  end;
das gesamte Menü neu erstellen muss. Geht das nicht etwas einfacher?
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#2

AW: MacOS Menüeinträge

  Alt 2. Jun 2014, 19:56
Ich hab jetzt folgendes mal gemacht:

Delphi-Quellcode:
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;
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?
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
260 Beiträge
 
#3

AW: MacOS Menüeinträge

  Alt 3. Jun 2014, 07:59
Das ist so auch nicht ganz korrekt. Probiers mal so:

Delphi-Quellcode:
      
var ServicesMenu: NSMenu;
...
Services := AppItem.submenu.itemAtIndex(mnuServices.Index);
ServicesMenu := TNSMenu.create;
ServicesMenu := TNSMenu.Wrap(ServicesMenu.init);
Services.setSubmenu(ServicesMenu);
NSApp.setServicesMenu(ServicesMenu);
Der Einfachheit halber nehme ich den Index des Menuitems, da dieses in der Regel dem im Mac-Menü entspricht.
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#4

AW: MacOS Menüeinträge

  Alt 28. Sep 2015, 09:09
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
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
260 Beiträge
 
#5

AW: MacOS Menüeinträge

  Alt 23. Okt 2015, 12:22
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 constructor TFMXOSMenuItem.Create(const AFMXMenuItem: TMenuItem); habe ich folgendes ergänzt:

Delphi-Quellcode:
 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;
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

Christian
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
260 Beiträge
 
#6

AW: MacOS Menüeinträge

  Alt 13. Dez 2016, 13:09
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:
if J = VisibleItemCount - 1 then
                begin
                  LNewMenu := NewNSMenu(SSpotlightFeature);
                  TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication).
                    setHelpMenu(LNewMenu); //+++
                end
                else
                  LNewMenu := NewNSMenu('');
Christian

Geändert von CHackbart (13. Dez 2016 um 13:35 Uhr)
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
260 Beiträge
 
#7

AW: MacOS Menüeinträge

  Alt 21. Aug 2019, 15:42
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:
procedure TPlatformCocoa.Terminate;
begin
  FRunning := False;
  FTerminating := True;
  NSApp.Stop(nil); //***
end;
aus dem Terminate(nil) ein Stop(nil) machen. Das steht schon in einem älteren Report hier: https://quality.embarcadero.com/browse/RSP-9723

Generell halte ich das was dort in TPlatformCocoa an Menüeinträgen zusammengezimmert ist ziemlich gewagt.

Christian
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz