PDA

View Full Version : سوال: چه مدلی میشه یک فرم ویندوزی رو پس از باز شدن فرم بعدی بستش؟



hooman2usa
جمعه 04 فروردین 1391, 13:04 عصر
سلام سال نو مبارک
چه مدلی میشه یک فرم ویندوزی رو پس از باز شدن فرم بعدی بستش؟
من واسه باز و بستن فرم از این روش استفاده میکنم البته فقط باز شدنش کار میکنه و بستنش نه!


Form mainform = new MainForm();
Form showmail = new Showmail();
showmail .Show();
mainform.Close();

m.bibjan
جمعه 04 فروردین 1391, 14:39 عصر
frmmain.ActiveForm.Hide();
frm1 form1 = new frm1();
form1.Show();
اگه بخوای فرم قبلی رو ببندی بین فرم یک و appliction یه ارتباط باید برقرار بشه.وگرنه منطقی به نظر نمیرسه.البته سوال منم هست چطوری میشه توی این کد بجای Hide از close استفاده بشه.

رافعی مهدی
جمعه 04 فروردین 1391, 15:55 عصر
سلام
کار سختی نیست. ولی اگه بیشتر توضیح میدادید که بین این دو فرم و برنامه (Application) چه ارتباطی وجود داره، دقیق تر میشد راهنمایی کرد. با این حال، من یک فرض رو در نظر میگیرم و بر مبنای اون توضیح میدهم:

مثال: فرض کنیم شما یک فرم اصلی در برنامه دارید که میخواهید توسط یک فرم دیگر به آن وارد شوید. مثلاً فرم اصلی رو frmMain و فرم واسط رو frmLogin مینامیم. در این حالت برنامه با instance ای از کلاس فرم اصلی آغاز میشود:


Application.Run(new frmMain());
به این ترتیب ارتباط میان فرم اصلی و برنامه هیچ وقت (تا زمانی که این فرم Dispose گردد) قطع نمیشود.

همانطور که میدانید هنگامی که یک instance از فرم میخواهد ساخته شود، Constructor آن فراخوانی میشود. البته متد Run بعد از دریافت نمونه ساخته شده از فرم، آن را نمایش میدهد. بنابراین بعد از Constructor، رخداد Load به وقوع میپیوندد و بعد از آن رخداد Shown. در زمان اتفاق افتادن رخداد Load و تا پایان آن هنوز فرم به نمایش در نیامده است. لذا یک روش این است که در همینجا، فرم دیگر را ساخته و نمایش دهید:


private void frmMain_Load(object sender, EventArgs e)
{
using (frmLogin loginForm = new frmLogin())
{
loginForm.ShowDialog();
}
}

طبیعتاً در این مثال نیاز داریم که بدانیم آیا کاربر اجازه ورود به فرم اصلی را دارد یا نه. فرض کنیم این موضوع با مقدار دهی OK به عنوان نتیجه نمایش فرم Login در نظر گرفته شده باشد. بنابراین ابتدا پراپرتی CanLogin را برای دریافت مقدار متناظر با این موضوع تعریف میکنیم:


internal bool CanLogin
{
get;
set;
}

اکنون داریم:


private void frmMain_Load(object sender, EventArgs e)
{
using (frmLogin loginForm = new frmLogin())
{
if (loginForm.ShowDialog() == DialogResult.OK)
{
CanLogin = true;
}
}
}

حال نوبت به تصمیم گیری در مورد نمایش فرم اصلی میرسد. با خروج از Scope دستور using، مطمئناً resource موجود در آن (در اینجا frmLogin) نیز به کلی Dispose و توسط GarbageCollector پاک سازی میشود و به این ترتیب هیچ گونه نگرانی در مورد Memory Leakage باقی نمی ماند. پس با پایان یافتن رخداد Load ، باید منتظر وقوع رخداد Shown بود. داریم:


private void frmMain_Shown(object sender, EventArgs e)
{
if (!CanLogin)
{
this.Close();
}
}

البته قطعاً برای پاسخ گویی به سوال شما فرض های دیگری هم میتوانستیم در نظر بگیریم. مثلاً یک فرم اصلی مخفی داشته باشیم که باز و بسته شدن دو فرم دیگر را مدیریت کند و ...

موفق باشید.

hooman2usa
جمعه 04 فروردین 1391, 20:56 عصر
تشکر از دوستان عزیز و جوابهای خوبشون
دوستان مشکل بنده حل شد با راهنمایی های خوبتون
یه سوال دیگه دارم و اون اینکه سایز فرم فیکس باشه و موقع اجرا نشه اونرو تغییر داد همچنین مکانش هم مثلا مرکز صفحه باشه یا قسمتی از اسکرین باشه و کاربر نتونه جابجاش کنه
دمتون گرم.

Ali0Boy
جمعه 04 فروردین 1391, 21:08 عصر
من فکر می کنم ساده ترین راه اینه که FormBorderStyle را برابر none قرار بدهی و بعد در startposition مکان رو مشخص کنی و بعد با ویژگی size اندازه رو بدی حل می شود. البته اگر بخواهی مثلا فرم از بالا 100px فاصله داشته باشد باید مقدار top فرم مورد نظر رو به هر اندازه که می خواهی بدهی و از سمت چپ هم left که در ویژگی location موجود می باشد.