Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - PopUpMenu bei Klick auf Button öffnen


Mysterio08 - Sa 28.08.10 09:49
Titel: PopUpMenu bei Klick auf Button öffnen
Hallo,

wahrscheinlich ist mein Problem ganz trivial, aber ich bekomme es nicht so elegant hin, wie ich es mir wünsche: Ich habe einen Button und möchte nun, dass sich bei einem Klick auf eben diesen Button ein PopUp-Menü öffnet.
Natürlich habe ich es Befehl PopMenu.Popup schon ausprobiert, das Problem ist dann jedoch, dass das PopUP-Menu außerhalb meiner (kleinen) Form angezeigt wird (mit den Parameter X und Y gibt man ja die Koordinaten des Screens an). Ich möchte gerne, dass es so geöffnet wird, wie man es auf dem Screenshot sieht.

mfg.


elundril - Sa 28.08.10 10:02

Hallo,

irgendwie fehlt da ein Screenshot in deinem Beitrag, meinst du nicht. Zuerst was Ankündigen und uns dann warten lassen ist fies. :mrgreen:

Zu deinem Problem: Warum übergibst du nicht Mouse.CursorPos.X und Mouse.CursorPos.Y? Dann sollten das Popup genau bei deiner Maus aufgehen.

Wenn du aber willst das es an einer bestimmt Stelle in deinem Formular aufgehen soll kannst du mittels Button1.ClientToScreen(Point(Self.Width + 10)) die X und Y Koordinaten an einer bestimmten Stelle herausfinden (in meinem Beispiel ist es rechts vom Button auf gleicher Höhe mit der oberen Kante des Buttons).

lg elundril


ALF - Sa 28.08.10 10:05

Hi, Versuch mal Deine ButtonKoordinaten zu nehmen
x:=button.left, y:= button.hight+1 als Beispiel.

oops, wahr jemand schneller :wink:
Gruss Alf


elundril - Sa 28.08.10 10:15

Gut, wenn du das Popupmenü an der Stelle haben willst musst du natürlich das so schreiben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TheButtonOnClick(Sender: TObject);
  var pnt: TPoint;
begin
  {...}
  pnt := TheButton.ClientToScreen(Point(0, Self.Height)); //ev. zum Height ein + 1 oder + 2 schreiben damit es so aussieht wie am Screenshot
  PopupMenu.PopUp(pnt.X, pnt.Y);
  {...}
end;


lg elundril


Mysterio08 - Sa 28.08.10 12:58

Danke, ich habe es mit Eurer Hilfe hinbekommen, ich musste die Variable Pnt vom Typ TPoint aber wie folgt initialisieren:
Pnt := BtnAenderungen.ClientToScreen(Point(0, BtnAenderungen.Height))

[Edt]Man kann den Anhang meines ersten Beitrages aber schon sehen, oder? elundril Beitrag hat mich ein wenig verwirrt![/edt]


elundril - Sa 28.08.10 13:10

Wie ich damals die 1.Antwort geschrieben habe, war keine Anhang weit und breit zu sehen, deswegen hab ich mal einen Blindflug gewagt mit dem Ziel den Kurs zu korrigieren sobald ich mehr Informationen (den Screenshot) hab. Sorry, für die Verwirrung.

lg elundril