Zitat von
stonimahoni:
also deine lösung scheint brauchbar zu sein, doch wie positionier ich das teil richtig ??
ich hab halt rechts die buttonleiste und dort soll eigentlich neben dem einen button den ich drücke das popupding aufgehen und nicht irgwendwo im formular
Du kannst die linke obere Ecke des Popupmenues festlegen.
Wenn du den Sourcecode anschaust, dann siehst du, dass die linke untere Ecke von SpeedButton1 als Ausgangspunkt dient:
Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
pt: TPoint;
begin
pt.x := SpeedButton1.BoundsRect.Left;
pt.y := SpeedButton1.BoundsRect.Bottom;
pt := ClientToScreen(pt);
PopupMenu1.Popup(pt.x, pt.y);
end;
Dies lässt sich verbessern, in dem man nicht SpeedButton1, sondern das übergebene Steuerelement als Ursprung nimmt:
Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
pt: TPoint;
c : TControl;
begin
c := (Sender as TControl);
pt.x := c.BoundsRect.Left;
pt.y := c.BoundsRect.Bottom;
pt := ClientToScreen(pt);
PopupMenu1.Popup(pt.x, pt.y);
end;
Man kann das PopupMenue natürlich auch so positionieren:
Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
pt: TPoint;
c : TControl;
begin
c := (Sender as TControl);
// genau die Mitte des Controls berechnen
pt.x := (c.BoundsRect.Right+c.BoundsRect.Left) div 2;
pt.y := (c.BoundsRect.Top+c.BoundsRect.Bottom) div 2;
pt := ClientToScreen(pt);
PopupMenu1.Popup(pt.x, pt.y);
end;