PDA

View Full Version : سوال: ارسال خود فرم(نه object ش) به يك كلاس!



mahboube
سه شنبه 27 مهر 1389, 10:56 صبح
سلام دوستان
چطوري ميشه يك فرم رو نه يك شي از فرم ،خود فرم (كه بشه ازش شي ساخت) رو به عنوان پارامتر به يك كلاس فرستاد؟؟!!!
توي كلاس حتما بايد به شكل زير تعريف شه چون نمي دونيم چه فرميه!!



class class1
{
public class1(Form f)
{}
}




در واقع مي خوام يك فرم رو به يك كلاس بفرستم و توي كلاس ازش چند تا object بسازم .به جاي كد زير:(اينجا مجبورم دوتا شي از يك نوع فرم رو بفرستم)




class class1
{
public class1(Form f,Form f1
{}
}

mmd2009
سه شنبه 27 مهر 1389, 11:56 صبح
با سلام

یعنی شما نمیخوای به این دوشکلی که نوشتم عمل بکنید ؟

کدهای کلاس :



class Myform
{
public void MyformAddToClass(Form MyForm )
{
MessageBox.Show(MyForm.Name);
}

public Myform(Form f)
{
MessageBox.Show(f.Name);
}
}



کدهای فرم :



Myform f = new Myform(this);



یا این :



f.MyformAddToClass(this);

mahboube
سه شنبه 27 مهر 1389, 12:03 عصر
نه نازنين!
من بايد تو كلاسم بتونم ازش شي بسازم.يعني ميخام بتونم دستور زيرو تو كلاس براي پارامتر ارسال شده بنويسم:


Form1 form=new Form1

ali.rezaei7
سه شنبه 27 مهر 1389, 12:31 عصر
سلام
از کلمه کلیدی is استفاده کنید. شی مورد نظرتونو با فرمهای داخل برنامتون مقایسه کنید. مثال:



Public void CreateForm(Form f)
{
Form f2;
if(f is Form1)
f2=new form1();
elseif (f is Form2)
f2=new Form2();
else
f2=new Form3();
f2.Show();
}

mmd2009
سه شنبه 27 مهر 1389, 12:48 عصر
سلام
از کلمه کلیدی is استفاده کنید. شی مورد نظرتونو با فرمهای داخل برنامتون مقایسه کنید. مثال:



Public void CreateForm(Form f)
{
Form f2;
if(f is Form1)
f2=new form1();
elseif (f is Form2)
f2=new Form2();
else
f2=new Form3();
f2.Show();
}



فکر نکنم نیازی باشه. چون اگر 100 فرم داشته باشیم اونوقت باید چیکار کنیم ؟؟؟

روش پایین به مراتب بهتره.



public void Myf(Form f)
{
Form f2 = f;

MessageBox.Show(f.Name);
MessageBox.Show(f2.Name);

}

mahboube
سه شنبه 27 مهر 1389, 12:52 عصر
سلام
از کلمه کلیدی is استفاده کنید. شی مورد نظرتونو با فرمهای داخل برنامتون مقایسه کنید.
مرسي ولي اينم عملي نيست چون 100 تايي فرم دارم.

mmd2009
سه شنبه 27 مهر 1389, 12:55 عصر
مرسي ولي اينم عملي نيست چون 100 تايي فرم دارم.

بالا که گفتم نیازی نیست به این کار. همون روشی که گفتم رو برید. :متفکر:

mahboube
سه شنبه 27 مهر 1389, 12:59 عصر
فکر نکنم نیازی باشه. چون اگر 100 فرم داشته باشیم اونوقت باید چیکار کنیم ؟؟؟

[/php]

اينم نميشه.
چون حتي اگه دوتا هم فرم بسازيم و فرم ارساليمونو بهش بديم باز به يك فرم اشاره مي كنن!!!
همون كه ارسال شده!

ali.rezaei7
سه شنبه 27 مهر 1389, 13:00 عصر
فکر نکنم نیازی باشه. چون اگر 100 فرم داشته باشیم اونوقت باید چیکار کنیم ؟؟؟

روش پایین به مراتب بهتره.



public void Myf(Form f)
{
Form f2 = f;

MessageBox.Show(f.Name);
MessageBox.Show(f2.Name);

}


دوست عزیز این کد هیچ فرقی با نبودش نداره. f2 به f اشاره می کنه. حتی اگه از متد Show برای f2 استفاده کنی فرم جدید رو نشون نمی ده. ولی کد من یک شی از کلاس شی ارسال شده ایجاد می کنه.

mmd2009
سه شنبه 27 مهر 1389, 13:24 عصر
دوست عزیز این کد هیچ فرقی با نبودش نداره. f2 به f اشاره می کنه. حتی اگه از متد Show برای f2 استفاده کنی فرم جدید رو نشون نمی ده. ولی کد من یک شی از کلاس شی ارسال شده ایجاد می کنه.


چطوری وقتی یک فرم باز هستشن انتظار دارید نمایشش بده؟

خب الان این کد رو اجرا کنید ببینید باز اشکال میده ؟



public void Myf(Form f)
{
Form f2 = f;
f2.ShowDialog();
}


فرم 2 ورودی می باشد. تو خود فرم یک باید فرم دورو بفرستی به ورودی.

mmd2009
سه شنبه 27 مهر 1389, 13:27 عصر
چون حتي اگه دوتا هم فرم بسازيم و فرم ارساليمونو بهش بديم باز به يك فرم اشاره مي كنن!!!


متوجه نشدیم.!!!

شما انتظار دارید یک فرم رو بفرستید به یک ورودی بعدش به 2 فرم دسترسی داشته باشید؟؟؟!

سوالتون رو بهتر بپرسید. انگار از صورت مسئله دور شدیم. :لبخندساده:

ali.rezaei7
سه شنبه 27 مهر 1389, 13:36 عصر
public void Myf(Form f)
{
Form f2 = f;
f2.ShowDialog();
}
کد درست است، ولی به این صورت:


Myf(new Form1());
اما این جوری امکان نداره:


Myf(this);
نمی شه که فرم رو در یک لحظه هم معمولی نمایش دهیم و هم showDialog! دوست که این تایپیک رو ایجاد کرده، می خواد از کلاس شی ارسال شده برای ساخت فرمش استفاده کنه.

ali.rezaei7
سه شنبه 27 مهر 1389, 13:57 عصر
می شه به من بفهمونید که نوشتن Form f2=f چه لزومی داره. این دوتا که یکی هستند. فرم جدیدی ایجاد نمی شه که.

mahboube
سه شنبه 27 مهر 1389, 14:08 عصر
فكر مي كنم بايد فرم رو به صورت ref بفرستيم!!!
نظرتون چيه؟
ببينيد من مي خوام خود فرم و نه شي اي از فرم فرستاده شه.!!!!سوالم واضحه ديگه!

ali.rezaei7
سه شنبه 27 مهر 1389, 14:33 عصر
تا اونجایی که من از این تایپیک سر در آوردم، ایشون(mahbube) می خوان یه فرمی رو بگیرن و از اون نوع فرم، فرم هایی رو تکثیر کنند. و بازم تا اونجایی که سواد من جواب می ده، کدهایی رو که شما(mmd2009) نوشتید، هیچ فرم جدید رو به وجود نمیاره. فکر می کنم راه حل من به جواب نزدیکتر باشه.

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 14:40 عصر
ببينيد من مي خوام خود فرم و نه شي اي از فرم فرستاده شه.!!!!سوالم واضحه ديگه!
به نظر من روشي ali.rezaei7 (http://barnamenevis.org/forum/member.php?u=130237) گفتند روش مناسبي به حساب مياد

Myf(new Form1());
ولي اگر اصرار بر اين داريد كه توي متد شي جديد درست كنيد ميتونيد از روش زير استفاده كنيد.

void MyMethod(Form f)
{
Type t = f.GetType();
Form f2 = (Form)t.GetConstructors()[0].Invoke(null);
f2.Show();
}
البته اين كد فقط براي حالتي به كار مياد كه بخوايد به يك درست كنيد. ولي بازم ميگم كه روش اول بهتره!!

mmd2009
سه شنبه 27 مهر 1389, 15:03 عصر
سلام Reza_Yarahmadi (http://www.barnamenevis.org/forum/member.php?u=97318)

الان کدی که من گفتم که فرقی با کد ali.rezaei7 (http://barnamenevis.org/forum/member.php?u=130237) داشت :



public void Myf(Form f)
{
Form f2 = f;
f2.ShowDialog();
}


در مورد این کد :



void MyMethod(Form f)
{
Type t = f.GetType();
Form f2 = (Form)t.GetConstructors()[0].Invoke(null);
f2.Show();
}


باز هم فرم ارسال نمیشه ...

ali.rezaei7
سه شنبه 27 مهر 1389, 15:12 عصر
کد من:


Public void CreateForm(Form f)
{
Form f2;
if(f is Form1)
f2=new form1();
elseif (f is Form2)
f2=new Form2();
else
f2=new Form3();
f2.Show();
}
کد شما:



public void Myf(Form f)
{
Form f2 = f;
f2.ShowDialog();
}
کد من کلاس فرم شی f رو پیدا می کنه و فرم جدید رو بر اساس اون تولید می کنه.f2=new
ولی در کد شما Form f2 = f باعث بوجود اومدن فرم جدیدی نمی شه

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 15:18 عصر
فرقشون از زمين تا آسمونه! :متعجب:
كد شما 2 نام به يك فضاست يعني f و f2 هيچ فرقي با هم ندارند هر تغييري روي f داده بشه روي f2 هم اعمال ميشه و بالعكس.
عملگر انتساب (=) فقط اشاره گر رو منتقل ميكنه نه كل شي رو. كلاسهايي كه از ICloneable ارث براي كرده باشند با متد Clone اونها ميشه شي جديدي با تمام خصوصيات شي اصلي درست كرد.

mmd2009
سه شنبه 27 مهر 1389, 15:40 عصر
به چی اشاره کردید و چی رو توضیح دادید ؟ :متفکر: این چیزی که توضیح دادید رو میدونیم مسئله چیزی هست که توضیح دادید.

شما داری میگی این کد :



Myf(new Form1());
و دارید اینو توضیح میدید :




Public void CreateForm(Form f)

من دارم در مورد این کد حرف میزنم که همین دوستمون هم اولش گفتن درسته #12 (http://www.barnamenevis.org/forum/showpost.php?p=1130587&postcount=12) با کدی که شما گفتید. در صورتی که هر دو کدی مشکل دارن یا حداقل برای من مشکل دارن هر دو .

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 16:01 عصر
این چیزی که توضیح دادید رو میدونیم مسئله چیزی هست که توضیح دادید.
كلي در مورد اين جمله فكر كردم ولي به نتيجه اي نرسيدم كه منظورتون چيه؟ :گیج:
كدي كه شما اول گذاشتيد 2 (http://barnamenevis.org/forum/showpost.php?p=1130491&postcount=2) به صورت زير استفاده كرديد.

Myform f = new Myform(this);
بعد در توي پست 5 (http://barnamenevis.org/forum/showpost.php?p=1130533&postcount=5) اينو گفتيد

public void Myf(Form f)
{
Form f2 = f;

MessageBox.Show(f.Name);
MessageBox.Show(f2.Name);

}
هيچ كجا هم روش استفاده از متد رو نگفتيد.
منم عرض كردن اگر به صورت زير صدا زده بشه روش مناسبتريه

Myf(new Form1());
توضيحاتي كه دادم برطبق روند صحبت هاي شما و دوستان و كدهايي بود كه رد و بدل شد

ali.rezaei7
سه شنبه 27 مهر 1389, 16:10 عصر
ولی قراره که فرم در داخل کلاس ساخته بشه اونم به تعداد متغیر.
روشی mmd2009 (http://barnamenevis.org/forum/member.php?u=115786) گفتند ، هیچ فرمی رو در داخل تابع بوجود نمیاره.
کسی که این تاپیک رو مطرح کرد، فکر می کنم که می خواست نوع فرم رو بگیره و داخل کلاس، از اون ایجاد کنه. دقیقا مثل کاری که من کردم.

mmd2009
سه شنبه 27 مهر 1389, 16:15 عصر
كلي در مورد اين جمله فكر كردم ولي به نتيجه اي نرسيدم كه منظورتون چيه؟ :گیج:
:لبخند::قهقهه:

خیلی اینو باحال گفتید. اینم دقیقا مثل ردوبدل شد حرفها بود.




هيچ كجا هم روش استفاده از متد رو نگفتيد.
چی؟ یعنی باید اینم بگیم. مگه خود شما گفتی روش استفاده از متد رو؟ (http://www.barnamenevis.org/forum/showpost.php?p=1130644&postcount=18) :لبخند:

ولی فکر کنم مشکل دوستمون حل شد.

درکی که من از این موضوع داشتم این بود که خیال کردم میخواد از دوتا ابجکت یک فرم رو کنترل بکنند. که فکر کنم درک اشتباهی بود.

اصلا دوست ندارم روش اشتباهی رو به کسی بگم و قصد توهین به کسی رو هم نداشتم و از جناب رضایی ( عاشق اوارتورم :قلب: ) اگر ناراحتی دارند معذرت میخوام :بوس:.

موفق باشید دوستان. فکر کنم دیگه بریم بشیم بخونیم برای کنکور :گریه:

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 16:30 عصر
کسی که این تاپیک رو مطرح کرد، فکر می کنم که می خواست نوع فرم رو بگیره و داخل کلاس، از اون ایجاد کنه. دقیقا مثل کاری که من کردم.
كدي كه شما داديد اگر 100 فرم داشته باشيم بايد به ازا هر كدوم شرط گذاشت
كدي كه mmd2009 گداشتند به اضافه روش استفاده اي كه شما گفتيد روش خوبيه.

مگه خود شما گفتی روش استفاده از متد رو؟ (http://www.barnamenevis.org/forum/showpost.php?p=1130644&postcount=18) :لبخند:
كدي كه من گذاشتم با هر 2 روش كار ميكنه و فرقي نميكنه چطور استفاده اس كنيد.

MyMethod(new Fomr2())
//OR
MyMethod(this)
به هر حال اين تاپيك هم به نتيجه رسيد ، خدا رو شكر! :لبخند:

hojjatshariffam
سه شنبه 27 مهر 1389, 21:19 عصر
به نظر من روشي ali.rezaei7 (http://barnamenevis.org/forum/member.php?u=130237) گفتند روش مناسبي به حساب مياد

Myf(new Form1()); ولي اگر اصرار بر اين داريد كه توي متد شي جديد درست كنيد ميتونيد از روش زير استفاده كنيد.

void MyMethod(Form f)
{
Type t = f.GetType();
Form f2 = (Form)t.GetConstructors()[0].Invoke(null);
f2.Show();
}البته اين كد فقط براي حالتي به كار مياد كه بخوايد به يك درست كنيد. ولي بازم ميگم كه روش اول بهتره!!
روش درست همینه که این دوستمون گفتند ، در واقه نوع باید استفاده بشه
منتها در این روش آبچکت پاس شده و نوعش برداشته شده و از اون نوع هر چند تا که بخوایم می تونیم انستنس کنیم ولی می تونیم به جای این خود TYPE رو پاس بدیم نه یک نمونه را

FastCode
چهارشنبه 28 مهر 1389, 06:37 صبح
خوشبختانه generic و dynamic اختراع شدن.

void DoVerb<T>(T Object) where T : new()
{
T NewObj = new T();
dynamic TRef = NewObj;
dynamic ObjRef = Object;
MessageBox.Show(TRef.Name);
MessageBox.Show(ObjREf.Name);
}

میلاد قاضی پور
چهارشنبه 28 مهر 1389, 07:05 صبح
خوشبختانه generic و dynamic اختراع شدن.

void DoVerb(T Object) where T : new()
{
T NewObj = new T();
dynamic TRef = NewObj;
dynamic ObjRef = Object;
MessageBox.Show(TRef.Name);
MessageBox.Show(ObjREf.Name);
}
یعنی دونه دونه پستهارو خوندم و متعجب از اینکه چرا کسی ننوشته از جنریک استفاده کنید . اسلحمو گذاشته بودم رو شقایقم که شما از راه رسیدی . :لبخندساده:

روشی که دوستمون از طریق reflection ها گفتن هم صحیح هست .