2008-09-25 14 views
6

मैं डेल्फी में एक पॉपअप मेनू का उपयोग कर रहा हूं। मैं इसे "रेडियो समूह" फैशन में उपयोग करना चाहता हूं, जहां उपयोगकर्ता किसी आइटम का चयन करता है, यह चेक किया जाता है और अन्य आइटम चेक नहीं किए जाते हैं। मैंने ऑटोचेक प्रॉपर्टी का उपयोग करने की कोशिश की, लेकिन इससे कई आइटमों की जांच की जा सकती है। क्या पॉपअप मेनू सेट करने का कोई तरीका है ताकि केवल एक आइटम की जांच की जा सके?डेल्फी पॉपअप मेनू चेक

उत्तर

5

ज़र्टोग सही है, लेकिन यदि आप चेकबॉक्स रखना चाहते हैं, तो इस ईवेंट को पॉपअप मेनू में प्रत्येक आइटम को असाइन करें।

ध्यान दें कि यह कोड थोड़ा बालों वाली दिख रही है क्योंकि यह आपके पॉपअप मेनू के नाम को जानने पर निर्भर नहीं है (इसलिए, इसे "GetParentComponent" के साथ देखकर)।

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //if they just checked something... 
    if Checked then begin 
     //go through the list and *un* check everything *else* 
     for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     if i <> MenuIndex then begin //don't uncheck the one they just clicked! 
      (GetParentComponent as TPopupMenu).Items[i].Checked := False; 
     end; //if not the one they just clicked 
     end; //for each item in the popup 
    end; //if we checked something 
    end; //with 
end; 

आप घटना क्रम पर हर पॉपअप बॉक्स के लिए इस तरह से अपनी फार्म पर असाइन कर सकते हैं (यदि आप ऐसा करना चाहते हैं):

procedure TForm2.FormCreate(Sender: TObject); 
var 
    i,j: integer; 
begin 
    inherited; 

    //look for any popup menus, and assign our custom checkbox handler to them 
    if Sender is TForm then begin 
    with (Sender as TForm) do begin 
     for i := 0 to ComponentCount - 1 do begin 
     if (Components[i] is TPopupMenu) then begin 
      for j := 0 to (Components[i] as TPopupMenu).Items.Count - 1 do begin 
      (Components[i] as TPopupMenu).Items[j].OnClick := OnPopupItemClick; 
      end; //for every item in the popup list we found 
     end; //if we found a popup list 
     end; //for every component on the form 
    end; //with the form 
    end; //if we are looking at a form 
end; 

इस जवाब नीचे एक टिप्पणी के जवाब में: आप तो कम से कम एक आइटम की जांच करने की आवश्यकता है, फिर पहले कोड ब्लॉक के बजाय इसका उपयोग करें। आप ऑनक्वेट ईवेंट में एक डिफ़ॉल्ट चेक आइटम सेट करना चाह सकते हैं।

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //go through the list and make sure *only* the clicked item is checked 
    for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     (GetParentComponent as TPopupMenu).Items[i].Checked := (i = MenuIndex); 
    end; //for each item in the popup 
    end; //with 
end; 
+0

उन्होंने यह भी होना चाहिए वह कोड जोड़ें जो जांचता है कि कम से कम एक मेनू आइटम चेक किया गया है और जो चेक बैक उपयोगकर्ता को चेक प्रविष्टि को अनचेक करता है जोड़ता है। यह आपके उदाहरणों को सरल होना चाहिए। – gabr

+0

मुझे यकीन नहीं है कि उसका लक्ष्य है, लेकिन मैंने जवाब में इसे संभालने के लिए एक ब्लॉक जोड़ा। यह वास्तव में चीजों को थोड़ा सा सरल बनाता है। – JosephStyons

+1

यह निश्चित रूप से जाने का तरीका नहीं है: यह कार्यक्षमता पहले ही अंतर्निहित है। ज़र्टोग और गेरी की पोस्ट देखें, और दोनों को गठबंधन करें। – onnodb

12

पॉपअप (या किसी अन्य) रेडियो समूह आइटम की तरह मेनू आइटम का इलाज करने के लिए, प्रत्येक आइटम आप रेडियो समूह में करना चाहते हैं के लिए सच करने के लिए 'RadioItem' गुण सेट।

चेकमार्क दिखाने के बजाए, यह चयनित आइटम द्वारा एक बुलेट दिखाएगा, लेकिन यह आपके इच्छित तरीके से काम करेगा, और दृश्य क्यू वास्तव में विंडोज मानक से मेल खाएगा।

4

ज़र्टोग के पोस्ट पर विस्तार करने के लिए: डेल्फी में पॉपअप मेनू (कम से कम डी 6 से) में ग्रुप इंडेक्स संपत्ति है जो आपको मेनू के भीतर रेडियो आइटम के कई सेट रखने की अनुमति देती है। एक दूसरे आदि के लिए पहले समूह, 2 के लिए 1 के लिए GroupIndex सेट

तो: सेट स्वत: जाँच = सच सेट RadioItem = सच सेट GroupIndex अगर आप रेडियो मदों की एक से अधिक समूह की जरूरत है

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