Autor Beitrag
Kay E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 29.10.07 11:35 
Moin und :welcome: im Forum!

Das Problem lässt sich z.B. so lösen:
  1. Du stellst die .Tag-Eigenschaft der Buttons auf einen eindeutigen Wert (im Beispiel hat Button1 den Tag 1, usw.)
  2. Du erstellst einen OnContextPopup-Handler für die Buttons und packst folgenden Code hinein:
    ausblenden 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;

  3. Du erstellst einen Menü-Eintrag (Name hier: PopupMenuEntry) und gibst dem OnClick-Handler folgenden Code:
    ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.10.07 11:41 
Das geht relativ einfach, indem man die Tag-Eigenschaft des Popupmenüs dafür benutzt:
ausblenden 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:
// EDIT begin: Noch für rechte Maustaste ergänzt:
procedure TfrmMain.ButtonContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
  PopupMenu1.Tag := Integer(Pointer(Sender));
end;
// EDIT 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 29.10.07 11:54 
Moin!

@user profile iconjaenicke: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Mo 29.10.07 12:12 
Das is schon ok, dass man den Button anklicken muss, so wars auch gedacht :D

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.10.07 14:14 
user profile iconNarses 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 ;-)
user profile iconKay E. hat folgendes geschrieben:
Wird auf einen Button geklickt, soll ein Popup-Menu aufgerufen werden.

Zur Erklärung:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:
ausblenden 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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).