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/)
-   -   Delphi Popupmenu TMenuItem Rechtsklick (https://www.delphipraxis.net/186017-popupmenu-tmenuitem-rechtsklick.html)

Shark99 27. Jul 2015 23:38

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. http://stackoverflow.com/questions/1...enu-item-click

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:
SendMessage(PopupList.Window, WM_CANCELMODE, 0, 0);
welches jedoch auch nicht funktioniert. Ich nutze Delphi 2009.

Danke im Voraus!

Luckie 28. Jul 2015 00:14

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:

redox 28. Jul 2015 00:34

AW: Popupmenu TMenuItem Rechtsklick
 
Nimm doch statt OnClick OnMouseUp, dann kannst Du unterscheiden, welche Maustaste gedrückt wurde.

Shark99 28. Jul 2015 01:20

AW: Popupmenu TMenuItem Rechtsklick
 
Zitat:

Zitat von Luckie (Beitrag 1309971)
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:

Es gibt diese Funktionalität durchaus in Windows Menüs, sogar in Microsoft Programmen. in Microsoft Office 2007 kann man Menüeinträge rechtsklicken um das Menü anzupassen. Auch im Internet Explorer im Favoriten Menü kann man die Einträge rechtsklicken. Im Firefox funktioniert es auch. In meinem Fall wird es direkt in Programmfenster erkärt dass es geht. Das Feature will ich einbauen weil sehr viele User danach gefragt haben.

Zitat:

Zitat von redox (Beitrag 1309972)
Nimm doch statt OnClick OnMouseUp, dann kannst Du unterscheiden, welche Maustaste gedrückt wurde.

TMenuItem hat kein OnMouseUp.

jaenicke 28. Jul 2015 06:15

AW: Popupmenu TMenuItem Rechtsklick
 
Laut Doku geht das mit WM_MENURBUTTONUP:
https://msdn.microsoft.com/en-us/library/ms647610.aspx

Luckie 28. Jul 2015 06:34

AW: Popupmenu TMenuItem Rechtsklick
 
Uuff. Wieder was gelernt. Ich glaube ich muss den Windows 7 Kurs noch mal machen. :shock:

jaenicke 28. Jul 2015 07:02

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:
Bei Google suchendelphi tmenuitem right mouse click
Unter anderem auch fertigen Code zu der Message, die ich gepostet habe:
http://stackoverflow.com/questions/3...em-right-click
http://www.delphipages.com/forum/sho...d.php?t=180337

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, ...

Bernhard Geyer 28. Jul 2015 08:44

AW: Popupmenu TMenuItem Rechtsklick
 
Zitat:

Zitat von Shark99 (Beitrag 1309973)
Es gibt diese Funktionalität durchaus in Windows Menüs, sogar in Microsoft Programmen. in Microsoft Office 2007 kann man Menüeinträge rechtsklicken um das Menü anzupassen.

Gibts schon länger bei Office. Und dort war es immer das Problem das die Anwender versehentlich ihre Menüpunkte ausgeblendet haben und dann nachgefragt haben wo den diese Funktion jetzt nur wieder ist.

Shark99 28. Jul 2015 11:46

AW: Popupmenu TMenuItem Rechtsklick
 
Zitat:

Zitat von jaenicke (Beitrag 1309977)
Ich war eben unterwegs, auf dem Handy wollte ich nicht mehr dazu schreiben. ;-)
Jedenfalls findet man dazu eigentlich leicht einiges bei Google:
Bei Google suchendelphi tmenuitem right mouse click
Unter anderem auch fertigen Code zu der Message, die ich gepostet habe:
http://stackoverflow.com/questions/3...em-right-click
http://www.delphipages.com/forum/sho...d.php?t=180337

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, ...

Ich habe doch gepostet dass ich Code gefunden hab und sogar zu Stackoverflow gelinkt. Die RCPopupMenu Lösung (hab gleichen Code verlinkt wie dein DelphiPages Link) funktioniert nicht sobald man entweder Menüeinträge dymanisch erzeugt oder einige per Visible nicht anzeigt.

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.

Shark99 28. Jul 2015 14:19

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.

jaenicke 28. Jul 2015 14:40

AW: Popupmenu TMenuItem Rechtsklick
 
Füge mal in dem PopupMenu1Popup am Ende noch hinzu:
Delphi-Quellcode:
  TrackPopupMenuEx(PopupMenu1.Handle,
                            TPM_RECURSE or TPM_BOTTOMALIGN or TPM_RETURNCMD,
                            Mouse.CursorPos.X, Mouse.CursorPos.Y, Handle, nil);
Funktioniert auch noch nicht alles (das erste Menü reagiert nicht auf Klicks), aber mehr als vorher. ;-)

Shark99 28. Jul 2015 14:51

AW: Popupmenu TMenuItem Rechtsklick
 
Verstehe ehrlich gesagt den Sinn deines Codes nicht. Damit geht bei jedem Klick das Popupmenü nochmal auf, und zwar auch beim Linksklick.

