![]() |
Popupmenu TMenuItem Rechtsklick
Ich will ein PopupMenu bei dem man einen Eintrag auch rechtsklicken kann. Es wird dann eine andere Funktion ausgeführt als beim Linksklick.
Die Googlesuche brachte nicht wirklich was brauchbares. Hier gibt es Code für ein RCPopupmenu. ![]() Das Problem ist dass es nicht richtig funktioniert. Ich bekomme beim Rechtsklick ein anderes MenuItem als das welches angeklickt wurde. Liegt wohl daran dass ich in OnPopup die meisten Menuitems dynamisch erzeuge und die Komponente damit nicht zurecht kommt. edit: die richtige Position bekomme ich wenn ich diese um die Anzahl der unsichtbaren Elemente bis zu dieser Position erhöhe. Ein großes Problem bleibt aber. Submenus werden komplett ignoriert. Dann bleibt noch das Problem dass ich beim Rechtsklick das Popupmenu wieder manuell schließen muss. Durch Google kam ich auf
Delphi-Quellcode:
welches jedoch auch nicht funktioniert. Ich nutze Delphi 2009.
SendMessage(PopupList.Window, WM_CANCELMODE, 0, 0);
Danke im Voraus! |
AW: Popupmenu TMenuItem Rechtsklick
Also ich würde das irgendwie anders lösen. Rechtsklicks auf Menüeinträge sind nicht Standardkonform und sind mir noch nie unter gekommen. Ist ungefähr wie rechts Klick auf eine Schaltfläche. Gibt es auch nicht unter Windows. OK, den Strat-Button von Windows selbst mal ausgenommen. Aber hätte ich das nicht mal irgendwo gelesen, ich hätte es nie entdeckt.
Also ich würde die GUI nochmal überarbeiten. Hinzukommt, dass du dann auch nicht solche Klimmzüge in der Programmierung machen musst. Keep it simple. :wink: |
AW: Popupmenu TMenuItem Rechtsklick
Nimm doch statt OnClick OnMouseUp, dann kannst Du unterscheiden, welche Maustaste gedrückt wurde.
|
AW: Popupmenu TMenuItem Rechtsklick
Zitat:
Zitat:
|
AW: Popupmenu TMenuItem Rechtsklick
|
AW: Popupmenu TMenuItem Rechtsklick
Uuff. Wieder was gelernt. Ich glaube ich muss den Windows 7 Kurs noch mal machen. :shock:
|
AW: Popupmenu TMenuItem Rechtsklick
Ich war eben unterwegs, auf dem Handy wollte ich nicht mehr dazu schreiben. ;-)
Jedenfalls findet man dazu eigentlich leicht einiges bei Google: ![]() Unter anderem auch fertigen Code zu der Message, die ich gepostet habe: ![]() ![]() Zum Sinn: Man denke an die Favoriten in diversen Browsern, die Jumplist ab Windows 7 in der Taskleiste, schon genannt wurden Dateien in Menüs, ... |
AW: Popupmenu TMenuItem Rechtsklick
Zitat:
|
AW: Popupmenu TMenuItem Rechtsklick
Zitat:
Die zweite Lösung mit WM_MENURBUTTONUP hab ich auch versucht. Hätte es mit dazu schreiben sollen. Mit WM_MENURBUTTONUP funktionieren die Klicks zwar aber es gibt zwei Probleme. 1. Ich bekomme nicht mit ob ein Rechtsklick oder ein Linksklick durchgeführt wurde. 2. Das Popupmenü verschwindet sofort nach dem Klick. Wenn ich in Word, IE oder Firefox einen Menüeintrag rechtsklicke wird ein neues Popup-Menü angezeigt, das alte Menü bleibt aber sichtbar so lange bis im neuem Popupmenü etwas ausgewählt wurde. |
AW: Popupmenu TMenuItem Rechtsklick
Liste der Anhänge anzeigen (Anzahl: 1)
Hab noch was Interessantes entdeckt bei der zweiten Lösung (die mit den zwei problematischen Punkten).
Auch wenn der Rechtsklick damit funktioniert, wird die Funktion MenuRButtonUp() überhaupt nicht aufgerufen. Label1.Caption ändert sich nie. Projekt hab ich angehängt.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls; type TForm1 = class(TForm) PopupMenu1: TPopupMenu; PopupItem11: TMenuItem; popupitem21: TMenuItem; submenu1: TMenuItem; Label1: TLabel; procedure PopupItem11Click(Sender: TObject); procedure PopupItem21Click(Sender: TObject); procedure PopupItemClick(Sender: TObject); procedure PopupMenu1Popup(Sender: TObject); private FSelectedItem: TMenuItem; FTracking: Boolean; procedure MenuRButtonUp(var Msg: TMessage); message WM_MENURBUTTONUP; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.MenuRButtonUp(var Msg: TMessage); // ??? wird nie aufgerufen var Cmd: UINT; begin Label1.Caption := TimeToStr(now); LongBool(Cmd) := TrackPopupMenuEx(PopupMenu1.Handle, TPM_RECURSE or TPM_BOTTOMALIGN or TPM_RETURNCMD, Mouse.CursorPos.X, Mouse.CursorPos.Y, Handle, nil); if Cmd <> 0 then PopupMenu1.DispatchCommand(Cmd); inherited; end; procedure TForm1.PopupItem11Click(Sender: TObject); begin Caption := TimeToStr(Now)+' Popup Item 1 clicked on '; end; procedure TForm1.PopupItem21Click(Sender: TObject); begin // whatever.. Caption := TimeToStr(Now)+' Popup Item 2 clicked on '; end; procedure TForm1.PopupItemClick(Sender: TObject); begin Caption := TimeToStr(Now)+' clicked on '+TMenuItem(Sender).Caption; end; procedure TForm1.PopupMenu1Popup(Sender: TObject); var mi : TMenuItem; begin submenu1.Clear; mi := TMenuItem.Create(PopupMenu1); mi.Caption := 'Test1'; mi.OnClick := PopupItemClick; submenu1.Add(mi); mi := TMenuItem.Create(PopupMenu1); mi.Caption := 'Test2'; mi.OnClick := PopupItemClick; submenu1.Add(mi); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 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 by Thomas Breitkreuz