شنبه، مرداد ۲۶، ۱۳۸۷

ساختن فرم فرزند MDI تک نمونه‌ای در دات نت

مسئله‌ای که در این پست در مورد آن صحبت می‌شود این است که چگونه می‌توان از فرمی که قرار است فرزند فرم دیگری (به صورت MDI) باشد تنها یک نمونه ساخت. مثلا اگر آن فرم وجود نداشته باشد، فرم ساخته شود و اگر وجود دارد و فعال نیست، دیگر ساخته نشود، تنها فعال شود. به عنوان نمونه‌ی کاربرد در محیط ویژوال استودیو، پنجره‌ی Properties یک پنجره‌ است که فرزند خود محیط ویژوال استودیو به حساب می‌آید. اما هیچ‌گاه نباید دو تا پنجره‌ی Properties در آن واحد در برنامه ببینیم.

۱. چگونه ببینیم فرم فرزند باز است یا خیر

فرم والد خصیصه‌ای دارد به نام MdiChildren که آرایه‌ای است از Form ها. برای این که ببینیم فرمی قبلا باز بوده در برنامه یا خیر باید این آرایه را جستجو کنیم. برای این منظور تابعی نوشتم به نام IsChildFormLoaded که نوع فرم مورد نظر را بگیرد و به دلایلی که بعدا توضیح داده خواهد شد اشاره‌گری به فرم فرزند، چنان‌چه یافت شود برمی‌گرداند.

C#
  01:   
  02:   
  03:   
  04:   
  05:   
  06:   
  07:   
  08:   
  09:   
  10:   
  11:   
  12:   
  13:   
private bool IsChildFormLoaded(Type formType, out Form frmChild)
{
    frmChild = null;
    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType().Name == formType.Name)
        {
            frmChild = frm;
            return true;
        }
    }
    return false;
}

۲. چگونه فرم فرزند را نمایش دهیم

در حالت عادی برای نمایش یک فرم به عنوان فرزند یک فرم والد MDI چند خط زیر کافیست

C#
  1:   
  2:   
  3:   
SomeFormType frm = new SomeFormType();
frm.MdiParent = this;
frm.Show();

اما این چند خط مقصود مورد نظر ما را برآورده نمی‌کنند. برای این منظور ابتدا باید با تابعی که قبلا معرفی شد، وجود فرم بررسی شود و اگر وجود نداشت ایجاد شود و اگر وجود داشت صرفا فعال شود. برای این منظور تابع ShowOrActivateMDIChildForm به صورت زیر تعریف می‌شود:

C#
  01:   
  02:   
  03:   
  04:   
  05:   
  06:   
  07:   
  08:   
  09:   
  10:   
  11:   
  12:   
  13:   
  14:   
  15:   
  16:   
private void ShowOrActivateMDIChildForm(Type formType)
{
    Form frmChild;
    if (IsChildFormLoaded(formType, out frmChild))
    {
        frmChild.Activate();
        if (frmChild.WindowState == FormWindowState.Minimized)
            frmChild.WindowState = FormWindowState.Normal;
    }
    else
    {
        Form frm = (Form)formType.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, nullnullnew object[0]);
        frm.MdiParent = this;
        frm.Show();
    }
}

خط ۱۲ صرفا یک شی از نوع فرم مورد نظر می‌سازد. علت ظاهر غیرعادی آن این است که ما در این تابع اطلاعی از فرم نداریم بجز شی‌ءای از نوع Type برای فرم مورد نظر. وظیفه‌ی این خط فراخوانی سازنده‌ی کلاس مرتبط با آن نوع و برگرداندن شی‌ء ساخته شده از این طریق می‌باشد.

در انتها فرض کنید پس از انتخاب منویی به نام mnuShowCustomers ما قصد داریم فرمی که اسم کلاسش FormCustomers است را به همین طریق فعال بکنیم:

C#
  1:   
  2:   
  3:   
  4:   
private void mnuShowCustomers_Click(object sender, EventArgs e)
{
    ShowOrActivateMDIChildForm(typeof(FormCustomers));
}

پ.ن.:

۱. MDI مخفف Multiple Document Interface می‌باشد و به مدلی گفته می‌شود که در آن یک پنجره والد است و مابقی پنجره‌های برنامه فرزند آن پنجره‌ی والد خواهند بود و داخل مرزهای آن نمایش داده می‌شوند. در این مدل نوار منو و نوار ابزار بین والد و فرزندان به اشتراک گذاشته می‌شود. برای نمونه محیط برنامه نویسی ویژوال استودیو و برنامه‌های مایکروسافت آفیس چنینند.

 

5 نظر:

ناشناس :

tanx

ناشناس :

daset dard nakone refigh
kheyli hal dadi.... mamnun


k1
wampinc@yahoo.com

ناشناس :

salam man zahediam. mostafa. kheyli mamnun vaghean aali bud. in email mane mobilevirus25@gmail.com mishe lotfan ye email be man bezanid ke betunam age soali dashtam azatun beporsam? midunam yekam porruei ama shayad manam be darde shoma bokhoram mamnun

ناشناس :

سلام
اقا دستت درد نکنه

ناشناس :

اي ول

ارسال یک نظر

جهت نمایش صحیح آدرس سایتتان، حتما قبل از آدرس //:http را درج کنید.