الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إظهار فورم واحد داخل MDI form

مغلق
بدأه إبراهيم دويكات في 17 ديسمبر 2005 · 12 رد · 1,281 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله........

أعرف أني قد سألتكم الكثير من قبل وغلبتكم كثير لكن والله اني أعرف ان في هذا المنتدى أشخاصا مبدعين........

المشكلة تتلخص كالتالي:

عندي مشروع كبير على C# طبعا......

عملت النافذة الرئيسية MDI container

ووضعت القوائم والأدوات كلها، وأضفت forms أخرى وكل شيء جاهز تقريبا

لكن عند استدعاء form آخر داخل MDI أكتب الكود التالي:

Form2 frm = new Form2;
frm.MDIParent = this;
frm.show;

وكلما أضغط على هذا الزر يعمل لي نسخة جديدة من هذا الـform

وأريد أن لا يظهر لي إلا نسخة واحدة فقط من هذا الفورم...................... كيف؟؟؟؟؟؟

لا أدري هل تحل المشكلة مع events أم بلا...................أفضل إذا لديكم حلا بدون استخدام الـevents

وجزاكم الله كل خير في الدنيا والآخرة وجعله الله في ميزان حسناتكم يوم لا ينفع مال ولا بنون..............

My_Sign.jpg
#2

قم بحفظ متحول عام من نوع الفورم الذي تريد إظهاره وقبل عملية افضهار قم بختبار أن الفورم ظاهر أم لا

    class Form1 : Form
    {
        Form2 frm = new Form2();


        void ShowForm2()
        {
            if (!frm.Visible)
            {
                frm.MDIParent = this;
                frm.show;
            }
        }
     ........
    }


class Form2 : Form
{

....
}

تم تعديل هذه المشاركة بواسطة TarekNajem04 في 17 ديسمبر 2005 في 21:02

لا تفعل إلا ما تستطيع أن تقوله ولا تقول إلا ما تسطيع أن تفعله

اللهم علمنا ما ينفعنا ونفعنا بما علمتنا وهب لنا من لدنك ولياً مرشدا

كلما أدبني الدهر أراني نقص عقلي ... وإذا ما زدت علماً زادني علماً بجهلي

أخوكم في الله أبو المجد

هيا نتعلم بعض المبادء لنطرق باب الإحتراف ************** جديد الدروس ( Application Domains and Assemblies)

التوقيت في دمشق:

<embed src="http://www.clocklink.com/clocks/0006-Gray.swf?TimeZone=R1T" width="200" height="240" wmode="transparent" type="application/x-shockwave-flash">

#3

بارك الله فيك أخي

"قم بحفظ متحول عام من نوع الفورم الذي تريد إظهاره"

يعني قصدك global variable في class???

بجربها وببعث رد................شكرا لك

My_Sign.jpg
#4

تستطيع حجز متحول عام على مستوى الفورم الذ تقوم به كما في المثال السابق أو أن تقوم بإنشاء ستاتك كلاس تقوم بتخزين جميع متحولات التي سوف تقوم بالتعامل معها من جميع الاماكن

    public static class GlobelVariable
    {
        private static Form2 m_MyForm = new Form2();

        public static Form2 MyForm
        {
            get
            {
                return m_MyForm;
            }
        }

       // تستطيع أن تضع ما تشاء من الخصائص
    }

طريقة الإستخدام

GlobelVariable.MyForm.Show();

لا تفعل إلا ما تستطيع أن تقوله ولا تقول إلا ما تسطيع أن تفعله

اللهم علمنا ما ينفعنا ونفعنا بما علمتنا وهب لنا من لدنك ولياً مرشدا

كلما أدبني الدهر أراني نقص عقلي ... وإذا ما زدت علماً زادني علماً بجهلي

أخوكم في الله أبو المجد

هيا نتعلم بعض المبادء لنطرق باب الإحتراف ************** جديد الدروس ( Application Domains and Assemblies)

التوقيت في دمشق:

<embed src="http://www.clocklink.com/clocks/0006-Gray.swf?TimeZone=R1T" width="200" height="240" wmode="transparent" type="application/x-shockwave-flash">

#5

جربتها واشتغلت..............(أول كود).........لكن.........

