Entwickler-Ecke
Sonstiges (Delphi) - Komponente an Popup-Menu übergeben
Kay E. - Mo 29.10.07 10:12
Titel: Komponente an Popup-Menu übergeben
Hallo!
Ich habe folgendes Problem (was für euch vermutlich keins sein wird ;) ):
Ich habe ein Feld mit Buttons. Wird auf einen Button geklickt, soll ein Popup-Menu aufgerufen werden. In diesem Popup kann man nun verschiedene Symbole auswählen, das dann auf dem Button erscheinen soll. Dazu muss ich aber der Popup.EintragClick-Prozedur den Button
oder zumindest einen Verweis auf den gedrückten Button irgendwie übergeben können. Könnt ihr mir sagen wie?
Danke schonmal!
Kay
Narses - Mo 29.10.07 10:35
Moin und :welcome: im Forum!
Das Problem lässt sich z.B. so lösen:
- Du stellst die .Tag-Eigenschaft der Buttons auf einen eindeutigen Wert (im Beispiel hat Button1 den Tag 1, usw.)
- Du erstellst einen OnContextPopup-Handler für die Buttons und packst folgenden Code hinein:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.ButtonContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin PopupMenuEntry.Tag := (Sender as TButton).Tag; end; |
- Du erstellst einen Menü-Eintrag (Name hier: PopupMenuEntry) und gibst dem OnClick-Handler folgenden Code:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.PopupMenuEntryClick(Sender: TObject); begin ShowMessage('Button'+IntToStr((Sender as TMenuItem).Tag)); end; |
Im Anhang das Demo-Projekt. ;)
cu
Narses
jaenicke - Mo 29.10.07 10:41
Das geht relativ einfach, indem man die Tag-Eigenschaft des Popupmenüs dafür benutzt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TfrmMain.ButtonContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin PopupMenu1.Tag := Integer(Pointer(Sender)); end;
procedure TfrmMain.ButtonClick(Sender: TObject); var x: TPoint; begin PopupMenu1.Tag := Integer(Pointer(Sender)); x := Point(TButton(Sender).Left + TButton(Sender).Width, TButton(Sender).Top + TButton(Sender).Height); x := ClientToScreen(x); PopupMenu1.Popup(x.X, x.Y); end;
procedure TfrmMain.MenuItemClick(Sender: TObject); begin ShowMessage(TButton(Pointer(TMenuItem(Sender).Parent.Owner.Tag)).Caption + ' hat ' + TMenuItem(Sender).Caption + ' aufgerufen!'); end; |
Im Anhang ein Test mit 4 Buttons und 4 Menüeinträgen.
// Inline Edit: Ich sehe gerade die vorherige Antwort:
Ich finde meine Lösung besser, weil man nicht selbst vorher eine Tag-Eigenschaft zuzuweisen hat und zudem das Buttonobjekt selbst (und damit bei einem TBitBtn die Eigenschaft Glyph selbst) zur Verfügung hat. ;-)
Kay E. - Mo 29.10.07 10:48
Danke für die freundliche Begrüßung Narses :) und natürlich für die schnellen Antworten!
Werd gleich mal den Code ausprobieren, ob das so tut wie ich will. Auch wenn ich ehrlich gesagt durch den Code noch ned durchsteig - aber wofür gibts den Debugger, ne? ;)
Gruß Kay
Narses - Mo 29.10.07 10:54
Moin!
@
jaenicke: Wäre auch eine Alternative, statt den Button-Tag zu kopieren, einfach eine Referenz auf das Button-Objekt zu nehmen. :idea: ;) (bei deiner Lösung muss man den Button aber anklicken, um das Popup zu öffnen, oder? Ich habe den R-Klick genommen :nixweiss:)
cu
Narses
Kay E. - Mo 29.10.07 11:12
Das is schon ok, dass man den Button anklicken muss, so wars auch gedacht :D
Quelltext
1:
| TButton(TMenuItem(Sender).Parent.owner.Tag).Caption:='/'; |
zu der Zeile mal noch eben (habs n bissl abgeändert für meine Bedürfnisse). Nur damit ich das auch versteh, was ich da mach:
Es wird PopupMenu aus dem fest vorhandenen erstellt, dann wird auf das Elternteil zugegriffen (also das fest installierte Popup), dann kommt ein Punkt den ich nicht versteh - für was steht denn hier owner? (vlt. doofe Frage, aber ...) und dann der Tag ausgelesen, was ja im Prinzip ein Zeiger auf den Button ist. Und der Zeiger wird dann einem erstellten Button übergeben oder wird mit TButton(Pointer) der schon erstellte Button angesprichen?
Sorry für die vermutlich langweiligen Fragen, aber ich hab ewig nix mehr mit Delphi gemacht und habs offensichtlich verlernt...
Gruß Kay
jaenicke - Mo 29.10.07 13:14
Narses hat folgendes geschrieben: |
| (bei deiner Lösung muss man den Button aber anklicken, um das Popup zu öffnen, oder? Ich habe den R-Klick genommen :nixweiss:) |
So hatte ich das ja auch richtigerweise verstanden ;-)
Kay E. hat folgendes geschrieben: |
| Wird auf einen Button geklickt, soll ein Popup-Menu aufgerufen werden. |
Zur Erklärung:
Delphi-Quelltext
1:
| TButton(TMenuItem(Sender).Parent.owner.Tag).Caption |
TMenuItem(Sender).Parent ist ein unsichtbarer Menüeintrag, so wie bei einem TMainMenu der Eintrag oben in der Leiste. Glaube ich wenigstens, denn Parent ist ein TMenuItem ohne Name und Caption. Und der Owner davon ist dann das TPoupMenu, dessen Tag ich ja beim Buttonclick gesetzt habe.
Lannes - Mo 29.10.07 18:37
Hallo,
hm, es gibt die Eigenschaft PopupMenu.PopupComponent, damit hat man die aufrufende Komponente.
Im folgenden Beispiel wird die Caption des Menü-Items dem Button zugewiesen.
Also einen gemeinsamen Event-Handler erstellen für die Items des PopUp-Menüs.
Diesen Event-Handler im OI allen Items zuweisen und den Buttons im OI das PopupMenü.
Der Code im Event-Handler:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.AllPopUpMenuClick(Sender: TObject); begin TButton(PopupMenu.PopupComponent).Caption := TMenuItem(Sender).Caption; end; |
Kay E. - Di 30.10.07 22:47
Die Idee ist ja auch ne feine Sache! Schau ich mir gleich mal an.
Danke euch allen, auch wenn sich schon die nächsten Probleme ergeben. Ich glaub, ich erfreu euch bald mit nem neuen Thread ;)
Grüße Kay
jaenicke - Di 30.10.07 23:22
Die Eigenschaft kannte ich nicht, wieder was neues gelernt ;-).
Das kannst du im Grunde genau wie Tag benutzen, nur ohne die ganzen TypeCasts. Und da PopupComponent auch zugewiesen werden kann, funktioniert das auch, wenn das Kontextmenü über den Button aufgerufen wird und nicht automatisch per Rechtsklick (wo PopupComponent automatisch gesetzt wird).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!