Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   PopupMenu für ein MenuItem (https://www.delphipraxis.net/162371-popupmenu-fuer-ein-menuitem.html)

Codehunter 19. Aug 2011 13:39

PopupMenu für ein MenuItem
 
Hallo!

Ich habe in verschiedenen Anwendungen gesehen, dass die für Einträge im MainMenu ein PopupMenu anbieten. Beispiel: Im Firefox das MainMenu mit der linken Maustaste öffnen und dann mit der rechten Maustaste auf einen MenuItem klicken. Es erscheint dann ein PopupMenu.

Ist sowas auch mit der VCL realisierbar?

Grüße
Cody

EDIT: Grad gesehen, das war mein 200stes Post hier. Mensch bin ich fleißig, hab nur 8 Jahre dafür gebraucht ^^

Steku 19. Aug 2011 13:48

AW: PopupMenu für ein MenuItem
 
Hallo Cody,

wenn ich mich richtig erinnere ist es zumindest bei
der Verwendung der Action-Kompos auch möglich zusätzliche
TActionsClients als ContextItems anzugeben...

Gruß,
Steku

Codehunter 19. Aug 2011 14:01

AW: PopupMenu für ein MenuItem
 
Ok, mit ein bissi Gebuddel im PSDK hab ich das hier zusammengezimmert:
Code:
procedure TForm1.WndProc(var Msg: TMessage);
begin
  if Msg.Msg = WM_MENURBUTTONUP then begin
    TrackPopupMenuEx(ppmTest.Handle, TPM_LEFTALIGN or TPM_RECURSE, Mouse.CursorPos.X, Mouse.CursorPos.Y, Handle, 0);
  end;
  inherited WndProc(Msg);
end;
Soweit so schlecht, denn AVG scheint nun in meinem Proggi einen Virus zu entdecken :-( Davon abgesehen funktioniert die Lösung aber.

EDIT: Verwendet man statt TrackPopupMenuEx die Routine TrackPopupMenu, dann bleibt AVG ruhig. Verdammte FALSE-FAULTS in den Virenscannern :-(

Memnarch 19. Aug 2011 14:10

AW: PopupMenu für ein MenuItem
 
das nennt sich dan FalseAlert und ist ein (fehlerhaftes) resultat der Heuristik in deinem AVG.

EDIT: hach, rote box hatte urlaub^^


MFG
Memnarch

Codehunter 19. Aug 2011 15:07

AW: PopupMenu für ein MenuItem
 
Ich kann mich erinnern, die haben es mal FALSE_FAULT genannt. Ist aber Wurscht :-)

Woran ich mir jetzt noch die Zähne ausbeiße ist, herauszufinden, auf welchem MenuItem die rechte Maustaste gedrückt wurde. WM_MENURBUTTONUP liefert nur das Handle des Menüs, im dem der Item steckt, mehr nicht.

EDIT: Laut PSDK müßte MenuItemFromPoint einen Rückgabewert vom Typ int haben, in Delphi 7 ist es aber als LongBool implementiert :?:

Codehunter 22. Aug 2011 08:25

AW: PopupMenu für ein MenuItem
 
Ich schubs den Thread noch mal nach oben. Inzwischen bin ich so weit gekommen dass ich MenuItemFromPoint am Laufen habe. Es liefert mir einen absoluten Index des MenuItem im betreffenden TMainMenu. Nur wie komme ich von dem absoluten Index auf den konkreten MenuItem in der hierarchischen Struktur von TMainMenu?

chaosben 22. Aug 2011 09:44

AW: PopupMenu für ein MenuItem
 
Das ist ziemlich simpel:

Hier ein Beispiel, das die Caption des MenuItems in die Caption des Formulars schreibt.
Delphi-Quellcode:
procedure WMMENURBUTTONUP(var Message: TMessage); message WM_MENURBUTTONUP;
//...
procedure TForm58.WMMENURBUTTONUP(var Message: TMessage);
begin
  Caption := MainMenu1.FindItem(Message.LParam, fkHandle)[Message.wParam].Caption;
  inherited;
end;


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