2012-07-25 20 views
10

एक TPopupMenu को किसी फ़ॉर्म के दाईं ओर कैसे गठबंधन किया जा सकता है? समस्या यह है कि Popup(X, Y: Integer) पर कॉल करने से पहले पॉपअप मेनू की चौड़ाई प्राप्त करने का कोई तरीका प्रतीत नहीं होता है।एक TPopupMenu को फ़ॉर्म के दाईं ओर दाईं ओर संरेखित करें?

मैं क्रोम में सिस्टम मेनू के समान व्यवहार करने की कोशिश कर रहा हूं।

enter image description here

+0

डुप्लिकेट कह सकते हैं: [विंडोज। ड्रॉप-डाउन मेनू स्थिति बदलें] (http://stackoverflow.com/q/4721989) –

+0

@Sertac - मुझे नहीं लगता कि यह एक डुप्लिकेट प्रश्न कैसे है। ए) इसे डेल्फी के साथ टैग किया गया है। बी) यह बस पॉपअप को स्थानांतरित करने के बारे में नहीं है। यह आवश्यक है कि मेनू की चौड़ाई ज्ञात हो ताकि स्थिति की गणना की जा सके। – norgepaul

+0

मेनू विंडो को स्थानांतरित करने से पहले, आप इसका आकार/स्थिति प्राप्त कर सकते हैं। वीसीएल आपके द्वारा पूछे जाने वाले कार्यक्षमता की पेशकश नहीं करता है, इसलिए आपको एपीआई कॉल का उपयोग करना होगा। मुझे लगता है कि यह एक डुप्लिकेट बनाता है, लेकिन शायद नहीं .. –

उत्तर

12

आप, साथ ही paRight करने के लिए Alignment सेट और

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

बहुत आसान! अति उत्कृष्ट! शुद्ध वीसीएल समाधान के लिए – Whiler

+0

+1 (जैसा कि "विन एपीआई जानना अच्छा है, लेकिन यह जानना कि इसका उपयोग कैसे नहीं करना बेहतर है") –

+0

बिल्कुल सही। महान उत्तर :) – norgepaul

12

सबसे आसान समाधान पॉपअप मेनू अपने आप को शुरू करने के लिए होगा: या TrackPopupMenu के लिए

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; 

दस्तावेज़ देखें विभिन्न झंडे क्या मतलब के लिए TrackPopupMenuEx

+1

+1 हमेशा के रूप में उत्कृष्ट काम –

+0

+1, Sertac - डेविड ने क्या कहा। :-) –

+0

+1 - क्या केन ने कहा कि डेविड ने कहा :) – Shambhala

संबंधित मुद्दे