أول مرة الفورم(الثاني) يعمل بشكل ممتاز، أغلقه ثم أعيد تشغيله فيظهر الـexception التالي:

An unhandled exception of type 'System.ObjectDisposedException' occurred in system.windows.forms.dll

Additional information: Cannot access a disposed object named "Form2
My_Sign.jpg
#6

أخي الكريم أضف الإختبار التالي

            if (frm.Disposing)
            {
                frm = new Form2();
            }

لا تفعل إلا ما تستطيع أن تقوله ولا تقول إلا ما تسطيع أن تفعله

اللهم علمنا ما ينفعنا ونفعنا بما علمتنا وهب لنا من لدنك ولياً مرشدا

كلما أدبني الدهر أراني نقص عقلي ... وإذا ما زدت علماً زادني علماً بجهلي

أخوكم في الله أبو المجد

هيا نتعلم بعض المبادء لنطرق باب الإحتراف ************** جديد الدروس ( Application Domains and Assemblies)

التوقيت في دمشق:

<embed src="http://www.clocklink.com/clocks/0006-Gray.swf?TimeZone=R1T" width="200" height="240" wmode="transparent" type="application/x-shockwave-flash">

#7

عذرا أخي.............

أين أضع جملة الفحص الثانية؟؟؟

عملت كالتالي وأعطي exception

 	 if (frm.Disposing)
 	 {
    frm = new Form2();

 	 }

 	 if(frm.Visible)
 	 {

    frm.MdiParent=this;
    frm.Show();
 	 }

وهذا هو الـexception

Additional information: Cannot access a disposed object named "Form2".

وعملت هكذا ولم يظهر نهائيا:

 	 if (frm.Disposing)
 	 {
    frm = new Form2();

 	 

        if(frm.Visible)
            {

    frm.MdiParent=this;
    frm.Show();
        }
 	 }

إذا سمحت أريد الترتيب الصحيح لجمل الفحص................

My_Sign.jpg
#8

إليك الحل افضل

نقوم بإنشاء كلاس نطلق عليه اسم GlobelVariable مثلاً ونجعل من هذا الكلاس كلاس وحيد أي نستخدم Singleton Pattern

ونقوم بإضافة جميع الازم لمتحولاتنا العامه أنظر المثال:

    public class GlobelVariable
    {
        private Form2 m_MyForm;
        private EventHandler OnMyFormDisposedEventHandler;

        private static GlobelVariable m_GlobelVariable;

        static GlobelVariable()
        {
            m_GlobelVariable = new GlobelVariable();
        }

        private GlobelVariable()
        {
            OnMyFormDisposedEventHandler = new EventHandler(OnMyFormDisposed);
            InitializeMyForm();
        }

        public static GlobelVariable Instance
        {
            get
            {
                return m_GlobelVariable;
            }
        }

        public Form2 MyForm
        {
            get
            {
                return m_MyForm;
            }
        }

        // تستطيع أن تضع ما تشاء من الخصائص

        private void InitializeMyForm()
        {
            m_MyForm = new Form2();
            m_MyForm.Disposed += OnMyFormDisposedEventHandler;
        }

        void OnMyFormDisposed(object sender, EventArgs e)
        {
            m_MyForm.Disposed -= OnMyFormDisposedEventHandler;
            m_MyForm = new Form2();
            m_MyForm.Disposed += OnMyFormDisposedEventHandler;
        }
    }

طريقة أستخدام الكلاس على النحو التالي:

        private void NewToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (GlobelVariable.Instance.MyForm.Visible)
                GlobelVariable.Instance.MyForm.BringToFront(); // إذا كانت ظاهرة فأحضرها إلى الأمام
            else
                GlobelVariable.Instance.MyForm.Show(); // إذا لم تكون ضاهره أظهرها
            
        }

أتمنى لك التوفيق

لا تفعل إلا ما تستطيع أن تقوله ولا تقول إلا ما تسطيع أن تفعله

اللهم علمنا ما ينفعنا ونفعنا بما علمتنا وهب لنا من لدنك ولياً مرشدا

كلما أدبني الدهر أراني نقص عقلي ... وإذا ما زدت علماً زادني علماً بجهلي

أخوكم في الله أبو المجد

