2010-06-21 8 views
10

मेरे सी # एप्लिकेशन में मेरे पास एक विकल्प संवाद है जिसे मेनू कमांड से खोला जा सकता है।मैं एक उदाहरण प्रपत्र कैसे बना सकता हूं (आवेदन नहीं)?

मैं यह सुनिश्चित करना चाहता हूं कि विकल्प संवाद में केवल एक उदाहरण है (उपयोगकर्ता किसी दिए गए समय पर एक से अधिक विकल्प विंडो नहीं खोल सकता) इसे मोडल किए बिना।

यदि उपयोगकर्ता के पास पहले से ही यह विंडो खुल गई है, और वह मेनू आइटम में इसे फिर से खोलने के लिए क्लिक करता है, तो ऐप बस पहले से ही दिखाई देने वाला फॉर्म शीर्ष विंडो बन गया है।

क्या कोई मुझे इन कार्यों को पूरा करने के निर्देशों को इंगित कर सकता है?

बहुत बहुत धन्यवाद।

उत्तर

6

आप संपत्ति

Form1 myForm = null; 
private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    myForm = null; 
} 

private void ShowForm() 
{ 
    if (myForm != null) 
    { 
     myForm.BringToFront(); 
    } 
    else 
    { 
     myForm = new Form1; 
     myForm.Show(); 
    } 
} 
+0

बस मेरे विकल्प फॉर्म द्वारा पहुंच योग्य होने के लिए स्थिर के रूप में myForm घोषित करें फॉर्मक्लोज्ड ईवेंट (myForm = null फिर से बनाने के लिए)। – RHaguiuda

17

खैर, सबसे आसान तरीका एक स्थैतिक क्षेत्र होना है जो एकल उदाहरण या शून्य के संदर्भ को संग्रहीत करता है, और उसके बाद इसे पुनर्प्राप्त करने या एक नया बनाने का तरीका संग्रहीत करता है।

ध्यान दें कि यह नहीं है जो इसे सिंगलटन बनाने जैसा ही है - क्योंकि मुझे लगता है कि फॉर्म बंद है या नहीं, तो आप अगली बार एक नया उदाहरण बनाना चाहते हैं। (वैकल्पिक - यह छुपा है और यह पुन: उपयोग - STO के जवाब में दिखाया गया है।) आप कुछ इस तरह कर सकते हैं:

public class OptionsDialog : Form 
{ 
    private static OptionsDialog openForm = null; 

    // No need for locking - you'll be doing all this on the UI thread... 
    public static OptionsDialog GetInstance() 
    { 
     if (openForm == null) 
     { 
      openForm = new OptionsDialog(); 
      openForm.FormClosed += delegate { openForm = null; }; 
     } 
     return openForm; 
    } 
} 

आप विधि बनाने के लिए चाहते हो सकता है प्रदर्शन के साथ-साथ "सामने के पास ले" चरणों , बेशक।

+0

हाय @ जोन, क्या आप एक उदाहरण प्रदान कर सकते हैं, कृपया? – RHaguiuda

+0

@RHaguiuda: मैंने जो कोड दिया है उसके अलावा आप क्या चाहते हैं? –

+1

हम्म, मैं देख सकता हूं कि वह अनुरोध कहां से आया था, यह वह नहीं है जो पोस्ट मूल रूप से दिखता था। पश्चिम चाल में सबसे तेज बंदूक? –

2

आप इस तरह कोड का उपयोग हो सकता है:

private MyDialogForm _FormInstance; 

public void ShowOptions() 
{ 
    if (_FormInstance == null) 
    { 
     _FormInstance = new MyDialogForm(); 
     _FormInstance.FormClosing += (s,e) => 
     { 
      e.Cancel = true; 
      _FormInstance.Hide(); 
     } 
     } 
    _FormInstance.Show(); 
} 
0

के रूप में इस फार्म की आवश्यकता होगी मुझे लगता है कि आप कम से कम दो रूपों की है। एक फॉर्म, इसे frmMain कहते हैं, आप frmOptions खोलने की अनुमति देता है। frmMain में, इस तरह के प्रकार frmOptions के एक चर जोड़ें: नियमित विकल्प खुलने वाले संवाद में

public partial class frmMain : Form 
{ 
    private frmOptions optionsInstance = null; 
    ... 

, इस जोड़ें:

if (optionsInstance == null || !optionsInstance.Visible) 
{ 
    optionsInstance = new frmOptions(); 
    optionsInstance.Show(); 
} 

जब frmOptions बंद कर देता है, optionsInstance रिक्त नहीं हो जाएगा, ताकि है क्यों आप जांचते हैं कि यह frmOptions इंस्टेंस को तत्काल करने से पहले दृश्यमान है या नहीं।

यदि यह आपके लिए काम नहीं करता है, तो आप एक म्यूटेक्स आज़मा सकते हैं, लेकिन शायद यह अधिक है।

10

आपको फॉर्म को बंद होने से रोकने की आवश्यकता है। यदि आप नहीं करते हैं, तो फॉर्म का निपटारा किया जाएगा और अनुपयोगी हो जाएगा। आप FormClosing घटना लागू करके ऐसा कर सकते हैं:

protected override void OnFormClosing(FormClosingEventArgs e) { 
     if (e.CloseReason == CloseReason.UserClosing) { 
      this.Hide(); 
      e.Cancel = true; 
     } 
    } 

यह एक सिंगलटन करने के लिये आपका मुख्य रूप कक्षा में फार्म के जीवन समय का ध्यान रखें:

frmOptions options; 

    private void btnShowOptions_Click(object sender, EventArgs e) { 
     if (options == null) { 
      options = new frmOptions(); 
      // To make absolutely sure: 
      options.FormClosed += (o, ea) => options = null; 
     } 
     else { 
      options.WindowState = FormWindowState.Normal; 
     } 
     options.Show(); 
    } 
+0

इस उत्तर के लिए धन्यवाद, क्या आप '(o, ea) =>' को समझा सकते हैं 'मुझे पता है कि आप फ़ॉर्म को वापस शून्य पर सेट करते हैं लेकिन मैं इस वाक्यविन्यास को समझ नहीं पा रहा हूं – meda

+2

यह एक लैम्ब्डा अभिव्यक्ति है। मैं आमतौर पर लिखता हूं (प्रेषक, ई) => लेकिन वे नाम पहले ही उपयोग में हैं। –

+0

स्पष्टीकरण के लिए धन्यवाद – meda

0

पर Jon Skeet's answer आधार पर, मैं एक मॉडल को एक संवाद संवाद बॉक्स के रूप में दिखाने के लिए निम्न कोड का उपयोग कर रहा हूं।

 if (this.aboutForm == null) 
     { 
      this.aboutForm = new AboutForm(); 
      this.aboutForm.FormClosed += (sender2, e2) => { this.aboutForm = null; }; 
      this.aboutForm.ShowDialog(this); 
     } 
     else 
     { 
      this.aboutForm.Focus(); 
     } 

मैं क्योंकि मैं मुख्य रूप से मेनू में प्रपत्र के बारे में प्रदर्शित करने के लिए एक मेनू आइटम है यह करने के लिए है, और सूचित आइकन के संदर्भ मेनू में।यदि मैं मुख्य रूप के मेनू का उपयोग करके फॉर्म के बारे में खोलता हूं, तो भी मैं अधिसूचना आइकन के संदर्भ मेनू आइटम का उपयोग करके एक और उदाहरण खोल सकता हूं।