Sei stato molto chiaro. Infatti, noterai che nel mio codice ho usato il metodo ClientToScreen del form che permette di tramutare coordinate relative al controllo contenitore (il form) in coordinate schermo. Dovresti provare a chiamare il metodo ClientToScreen del controllo contenitore, invece del form. Un esempio:
codice:
procedure TForm1.Button1Click(Sender: TObject);
var
P: TPoint;
begin
P := Point(Button1.Left, Button1.Top + Button1.Height);
P := Panel1.ClientToScreen(P);
PopupMenu1.Popup(P.X, P.Y);
end;
supponendo che il controllo sia contenuto all'interno di un TPanel.
In definitiva, il pulsante ha sempre la stessa posizione, ma devi ogni volta chiedere al controllo che lo contiene di effettuare la conversione, il quale si rivarrà a ritroso verso il controllo nel quale è contenuto sino ad arrivare al form, poi allo schermo che darà il risultato consono da passare al metodo Popup.
E' macchinoso, ma è più facile da fare che da spiegare.