PDA

View Full Version : ایجاد یک عضو جدید ازفرم و اجرای آن -داینامیک



once4ever
جمعه 04 اسفند 1385, 19:34 عصر
یه تابع میخوام که اسم از نوع string بگیره ( یا یک شی از یک فرم) و نوع فرم مربوطه (اسم کلاس فرم) و چک کنه اگه این عضو null هست برابر یک عضو جدید بکنه و اجرا کنه

اَرژنگ
شنبه 05 اسفند 1385, 07:57 صبح
try
{
Assembly tempAssembly = Assembly.GetExecutingAssembly();
Form frm1 = (Form) tempAssembly.CreateInstance(textBox1.Text);
frm1.Show();
}
catch(Exception ex)
{
MessageBox.Show("Error creating: "+ textBox1.Text);
}

once4ever
شنبه 05 اسفند 1385, 09:46 صبح
مرسی. منظورم این نبود
یه فرم MDI اصلی دارم که داخل اون چندتا فرم نمایش داده میشه
اول برای هر فرم فرزند یک عضو جدید تعریف میکنم
حالا یه تابع میخوام که اسم اون عضو (بصورت object یا هرچیزی) بگیره و چک کنه اگه dispose شده اونو دوباره ایجاد کنه (یعنی new کنه ) و بعد اجراش کنه
مثلا:

void DoForm(object objForm){
if(objForm.IsDisposed)
objForm=new typeof(objForm);
objForm.MDIparent=this;
}
objForm.Show();

}

اَرژنگ
شنبه 05 اسفند 1385, 11:09 صبح
این کاره یک تابعی نیست، باید از کلاس استفاده بشه،
یک کلاس که وظیفش مدیریت این فرمهاست را باید طراحی کنید،
وقتی که به یکی از فرمها نیاز دارید از آن کلاس درخواست میکنید که یکی
بسازه و بفسرته، وقتی هم که کارتان تمام شد از همان کلاس درخواست میکنید که آزادش
کند. چونکه این کلاس میدریت فرمها را انحصاراًَ در دست داره ، میتونید تمامه منطق
بوجود آوردن و آزاد کردن فرمهاتان را در همان کلاس پیاده کنید.

once4ever
شنبه 05 اسفند 1385, 11:42 صبح
میشه بیشتر توضیح بدید؟!

میتونید تمامه منطق
بوجود آوردن و آزاد کردن فرمهاتان را در همان کلاس پیاده کنی

فقط من تو این خط مشکل دارم:
MyForm form = new MyForm
چون درحالتی که من میخوام. MyForm و form بصورت ورودی به تابع داده میشه.

اَرژنگ
یک شنبه 06 اسفند 1385, 02:03 صبح
میشه بیشتر توضیح بدید؟!


فقط من تو این خط مشکل دارم:
MyForm form = new MyForm
چون درحالتی که من میخوام. MyForm و form بصورت ورودی به تابع داده میشه.
زبان برنامه نویسی مثل یک چکش میمانه، میشه باهاش میخ کوبید و یا چاله کند، این روش به میخ کوبیدن شباحتی نداره.
مشکل اصلی چیه، با این روش میخواهید که چه کاری انجام بشه؟
شاید پترنایه بیلدر و یا فاکتوری بیشتر به عملی که میخواهید انجام بدید کمک کنند.

once4ever
یک شنبه 06 اسفند 1385, 07:49 صبح
شاید!
یه برنامه MDI هست که 20تا form داخل اون باز میشه
این فرمها فقط یکبار اجازه دارند باز بشن
یعنی اگر روی منو زدیم و اون فرم باز شد . فقط باید نمایش بده و فرم جدید ایجاد نکنه
راه حل شما چیه؟
-من فرمهارو تعریف میکنم برای کلاس و هربار با زدن منو چک میکنم آیا زنده هست یا مرده! اگه زنده هست که show کن. اگه مرده که دوباره بسازش.

برای انجام راه حل بالا و برای اینکه یه سری کد تکراری نداشته باشم. میخوام این راه حل با یه تابع بنویسم . و برای منوها این تابع رو صدا بزنم!
خوب؟

اَرژنگ
دوشنبه 07 اسفند 1385, 07:24 صبح
شاید!
یه برنامه MDI هست که 20تا form داخل اون باز میشه
این فرمها فقط یکبار اجازه دارند باز بشن
یعنی اگر روی منو زدیم و اون فرم باز شد . فقط باید نمایش بده و فرم جدید ایجاد نکنه
راه حل شما چیه؟
-من فرمهارو تعریف میکنم برای کلاس و هربار با زدن منو چک میکنم آیا زنده هست یا مرده! اگه زنده هست که show کن. اگه مرده که دوباره بسازش.

برای انجام راه حل بالا و برای اینکه یه سری کد تکراری نداشته باشم. میخوام این راه حل با یه تابع بنویسم . و برای منوها این تابع رو صدا بزنم!
خوب؟

خیلی خوب :) فقط احتیاج دارید که یک کلاس بنویسید که این فرمها درش به ِنوان فیلدها تعریف شدند وقتی که به یکی از فرمها نیاز دارید از آن کلاس تغاضا میکنید که یکInstance از آن فرم را برگردانه، در داخل کلاس یک کدی مثل این را استفاده میکنید:




private Form1 frm1;
private Form2 frm2;
private Form3 frm2;

public Form1 GetForm1Instance()
{
if (frm1!=null)
frm1 = new Form1();
return frm1;
}



public Form2 GetForm2Instance()
{
if (frm2!=null)
frm2 = new Form1();
return frm2;
}

به این روش میگند سینگلتن پترن (پترنه یکتایی)Singlton Patern
استفاده از تابع برایه این کار درست نیست، از روشهایه شیئ‌گرایی باید استفاده کرد.
در این روش شما همیش یک اینستانس از هرکدام از فرمها را خواهید داشت.
در ضمن دیگه به اینکه چک نید که فرم زنده است و یا مرده نیاز نخواهید داشت، فقط از کلاسی که این روشها را تعریف میکنه درخواست کنید که فرم را به شما برگردانه، و شما فقط Show را براش صدا میزنید.

once4ever
دوشنبه 07 اسفند 1385, 09:33 صبح
ممنون از جوابت.
اما من همین کارو تو کلاس اصلی انجام میدم
اما چیزی که من میخوام اینه که برای 20تا فرم اون خطی که شما نوشتید باید 20بار تکرار بشه
که من میخوام مجبور نباشم 20 بار خطهارو تکرار کنم !
فکر کنم دیگه فهمیده باشید منظور من چه قسمتی هست ;)

اَرژنگ
دوشنبه 07 اسفند 1385, 11:26 صبح
این روشی که در وی‌بی استفاده میشه، ببین کارت را راه میندازه:


Dim formAsm As [Assembly] = _
[Assembly].LoadFrom( _
"http://AppServer/CustomerServ/CustomerMain.dll")
Dim formtype As Type = formAsm.GetType("FirstForm.FirstForm")

Dim FormObj As Object
FormObj = Activator.CreateInstance(formtype)
Dim Form1 As Form = CType(FormObj, Form)
Form1.Show()