PDA

View Full Version : مشکل با eventhandler ها (disposed)



ariyanna
چهارشنبه 23 اردیبهشت 1388, 22:49 عصر
سلام به همه ی استادان من با disposed Enventhandler مشکل دارم کد من به این صورت هستش :

.
.
.
MainForm mainfrm = new MainForm();
mainfrm.Show();
this.Visible = false;
mainfrm.Disposed += new EventHandler(mainfrm_Disposed);
}

void mainfrm_Disposed(object sender, EventArgs e)
{
this.Visible = true;
throw new Exception("The method or operation is not implemented.");
}

به این ترتیب که من می خوام وقتی که فورم جدیدم ( mainfrm ) بسته شد فورم قبلیم (که خاصیت visible اش false شده رو دوباره نمایش بدم) و خاصیت visible اش رو true کنم ...
اما درعمل بجای اینکه بعد از اینکه وارد تابع mainfrm_disposed شدیم عبارت this.visible=true اجرا بشه این عمل اتفاق نمی یوفته و یک exception رخ می ده ...
دلیل این exception هم این هستش که می گه :

this Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away.

به نظر شما اشکال کجاست ؟ پیشاپیش ممنونم از جواباتون :لبخندساده:

ariyanna
چهارشنبه 23 اردیبهشت 1388, 23:04 عصر
البته دوستان من متوجه شدم که شاید مشکل از اینجا ناشی می شه که وقتی که دستور this.visible در تابع mainfrm_disposed اجرا می شه این this دیگه به فورم قبلی من اشاره نمی کنه و به فورم dispose شده ی من اشاره می کنه ... خب حالا سوال اینجاست : حالا که من نمی تونم از this استفاده کنم پس چطوری visible فورم قبلیم و true کنم ؟
از تعریف بوسیله new هم که نمی شه استفاده کرد چون new یک شی جدید می سازه ، و در نتیجه یک فورم جدید از صفحه ی قبلم نمایش داده می شه در حالی که فورم اصلی (که visible اش false شده) همانطور باقی می مونه !!!
حالا من باید چکار کنم ؟

hsmfaridmehr
پنج شنبه 24 اردیبهشت 1388, 00:53 صبح
این کارو انجام بده

برای فرم دوم



publicpartialclassForm2 : Form
{
privateForm frmPre;
public Form2()
{
InitializeComponent();
}
public Form2(Form frm)
{
frmPre = frm;
InitializeComponent();
}
privatevoid Form2_FormClosed(object sender, FormClosedEventArgs e)
{
frmPre.Visible = true;
}


برای فرم اول



publicpartialclassForm1 : Form
{
public Form1()
{
InitializeComponent();
}
privatevoid button1_Click(object sender, EventArgs e)
{
this.Visible = false;
Form2 frm2 = newForm2(this);
frm2.Show();
}
}

prankster
پنج شنبه 24 اردیبهشت 1388, 00:54 صبح
وقتی که دستور this.visible در تابع mainfrm_disposed اجرا می شه این this دیگه به فورم قبلی من اشاره نمی کنه و به فورم dispose شده ی من اشاره می کنه

این گفته صحیح نیست! در کلیه متد های تعریف شده در بدنه کلاس this به instance کلاس جاری اشاره می کندو

به نظر می رسد مشکل فقط مربوط به محیط debug باشد. آیا در exe نهایی exception رخ می دهد؟
می توانید optimization را هنگام debug غیر فعال کنید، احتمالا مشکل زمان debug حل خواهد شد، این کار از طریق ایجاد فایل ini تنظیمات JIT قابل اجرا است:
http://msdn.microsoft.com/en-us/library/9dd8z24x.aspx

در ضمن برای Visible شدن فرم قبلی، وقفه FormClosing را پیشنهاد می کنم

ariyanna
پنج شنبه 24 اردیبهشت 1388, 19:57 عصر
با سلام ، آقای hsmfaridmehr (http://www.barnamenevis.org/forum/member.php?u=94097) ممنون از اینکه زحمت کشیدید اما کدتون کار نمی کنه و جواب نمی ده
آقای prankster (http://www.barnamenevis.org/forum/member.php?u=99289) می تونین بگین که وقفه ی fromClosing جطوری استفاده کنم ؟ من ازاین وقفه اینطوری استفاده کردم اما نشد :

this.Visible = false;
MainForm mainfrm = new MainForm();
mainfrm.Show(this);
mainfrm.FormClosed += new FormClosedEventHandler(mainfrm_FormClosed);
}

void mainfrm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Visible = true;
throw new Exception("The method or operation is not implemented.");
}
exception می ده !

hsmfaridmehr
پنج شنبه 24 اردیبهشت 1388, 21:28 عصر
قبلا امتحان شده و جواب داده احتمالا چیزی رو اشتباه نوشتی

ariyanna
پنج شنبه 24 اردیبهشت 1388, 21:58 عصر
درسته حق با شماست من مشکلم حل شد .... ممنونم از شمادوست خوبم