2012-07-25 9 views
10

TPopupMenuをフォームの右側にどのように配置できますか?問題は、Popup(X, Y: Integer)を呼び出す前に、ポップアップメニューの幅を取得する方法がないように見えることです。TPopupMenuをフォームの右側に揃えますか?

Chromeのシステムメニューのような動作をしようとしています。

enter image description here

+0

重複をpaRightAlignmentを設定して呼び出すことができます。ドロップダウンメニューの位置を変更する](http://stackoverflow.com/q/4721989) –

+0

@Sertac - これは重複する質問ではありません。 a)Delphiでタグ付けされています。 b)単にポップアップを動かすことではありません。位置を計算できるように、メニューの幅を知る必要があります。 – norgepaul

+0

メニューウィンドウを移動する前に、サイズ/位置を取得できます。 VCLはあなたが求める機能を提供していないため、APIコールを使用する必要があります。私はそれが重複していると思うが、おそらく.. –

答えて

12

また、単に

with ClientToScreen(Point(ClientWidth - 1, 0)) do 
    Popup(X, Y); 
+1

非常に簡単です!優れた! – Whiler

+0

純粋なVCLソリューションの場合+1(「Win APIの_knowingは良いですが、それを使用しない方が良い方法を知っています」) –

+0

Perfect。偉大な答え:) – norgepaul

12

最も簡単な解決策は、ポップアップメニューを自分で起動するには、次のようになります。

procedure TForm1.Panel1ContextPopup(Sender: TObject; MousePos: TPoint; 
    var Handled: Boolean); 
var 
    PopupPt: TPoint; 
begin 
    PopupPt := ClientToScreen(Point(ClientWidth, 0)); 
    TrackPopupMenu(PopupMenu1.Handle, TPM_RIGHTALIGN or TPM_TOPALIGN, 
     PopupPt.X, PopupPt.Y, 0, PopupList.Window, nil); 
end; 

TrackPopupMenuや意味、様々なものをフラグのTrackPopupMenuExのマニュアルを参照してください。 [Windowsの場合:

+1

+1常に優れた仕事 –

+0

+1、Sertac - ダビデは言った。 :-) –

+0

+1 - ケンはダビデが言った:) ^^ – Shambhala

関連する問題