![]() |
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? |
AW: Von welcher Komponente kommt popup-Aufruf
Hi,
meinst du sowas?
Delphi-Quellcode:
Du kannst das Sender als diese Komponente casten die sie wirklich ist. z.B. TButton(Object), TLabel(Object) usw...
procedure TfrmMain.mntmN32Click(Sender: TObject);
var LMenuItem : TMenuItem; begin LMenuItem := TMenuItem(Sender); ShowMessage(LMenuItem.Caption); end; Freundliche Grüsse |
AW: Von welcher Komponente kommt popup-Aufruf
Dafür gibt es doch was von ...
![]() @milos Jeder Event, der von dem TPopupMenu ausgelöst wird hat als Sender ... das TPopupMenu ;) |
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; |
AW: Von welcher Komponente kommt popup-Aufruf
@milos
Wieso ein
Delphi-Quellcode:
nochmals zu einem
TComponent
Delphi-Quellcode:
casten?
TComponent
Noch componentiger geht nicht ;) Und wenn das Popup poppt, dann feuert ![]() |
AW: Von welcher Komponente kommt popup-Aufruf
Zitat:
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 |
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. |
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:
aufrufe, bekomme ich
TListbox(sender).popupmenu.popup(x,y)
Code:
Im Debugger habe ich überprüft, dass Sender die richtige TListbox ist und das dort referenzierte Popupmenü das ist, das ich brauchen würde.
Zugriffsverletzung bei Adresse 00903A8E in Modul 'FocusOffice.exe'. Lesen von Adresse 00000000.
--------------------------- OK --------------------------- |
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); |
AW: Von welcher Komponente kommt popup-Aufruf
Am saubersten wäre ja die Methode
![]() |
AW: Von welcher Komponente kommt popup-Aufruf
@himitsu
Danke, so funktioniert es. Wenn man daran denkt, ist es natürlich klar, dass Popupcomponent bei programmgesteuerten Aufruf des Popupmenüs nicht gesetzt sein kann, weil es in dem Fall ja gar keine Komponente gibt, die beim angeklickt werden das Popupmenu "auslöst". @Sir Rufo Ja, das wäre noch besser - kommt etwas weiter hinten auf meine to-do-list, jetzt bin ich einmal froh, dass es überhaupt funktioniert. |
AW: Von welcher Komponente kommt popup-Aufruf
Das ist eigentlich recht simpel
Delphi-Quellcode:
procedure TForm1.ListBox1ContextPopup( Sender: TObject; MousePos: TPoint; var Handled: Boolean );
var LIdx: Integer; begin // Item-Index bestimmen LIdx := TListBox( Sender ).ItemAtPos( MousePos, True ); if LIdx >= 0 then begin // ItemIndex setzen TListBox( Sender ).ItemIndex := LIdx; end else // kein Popup anzeigen Handled := True; end; |
AW: Von welcher Komponente kommt popup-Aufruf
Naja, fast so simpel, obwohl du im Prinzip Recht hast. Im den Popupmenüs sind ja neben item-spezifischen Einträgen auch solche, die immer anwählbar sein sollen, auch bei leerer Listbox, und es sind mehrere verschiedene Listboxen mit verschiedenen Einträgen, um die ich mich kümmern muss - in Summe, bis alles gründlich getestet ist, wird wohl eine gute Stunde draufgehen, um das umzustellen.
Im Moment muss ich schauen, dass das Programm so rasch wie möglich als Ganzes funktioniert, und in diesem Bereich verhält es sich jetzt auch in allen Sonderfällen genau, wie es soll. Das rühr ich erst wieder an, wenn ich etwas Luft habe :-D |
AW: Von welcher Komponente kommt popup-Aufruf
Auch wenn es für später ist:
Ich hoffe du verwendest eine ActionList und hast darüber die MenuItems dem PopupMenu hinzugefügt. Dann geht das recht fix. Die Actions beziehen sich ja immer auf einen Kontext. Wenn du dir jetzt den aktuellen Kontext irgendwo merkst, dann können die Actions das selber auswerten ![]() Das würde natürlich auch bedeuten, dass du nicht einfach nur Strings in der ListBox hast, sondern es zu jedem Eintrag auch eine passende Instanz, eben dieser besagte Kontext. Dann passiert das alles quasi wie von Geisterhand ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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