jaenicke 28. Jul 2015 15:09

AW: Popupmenu TMenuItem Rechtsklick
 
Setz mal einen Haltepunkt auf MenuRButtonUp. Da kommst du nämlich nun an. Du kannst das auch anderswo einbauen, ich wollte nur zeigen, dass du so den Rechtsklick bekommst.

Shark99 28. Jul 2015 15:17

AW: Popupmenu TMenuItem Rechtsklick
 
Das stimmt, allerdings bekommt man 2+ Popupmenüs angezeigt, und zwar auch beim Linksklicks.

TrackPopupMenuEx() zeigt zwangsläufig das Menü an. Man kann aber .Popup() durch TrackPopupMenuEx() nicht ersetzen, weil TrackPopupMenuEx() keine Events auslöst (kein OnPopup etc).

p.s.

Habe nun versucht WM_MENURBUTTONUP in WndProc() abzufangen und dort einen Timer für 500ms zu starten damit ich erkenne dass ein Menü-Rechsklick stattgefunden hat. Aber MENURBUTTONUP wird in WndProc nie ausgelöst. Bin langsam am verzweifeln. :(

Shark99 28. Jul 2015 17:30

AW: Popupmenu TMenuItem Rechtsklick
 
Neue Erkentniss. WM_MENURBUTTONUP wird nicht ausgelöst, weil die Mainform nicht der Parent eines Popupmenü ist, sondern ein verstecktes Fenster. Die Message kommt statt dessen bei PopupList.WndProc() an. Dort muss man sich hooken und kann dann darauf reagieren. Leider trifft es nicht für Submenus eines Popupmenüs zu. Da wird MENURBUTTONUP nicht bei PopupList.WndProc() ausgelöst.

jaenicke 28. Jul 2015 19:13

AW: Popupmenu TMenuItem Rechtsklick
 
Liste der Anhänge anzeigen (Anzahl: 1)
Diese Unit funktioniert bei mir problemlos:
http://www.delphipages.com/forum/sho...d.php?t=180337
(einfach Rechtsklick auf das Formular)

Siehe Anhang

Shark99 28. Jul 2015 19:38

AW: Popupmenu TMenuItem Rechtsklick
 
Das ist doch exakt der gleiche Code den ich im ersten Post beschrieben hab.

Er hat zwei Probleme.

1. Sobald bei einem Item Visible = False ist passt die Zuordnung nicht mehr. Das Problem habe ich behoben.
2. Es funktioniert nicht wenn das Popupmenu ein Submenü hat (im Submenü kann nichts rechtsgeklickt werden).

jaenicke 28. Jul 2015 21:51

AW: Popupmenu TMenuItem Rechtsklick
 
Liste der Anhänge anzeigen (Anzahl: 1)
:oops:

Ok, habe ich nicht mehr auf dem Schirm gehabt...
Ich habe den Code kurz korrigiert, siehe Anhang...
Nicht schön, funktioniert aber...

Shark99 28. Jul 2015 22:00

AW: Popupmenu TMenuItem Rechtsklick
 
Hab dein Beispielprojekt eben getestet und es funktioniert nicht. Wenn ich im sd-Untermenü auf einen der Einträge rechtsklicke passiert nichts.

jaenicke 28. Jul 2015 22:34

AW: Popupmenu TMenuItem Rechtsklick
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe die Einträge mal richtig benannt und diesmal die Exe mit reingepackt. Nicht dass es an der Windowsversion liegt. Wenn es bei dir mit der Exe geht, muss es an Delphi 2009 liegen. Das habe ich noch in einer VM, teste ich grad.

// EDIT:
Funktioniert bei mir mit Delphi 2009 wie mit XE8 und mit XP wie mit 8.1 und 10.

// EDIT2:
Siehe:
Anhang 43621

Shark99 28. Jul 2015 22:58

AW: Popupmenu TMenuItem Rechtsklick
 
Beim neuesten Beispiel ist eine Zeile anders zu dem zuvor:

http://i.imgur.com/0Vfi4We.png

und es funktioniert!

Danke sehr! :-D

jaenicke 29. Jul 2015 06:40

AW: Popupmenu TMenuItem Rechtsklick
 
Zitat:

Zitat von Shark99 (Beitrag 1310069)
Beim neuesten Beispiel ist eine Zeile anders zu dem zuvor:

Ja, ich habe aus Routine die Compilerwarnung beseitigt. Bei mir ging es allerdings schon vorher, aber das war dann wohl Zufall.

Hauptsache es geht nun. ;-)

Nebenbei (auch für spätere Leser):
Wenn du so etwas debuggst, hilft der Window Detective sehr. Der zeigt nicht nur die Fenster der Anwendung an, sondern erlaubt es auch die Messages anzuzeigen, die an die Fenster geschickt werden.

Deshalb habe ich gesehen, dass die Message durchaus auch im Untermenü an das gleiche Fenster geschickt wird und musste nur noch debuggen warum sie nicht benutzt wird.


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