مسئلهای که
در این پست در
مورد آن صحبت
میشود این
است که چگونه
میتوان از
فرمی که قرار
است فرزند فرم
دیگری (به صورت
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, null, null, new 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 را درج کنید.