Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Popupmenü implementieren (https://www.delphipraxis.net/216761-popupmenue-implementieren.html)

Rued 25. Feb 2025 15:36

Popupmenü implementieren
 
Hallo!

Ich sitze mit Delphi 12.2 an einer Android-App, die ein Popupmenü erhalten soll, das über den Button "BMenu" aufgerufen werden soll, sein Erscheinen aber verweigert. Das Popupmenü erstelle ich in Form.create wie folgt:
Delphi-Quellcode:
var
a:integer;
Item:TMenuItem;
begin
npop1:=TCustomPopupmenu.Create(self);
npop1.Parent := BMenu; // auch Form getestet
    for a := 1 to 3 do begin
     item := TMenuItem.Create(nPop1);
           with item do begin
              name := 'item'+inttostr(a);
              tag := a;
              text := inttostr(a);
              onclick := PopupMenuItemsClick;
           end;
       nPop1.AddObject(item);
    end;
  //nPop1.Popup(100,100);      auskommentiert, da App sonst nicht startet
   BMenu.PopupMenu := nPop1;
Im onClick des Button steht:
Delphi-Quellcode:
nPop1.Popup(100,100); //auch auskommentiert
nPop1.BringToFront;
Der Klick auf den Button führt zur Fehlermeldung "Abstrakter Fehler.". Wenn ich "nPop1.Popup(100,100)" auskommentiere bekomme ich keine Fehlermeldung, aber auch sonst tut sich nichts.

Was muss ich tun?

Delphi.Narium 25. Feb 2025 15:43

AW: Popupmenü implementieren
 
Delphi-Quellcode:
var
  a: Integer;
  Item: TMenuItem;
begin
  npop1 := TPopupMenu.Create(self);
  for a := 1 to 3 do
  begin
    item := TMenuItem.Create(nPop1);
    item.Name := 'item' + IntToStr(a);
    item.Tag := a;
    item.Caption := IntToStr(a);
    item.OnClick := PopupMenuItemsClick;
    nPop1.Items.Add(item);
  end;
end;

Uwe Raabe 25. Feb 2025 15:45

AW: Popupmenü implementieren
 
Korrekt!

In TCustomPopupMenu ist Popup abstrakt:
Delphi-Quellcode:
  TCustomPopupMenu = class(TFmxObject)
  private
    [Weak] FPopupComponent: TComponent;
    FOnPopup: TNotifyEvent;
  protected
    procedure DoPopup; virtual;
    property OnPopup: TNotifyEvent read FOnPopup write FOnPopup;
  public
    procedure Popup(X, Y: Single); virtual; abstract;
    property PopupComponent: TComponent read FPopupComponent write FPopupComponent;
  end;

AuronTLG 25. Feb 2025 15:50

AW: Popupmenü implementieren
 
Ist TCustomPopUpMenu überhaupt eine zulässige Klasse auf Android? Ich frage, weil das normale TPopUpMenu dies NICHT ist (und in der Komponentenpalette dementsprechend ausgegraut ist auf Android).
Wenn ich mich nicht irre, gibt es für die mobile Entwicklung nur PopUp-Komponenten, aus denen man sich selbst ein Menü bauen muss.

Sollte dem so sein, werfe ich als Alternative mal die TMultiView in den Raum, bei der man die "Mode" auf "PopOver" setzen kann. Diese verwende ich als PopUp-Komponente in meinen Apps, da sie einige nützliche Funktionen mit sich bringt, wie z.B. dass sie automatisch bei der eingestellten Masterkomponente aufpoppt.
Es gibt wohl auch TPopup, habe ich aber bisher nicht verwendet.

Uwe Raabe 25. Feb 2025 16:02

AW: Popupmenü implementieren
 
Zitat:

Zitat von AuronTLG (Beitrag 1546554)
Ist TCustomPopUpMenu überhaupt eine zulässige Klasse auf Android?

Das ist eine berechtigte Frage und die Antwort ist in der Tat "Nein". Nur Plattformen, die IFMXMenuService implementieren, können mit den FMX Menu-Komponenten arbeiten. Das sind aktuell lediglich Windows, MacOS und Linux.

Rued 25. Feb 2025 18:41

AW: Popupmenü implementieren
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1546555)
Zitat:

Zitat von AuronTLG (Beitrag 1546554)
Ist TCustomPopUpMenu überhaupt eine zulässige Klasse auf Android?

Das ist eine berechtigte Frage und die Antwort ist in der Tat "Nein". Nur Plattformen, die IFMXMenuService implementieren, können mit den FMX Menu-Komponenten arbeiten. Das sind aktuell lediglich Windows, MacOS und Linux.

Das ist bitter. Wie realisiere ich dann ein aufklappendes Menü? Mit Listbox oder ComboBox hoffentlich nicht.

jaenicke 25. Feb 2025 19:06

AW: Popupmenü implementieren
 
Zitat:

Zitat von Rued (Beitrag 1546567)
Das ist bitter. Wie realisiere ich dann ein aufklappendes Menü? Mit Listbox oder ComboBox hoffentlich nicht.

Doch, eine TListbox ist eine Option. Du kannst diese in ein TPopup packen. Du kannst natürlich auch andere Komponenten in TPopup verwenden. Und dann kannst du es einfach anzeigen:
Delphi-Quellcode:
  Popup1.PlacementTarget := Button1;
  Popup1.IsOpen := not Popup1.IsOpen;
Üblicher ist aber das Hamburger-Menü als Seitenmenü zu verwenden. Das geht mit TMultiView wie von AuronTLG bereits erwähnt (MultiView1.ShowMaster, MultiView1.HideMaster, ...).

Rued 26. Feb 2025 07:35

AW: Popupmenü implementieren
 
Ich danke Euch. Dann werde ich mich mal mit TMultiView versuchen. "Hamburger-Menü" klingt ungesund - Burger, Pommes und zuckrige Cola.

fisipjm 26. Feb 2025 07:55

AW: Popupmenü implementieren
 
Zitat:

Zitat von Rued (Beitrag 1546576)
Ich danke Euch. Dann werde ich mich mal mit TMultiView versuchen. "Hamburger-Menü" klingt ungesund - Burger, Pommes und zuckrige Cola.

TMultiView hat auch den Modus PopUp und macht dann genau das was du möchtest. Einfach deinen Button als Masterbutton setzen. Verschachtelte Menüs lassen sich so auch umsetzen.

jaenicke 26. Feb 2025 08:11

AW: Popupmenü implementieren
 
Zitat:

Zitat von Rued (Beitrag 1546576)
"Hamburger-Menü" klingt ungesund - Burger, Pommes und zuckrige Cola.

Es gibt ja auch Zero Cola. :lol:
Aber im Ernst: Das Wort Hamburger bezieht sich tatsächlich nur auf die Scheiben eines Hamburgers, weil das Symbol zum Aufrufen aus den drei horizontalen Strichen besteht.

Hier findest du übrigens Erklärungen und vor allem Screenshots zu den Möglichkeiten der TMultiView:
https://docwiki.embarcadero.com/RADS...and_Android%29


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