PDA

View Full Version : نحوه دسترسی به نمونه فرم اصلی



barnamenevis300
دوشنبه 09 مرداد 1391, 22:58 عصر
برای اجرای فرم اصلی از دستور application.run استفاده میشه. من میخام بدونم چطور میتونم از یک کلاس دیگه به این نمونه از فرم اصلی دسترسی داشته باشم؟

the king
سه شنبه 10 مرداد 1391, 00:20 صبح
برای اجرای فرم اصلی از دستور application.run استفاده میشه. من میخام بدونم چطور میتونم از یک کلاس دیگه به این نمونه از فرم اصلی دسترسی داشته باشم؟

Form1 f1 = (Form1)Application.OpenForms["Form1"];

barnamenevis300
سه شنبه 10 مرداد 1391, 02:42 صبح
این دستور رو آزمایش کردم و جواب هم گرفتم ولی چند تا سوال:
(Form1) کار این دستور چیه؟

بعد در اینجا یه نمونه به اسم f1 جدید ایجاد میشه، حالا چطور تغییر در این نمونه باعث تغییر در نمونه اصلی فرم میشه که توست application.run ایجاد شده؟

mmd2009
سه شنبه 10 مرداد 1391, 05:14 صبح
با سلام

این چیزی که دوستمون گفتن عمل Cast هست. شما میتونید به دو صورت غمل cast رو انجام بدید. یکی رو که دوستمون اشاره کردن و دیگری هم به صورت Safely هستش یعنی به این صورت :

Form f1 = Application.OpenForms["Form1"] as Form1;

این عمل به صورت By Ref انجام میشه ، پس روی نمونه ی اصلی تاثیر گذار هست.

موفق باشید.

barnamenevis300
سه شنبه 10 مرداد 1391, 07:45 صبح
برای اینکهby refانجام نشه باید چکار کرد؟ من مفهوم by ref رو فقط در مورد ارسال پارامتر به تابع ها بلد هستم در اینمورد بلد نیستم.

the king
پنج شنبه 12 مرداد 1391, 04:23 صبح
برای اینکهby refانجام نشه باید چکار کرد؟ من مفهوم by ref رو فقط در مورد ارسال پارامتر به تابع ها بلد هستم در اینمورد بلد نیستم.

نباید کاری کنید که By Reference نشه، شما به این by ref شدن نیاز دارید.
شما همان نمونه ای از فرم را می خواهید که باز است، اگر By Value بشه یک نمونه دیگه میشه که از نظر مشخصات شبیه اون فرم باز هست
اما اون نیست. وقتی By Reference باشه دقیقا همان فرم باز را تحویل می گیرید.

barnamenevis300
پنج شنبه 12 مرداد 1391, 14:51 عصر
من میخاستم بدونم کجای این دستور میگه که این دستور از نوع by ref هست؟ معادل غیر by ref همین دستور چطور میشه؟

the king
پنج شنبه 12 مرداد 1391, 15:30 عصر
من میخاستم بدونم کجای این دستور میگه که این دستور از نوع by ref هست؟ معادل غیر by ref همین دستور چطور میشه؟
کلاس ها کلا By Reference منتقل می شوند مگر اینکه از new یا Clone یا متدی یا تبدیل نوع داده ای با قابلیت های مشابه ایندو استفاده بشه.

هر شیء ای رو هم نمیشه صرفا با یک دستور بصورت By Value کپی کرد، معمولا کلاس هایی چنین قابلیتی رو دارند که اینترفیس ICloneable رو دارند و متد Clone
رو پشتیبانی می کنند، Form ها جزو این کلاس ها نیستند. میشه با کپی کردن محتویات همه فیلد هایش همچین کاری کرد اما با یکی دو دستور، نه.

barnamenevis300
پنج شنبه 12 مرداد 1391, 17:43 عصر
Form1 f1 = (Form1)Application.OpenForms["Form1"];

در همین دستور آیا OpenForms آرایه محسوب میشه؟ اگه بله چرا اندیس این آرایه یک رشته هست؟ من از object browser رفتم دیدم openForms یک نمونه از یک کلاس دیگه هست در application که به صورت آرایه در اونجا اعلان نشده بود! چطور اینجا به صورت آرایه ازش استفاده شده؟

the king
پنج شنبه 12 مرداد 1391, 22:16 عصر
آرایه نیست، Collection ئه، Collection ها مجهز تر از یک آرایه ساده هستند، شبیه به List ها. شما نمی توانید طول آرایه را به سادگی تغییر دهید،
بهش عضو اضافه کنید یا ازش عضو حذف کنید،اما Collection ها این قابلیت رو دارند. اینکه یک کلاسی یا شیء ای اندیس پذیر باشه
(حالا چه با اسم و چه شماره) صرفا خاصیت آرایه نیست، شما می توانید خودتان یک کلاسی بسازید که این قابلیت رو داشته باشه اما در اساس
اصلا آرایه ای نباشه. تصور نکنید که اگه یک کلاسی index داشت یا بر اندیس اش بر اساس نام هم عمل می کرد حتما آرایه است،
ممکن است در پشت پرده اصلا نه آرایه ای در کار باشند و نه لیستی.

یک مثال ساده می زنم، در کلاس زیر اندیس های 0 و 1 و 2 قابل استفاده هستند که مقدار یک رنگ را بر می گردانند، اما خود کلاس اصلا حالت آرایه ای یا Collection رو نداره
و اساس ربطی هم به رنگ نداشته :

class Class1
{
public System.Drawing.Color this[int index]
{
get
{
switch (index)
{
case 0:
return System.Drawing.Color.Red;
case 1:
return System.Drawing.Color.Blue;
case 2:
return System.Drawing.Color.Green;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}


فرضا الان خانه اندیس 1 اش خوانده شده، در حالی که ظاهرا این اصلا آرایه نبوده :

private void Form1_Load(object sender, EventArgs e)
{
Class1 c1 = new Class1();
Color a = c1[1];
}