Sajjad1364
پنج شنبه 07 خرداد 1388, 00:49 صبح
مدتها بود که هر از چندگاهی اعضای تالار سوالاتی مبنی براینکه : چطو میشود فرمی را در داخل فرم دیگر صدا زد را مطرح می کردند
استفاده از متغیرهای سراسری و روش هایی که به استفاده مکرر و گیج کننده از نام فرم ها در فرم های دیگر منجر میشود و نمونه سازی های مکرر از فرم ها باعث میشود به فکر راه حل خوب و انعطاف پذیری بیافتیم.
بدون تعریف متغیرهای سراسری و با استفاده از Extension Method ها میتوان این کار را انجام داد.
خوب سراغ راه حل می رویم :
برای تعریف Extension Method باید کلاس ایستایی (static) تعریف کنیم :
public static class FormExtension
{
}
نکته : میتوانید این کلاس را در فایلی جداگانه در پروژه جاریتان و یا آنرا در یک پروژه جداگانه از نوعClass Library تعریف کنید
و در هر پروژه ای که خواستید آنرا به صورت رفرنس به پروژه خود اضافه کنید.
متد <ShowThisForm<T فرمی را که مد نظر شماست نمایش میدهد . در صورتیکه فرم مورد نظر شما قبلا در حافظه باشد آنرا نمایش میدهد و Focus را در اختیارش میگذارد اما اگر در حافظه نباشد آنرا ایجاد و بعنوان فرم جاری آنرا نمایش میدهد ( Show میشود نه ShowDialog).
بدنه این متد به صورت زیر تعریف میشود.
public static void ShowThisForm<T>(this FormCollection allForm) where T : Form, new()
{
T t = new T();
String _Type = t.GetType().Name;
Form form = allForm.Cast<Form>()
.FirstOrDefault(f => f.GetType().Name == _Type);
if (form != null)
{
if (!form.Focused)
{
form.Show();
form.Focus();
}
}
else
{
t.Show;()
{
{
حالا اگر مثلا در Form1 بنویسیم :
;()<Application.OpenForms.ThisForm<Form3
Form3 نمایش داده میشود.
شما میتوانید بجای Form3 بنویسید مثلا Form2 ,.....
متد بعدی ، باز هم یک Extension Method میباشد که فرمی را که مد نظر شماست را برمیگرداند.
اگر این فرم در حال حاضر در حافظه موجود باشد (یعنی فقط یکبار Show شده باشد ورها شده است) آنرا یرمی گرداند .اما اگر در حافظه نبود مقدار null بازگردانده میشود. مزیت استفاده از این متد اینست که این متد یک فرم تعیین نوع شده (Typed Form) را در اختیار شما قرار میدهد که احتیاج ندارید صریحا تبدیل نوع انجام بدهید.
به عنوان مثال اگر در Form4 متدی بنام MinimizeForm دارید برای فراخوانی آن کافیست بنویسید :
;()Application.OpenForms.ThisForm<Form4>().MinimizeForm
با استفاده از Extension Method ها میتوان کدهای کارآمدی را تولید کرد و تمام مزیت این دو متد جدای از راحت شدن کار اینست که ما هیچ نوع تازه ای ایجاد نکردیم که از کلاس FormCollection ارث بری داشته باشد واین متدها خود به خود به این کلاس اضافه میشوند.
حالا تمام کدی که باید در کلاس نوشت به اینصورت است.
public static class FormExtension
}
public static T ThisForm<T>(this FormCollection allForm) where T : Form, new()
{
T t=new T();
String _Type = t.GetType().Name;
Form form = allForm.Cast<Form>()
.FirstOrDefault(f => f.GetType().Name == _Type);
if ( form!= null)
{
return (T)form;
}
else
{
return default(T);
}
}
public static void ShowThisForm<T>(this FormCollection allForm) where T : Form, new()
{
T t = new T();
String _Type = t.GetType().Name;
Form form = allForm.Cast<Form>()
.FirstOrDefault(f => f.GetType().Name == _Type);
if (form != null)
{
if (!form.Focused)
{
form.Show();
form.Focus();
}
}
else
}
;()t.Show
{
{
{
پرانتزها و یا آکولادها ممکن هست جابجا بشوند.:چشمک:
موفق باشید
استفاده از متغیرهای سراسری و روش هایی که به استفاده مکرر و گیج کننده از نام فرم ها در فرم های دیگر منجر میشود و نمونه سازی های مکرر از فرم ها باعث میشود به فکر راه حل خوب و انعطاف پذیری بیافتیم.
بدون تعریف متغیرهای سراسری و با استفاده از Extension Method ها میتوان این کار را انجام داد.
خوب سراغ راه حل می رویم :
برای تعریف Extension Method باید کلاس ایستایی (static) تعریف کنیم :
public static class FormExtension
{
}
نکته : میتوانید این کلاس را در فایلی جداگانه در پروژه جاریتان و یا آنرا در یک پروژه جداگانه از نوعClass Library تعریف کنید
و در هر پروژه ای که خواستید آنرا به صورت رفرنس به پروژه خود اضافه کنید.
متد <ShowThisForm<T فرمی را که مد نظر شماست نمایش میدهد . در صورتیکه فرم مورد نظر شما قبلا در حافظه باشد آنرا نمایش میدهد و Focus را در اختیارش میگذارد اما اگر در حافظه نباشد آنرا ایجاد و بعنوان فرم جاری آنرا نمایش میدهد ( Show میشود نه ShowDialog).
بدنه این متد به صورت زیر تعریف میشود.
public static void ShowThisForm<T>(this FormCollection allForm) where T : Form, new()
{
T t = new T();
String _Type = t.GetType().Name;
Form form = allForm.Cast<Form>()
.FirstOrDefault(f => f.GetType().Name == _Type);
if (form != null)
{
if (!form.Focused)
{
form.Show();
form.Focus();
}
}
else
{
t.Show;()
{
{
حالا اگر مثلا در Form1 بنویسیم :
;()<Application.OpenForms.ThisForm<Form3
Form3 نمایش داده میشود.
شما میتوانید بجای Form3 بنویسید مثلا Form2 ,.....
متد بعدی ، باز هم یک Extension Method میباشد که فرمی را که مد نظر شماست را برمیگرداند.
اگر این فرم در حال حاضر در حافظه موجود باشد (یعنی فقط یکبار Show شده باشد ورها شده است) آنرا یرمی گرداند .اما اگر در حافظه نبود مقدار null بازگردانده میشود. مزیت استفاده از این متد اینست که این متد یک فرم تعیین نوع شده (Typed Form) را در اختیار شما قرار میدهد که احتیاج ندارید صریحا تبدیل نوع انجام بدهید.
به عنوان مثال اگر در Form4 متدی بنام MinimizeForm دارید برای فراخوانی آن کافیست بنویسید :
;()Application.OpenForms.ThisForm<Form4>().MinimizeForm
با استفاده از Extension Method ها میتوان کدهای کارآمدی را تولید کرد و تمام مزیت این دو متد جدای از راحت شدن کار اینست که ما هیچ نوع تازه ای ایجاد نکردیم که از کلاس FormCollection ارث بری داشته باشد واین متدها خود به خود به این کلاس اضافه میشوند.
حالا تمام کدی که باید در کلاس نوشت به اینصورت است.
public static class FormExtension
}
public static T ThisForm<T>(this FormCollection allForm) where T : Form, new()
{
T t=new T();
String _Type = t.GetType().Name;
Form form = allForm.Cast<Form>()
.FirstOrDefault(f => f.GetType().Name == _Type);
if ( form!= null)
{
return (T)form;
}
else
{
return default(T);
}
}
public static void ShowThisForm<T>(this FormCollection allForm) where T : Form, new()
{
T t = new T();
String _Type = t.GetType().Name;
Form form = allForm.Cast<Form>()
.FirstOrDefault(f => f.GetType().Name == _Type);
if (form != null)
{
if (!form.Focused)
{
form.Show();
form.Focus();
}
}
else
}
;()t.Show
{
{
{
پرانتزها و یا آکولادها ممکن هست جابجا بشوند.:چشمک:
موفق باشید