Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   MacOS Menüeinträge (https://www.delphipraxis.net/180558-macos-menueeintraege.html)

Peter666 29. Mai 2014 08:19

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:
  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?

Peter666 2. Jun 2014 18:56

AW: MacOS Menüeinträge
 
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? :(

CHackbart 3. Jun 2014 06:59

AW: MacOS Menüeinträge
 
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.

Peter666 28. Sep 2015 08:09

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

CHackbart 23. Okt 2015 11:22

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:
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

CHackbart 13. Dez 2016 12:09

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

CHackbart 21. Aug 2019 14:42

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:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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