Autor |
Beitrag |
Kay E.
      
Beiträge: 118
|
Verfasst: Mo 29.10.07 11:12
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 29.10.07 11:35
Moin und  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
Einloggen, um Attachments anzusehen!
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 29.10.07 11: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. 
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von jaenicke am Mo 29.10.07 14:07, insgesamt 1-mal bearbeitet
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: Mo 29.10.07 11: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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 29.10.07 11:54
Moin!
@ jaenicke: Wäre auch eine Alternative, statt den Button-Tag zu kopieren, einfach eine Referenz auf das Button-Objekt zu nehmen.  (bei deiner Lösung muss man den Button aber anklicken, um das Popup zu öffnen, oder? Ich habe den R-Klick genommen  )
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: Mo 29.10.07 12:12
Das is schon ok, dass man den Button anklicken muss, so wars auch gedacht
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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 29.10.07 14:14
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 29.10.07 19: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; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: Di 30.10.07 23: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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 31.10.07 00: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).
|
|
|