Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Von welcher Komponente kommt popup-Aufruf (https://www.delphipraxis.net/184899-von-welcher-komponente-kommt-popup-aufruf.html)

idefix2 28. Apr 2015 22:38

Von welcher Komponente kommt popup-Aufruf
 
Hallo, ich stehe wieder einmal auf dem Schlauch.

Ich habe ein Popumenu, das ich verschiedenen Komponenten eines Formular zuordne. Wie kann ich in der onclick-Routine eines TMenuitem auf einfache Art feststellen, auf welche Komponente geklickt wurde, um das Popup-menu zu öffnen?

milos 28. Apr 2015 23:13

AW: Von welcher Komponente kommt popup-Aufruf
 
Hi,

meinst du sowas?
Delphi-Quellcode:
procedure TfrmMain.mntmN32Click(Sender: TObject);
var
  LMenuItem : TMenuItem;
begin
  LMenuItem := TMenuItem(Sender);

  ShowMessage(LMenuItem.Caption);
end;
Du kannst das Sender als diese Komponente casten die sie wirklich ist. z.B. TButton(Object), TLabel(Object) usw...

Freundliche Grüsse

Sir Rufo 28. Apr 2015 23:17

AW: Von welcher Komponente kommt popup-Aufruf
 
Dafür gibt es doch was von ...
http://docwiki.embarcadero.com/Libra...PopupComponent

@milos

Jeder Event, der von dem TPopupMenu ausgelöst wird hat als Sender ... das TPopupMenu ;)

milos 28. Apr 2015 23:18

AW: Von welcher Komponente kommt popup-Aufruf
 
Erst beim 2. mal richtig kapiert was du wolltest :stupid:

Hier ein bisschen Code für alles:
Delphi-Quellcode:
procedure TfrmMain.mntmN32Click(Sender: TObject);
var
  LMenuItem : TMenuItem;
  LPopupMenu : TPopupMenu;
  LParentComponent : TComponent;
begin
  LMenuItem := TMenuItem(Sender);
  LPopupMenu := TPopupMenu(LMenuItem.GetParentMenu);
  LParentComponent := TComponent(LPopupMenu.PopupComponent); // Komponente auf der TPopupMenu liegt

  ShowMessage(LParentComponent.Name);
end;

Sir Rufo 28. Apr 2015 23:31

AW: Von welcher Komponente kommt popup-Aufruf
 
@milos

Wieso ein
Delphi-Quellcode:
TComponent
nochmals zu einem
Delphi-Quellcode:
TComponent
casten?

Noch componentiger geht nicht ;)

Und wenn das Popup poppt, dann feuert
http://docwiki.embarcadero.com/Libra...upMenu.OnPopup

milos 28. Apr 2015 23:58

AW: Von welcher Komponente kommt popup-Aufruf
 
Zitat:

Zitat von Sir Rufo (Beitrag 1299608)
...Noch componentiger geht nicht ;)

Genau deswegen ;)

Nee, hab den 2. Code einfach in der universal IDE "notepad.exe" erweitert, hab nicht sehen können, dass es schon ein TComponent ist :D

idefix2 29. Apr 2015 00:05

AW: Von welcher Komponente kommt popup-Aufruf
 
Danke.
Ich habe die Dokumentation von TMenuitem von vorne nach hinten nach irgendetwas brauchbarem durchsucht, aber eigentlich ist es logisch, dass die Eigenschaft zum Popupmenu gehört und nicht zum Menuitem.

idefix2 29. Apr 2015 11:04

AW: Von welcher Komponente kommt popup-Aufruf
 
So, jetzt habe ich in dem Zusammenhang noch ein Problem:
Durch einen Klick mit der linken Maustaste wird in der TListbox der Itemindex auf das Element gesetzt, auf das geklickt wurde.
Bei einem Klick mit der rechten Maustaste passiert das aber nicht, es wird das Popup-menü aufgerufen, aber der Itemindex bleibt unverändert, unter Umständen bei einem anderen Item als bei dem, auf das geklickt wurde.
Ich würde aber gerne auch bei einem Rechtsklick manche der Menüaktionen spezifisch für ein bestimmtes Item der Listbox machen, ohne dass der User erst mit der linken Taste das Item anklicken muss, bevor er rechts klickt.

Dazu wollte ich zusätzlich zum Popupmenü in einem Onmousedown-Event der Listbox den itemindex richtig setzen. Das funktioniert aber nicht, weil durch das Onmousedown Ereignis das popupmenü offenbar unterdrückt wird, der Mausklick wird anscheinend dadurch "verbraucht" und weitere Aktionen finden nicht statt.
Und wenn ich in der Onmousedown Routine am Ende ein
Delphi-Quellcode:
TListbox(sender).popupmenu.popup(x,y)
aufrufe, bekomme ich

Code:
Zugriffsverletzung bei Adresse 00903A8E in Modul 'FocusOffice.exe'. Lesen von Adresse 00000000.
---------------------------
OK  
---------------------------
Im Debugger habe ich überprüft, dass Sender die richtige TListbox ist und das dort referenzierte Popupmenü das ist, das ich brauchen würde.

himitsu 29. Apr 2015 11:15

AW: Von welcher Komponente kommt popup-Aufruf
 
PopupComponent ist, so wie es auch in der OH steht, nur gültig, wenn es über Rechtsklick "automatisch" aufgerufen wurde.

Was mußt du also machen, wenn du es dennoch benutzen willst? :roll:





Delphi-Quellcode:
TListBox(Sender).PopupMenu.PopupComponent := TListBox(Sender);
TListBox(Sender).PopupMenu.Popup(X, Y);

Sir Rufo 29. Apr 2015 11:58

AW: Von welcher Komponente kommt popup-Aufruf
 
Am saubersten wäre ja die Methode Delphi-Referenz durchsuchenTListBox.OnContextPopup mit Leben zu füllen und dort den gewünschten Eintrag zu selektieren, so es denn gewünscht ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
Seite 1 von 2  1 2      

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