هيا نتعلم بعض المبادء لنطرق باب الإحتراف ************** جديد الدروس ( Application Domains and Assemblies)

التوقيت في دمشق:

<embed src="http://www.clocklink.com/clocks/0006-Gray.swf?TimeZone=R1T" width="200" height="240" wmode="transparent" type="application/x-shockwave-flash">

#9

سأجربها بإذن الله........

بارك الله فيك

My_Sign.jpg
#10

أخي الكريم

بارك الله فيك وفي جهودة الطيبة والمباركة.......وأعلم أنني قد شغلتك معي......

بعد طول عناء وبعد وقت طويل من التجارب هداني الله لهذه الطريقة البسيطة جدا جدا جدا

أولا: على مستوى الclass ضع هذا:

Form2 f2=new Form2();

وداخل الـ button أو أي شيء يظهر الفورم الثاني ضع هذا

try
 	 {
    if(f2.Visible==false)
   	 f2.Visible=true;
 	 }

 	 catch(Exception ex)
 	 {
    f2 = new Form2();
    f2.Visible=true;
    
 	 }

ولن يظهر إلا نسخة واحدة

أشكرك مرة أخرى وأشكر هذا المنتدى الأكثر من رائع.........(أفضل فريق عربي للبرمجة)

My_Sign.jpg
#11

أخي الكريم مع إحترامي لإفكارك

لكن نحن لا ننظر في البرمجة لسهولة الحل بل شمولية الحل

لذلك هذا الحل الذي تقدمه يعد من الحلول الامنطيقة لمبرمج يود الإحتراف الإسباب

1-لن تستطع دخول الفورم الثاني إلا من نفس الفورم وإذا أردت إضهاره في فورم آخر تحتاج لإعادة كتابة الكود مره آخرى.

2- إختراق طرق إصطياد الأخطاء بعدم تحديد لنوعية الخطأ التي تود أن تعالجة نفترض أن الخطأ الناجم عن عدم إظهار الفورم لعدم وجود ذاكرة كافية لإنشائة فعند محاولة لمعالجة الخطأ أن تقوم بإصدار الخطأ مره آخرى.

أنت سوف تقول ماهذا الكلام ولكن إذا أردت الإحتراف فعليك أن لا تفكر ببساطة الحل بل كما ذكرنا بشموليته لذلك يوجد الكثير من الحلول لهذه المشكلة ومشرحة بكثير من التفاصيل بالكتب التي تتحدث عن Design Patterns

أتمنى لك التوفيق

لا تفعل إلا ما تستطيع أن تقوله ولا تقول إلا ما تسطيع أن تفعله

اللهم علمنا ما ينفعنا ونفعنا بما علمتنا وهب لنا من لدنك ولياً مرشدا

كلما أدبني الدهر أراني نقص عقلي ... وإذا ما زدت علماً زادني علماً بجهلي

أخوكم في الله أبو المجد

هيا نتعلم بعض المبادء لنطرق باب الإحتراف ************** جديد الدروس ( Application Domains and Assemblies)

التوقيت في دمشق:

<embed src="http://www.clocklink.com/clocks/0006-Gray.swf?TimeZone=R1T" width="200" height="240" wmode="transparent" type="application/x-shockwave-flash">

#12

شكرا لك أخ طارق على الملاحظة.............لكن ما جعلني أستخدم هذه الطريقة هو أن الوقت قد ضغطني بشدة لتسليم المشروع............. وأريد حلا سريعا............

أعرف أن هذه ليست طريقة الاحتراف،،،، لكن للضرورة أحكام

My_Sign.jpg
#13

طبعا أحب أن أكون محترفا.................

لذلك وجدت حلا أعتقد انه حل لمن يريد الاحتراف

شاهدوا هذا الكود

public class Form1 : System.Windows.Forms.Form
	{
	bool x=false;

  private void button2_Click(object sender, System.EventArgs e)
  {
 	 Form2 f2=new Form2();
 	 if(x==false)
 	 {
    f2.Show();
    x=true;

 	 }
 	 f2.Closed+=new EventHandler(f2_Closed);
  }

  private void f2_Closed(object sender, EventArgs e)
  {
 	 x=false;
  }
My_Sign.jpg

هذا الموضوع مغلق.

مواضيع مشابهة