PDA

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



ali_autumnal
دوشنبه 29 شهریور 1389, 22:22 عصر
با سلام

غالبا اگر بخواهم فرمی رو close کنم و فرم بعدی رو فراخوانی کنم از این کد استفاده میکنم:



this.Hide();
Form2 f = new Form2();
f.ShowDialog();
this.Close();


همیشه این کد منو به شک مینداخت که آیا فرم 1 بسته شد یا!!؟؟؟
در حالی که همیشه معتقد بودم نه فرم 1 بسته نشده و فقط hide شده اما خودم را با کدهای اکثر دوستان قانع میکردم که این روش واقعا درسته!!!!!!!!!!!!!!!

دیشب داشتم برنامه ای مینوشتم که یه پروسه زمان بری مشغول به کار بود. لازم بود فرم 1 در همان لحظه بسته بشه و فرم 2 اجرا بشه. وقتی دستور بالا رو نوشتم سرعت برنامه به طرز افتضاحی کاسته شد.!!!!!!!!!!

اونجا بود که گفتم نه واقعا کد بالا فقط فرم رو hide میکنه. روش اصولی بستن فرم نیست.
گشتم و کد زیر رو پیدا کردم.

این تکه کد دقیقا فرم 1 رو همون لحظه می بنده و فرم 2 مجددا اجرا میشه.



private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread mythread = new System.Threading.Thread(new System.Threading.ThreadStart(OpenNewFrom));
mythread.Start();
this.Close();

}
public static void OpenNewFrom()
{

Application.Run(new Form2 ());//Create an instance of your new form. No need to call show method.
}
}


منبع:
http://www.dotnetspider.com/forum/231115-How-close-Form-from-Form-C-windows-Application.aspx

خواستم نظر دوستای دیگم رو بدونم؟
موفق باشید.

mehrsa_fr
دوشنبه 29 شهریور 1389, 22:48 عصر
this.Hide();
Form2 f = new Form2();
f.ShowDialog();
this.Close();

این کد مشکلی نداره درسته ولی وقتی شما showdialog می کنید تا فرم بسه نشه خط بعدی اجرا نمیشه اگه این کد استفاده کنی این مشکلم حل میشه



Form2 f = new Form2();
f.Show();
Close();


استفاده از thread ممکنه تو cpu تک هسته ای سرعت پایین بیاره چون زمان کار cpu تقسیم میکنه به نظر من پایین اومدن سرعت اون کامپیوتر ممکنه از جایی دیگه ای باشه

ali_autumnal
دوشنبه 29 شهریور 1389, 22:57 عصر
this.Hide();
Form2 f = new Form2();
f.ShowDialog();
this.Close();
این کد مشکلی نداره درسته ولی وقتی شما showdialog می کنید تا فرم بسه نشه خط بعدی اجرا نمیشه اگه این کد استفاده کنی این مشکلم حل میشه



Form2 f = new Form2();
f.Show();
Close();
استفاده از thread ممکنه تو cpu تک هسته ای سرعت پایین بیاره چون زمان کار cpu تقسیم میکنه به نظر من پایین اومدن سرعت کامپیوتر ممکنه از جایی دیگه ای باشه

دوست عزیز میدم showdialog نمیذاره خط بعدی اجرا بشه.

اما شما تا بحال از کدی که نوشتید استفاده کردید؟
میدونید فرم 2 هرگز show نخواهد شد!!!!!!!!! چون دستور close بقدری سریع اجرا میشه که تا فرم 2 اجرا بشه اون دستور اجرا میشه و برنامه کلا بسته میشه!!!!!!

موفق باشی

mehrsa_fr
دوشنبه 29 شهریور 1389, 23:02 عصر
مگه میشه استفاده نکرده باشم و بگم :متعجب:من تا حالا فقط از این روش استفاده میکردم برنامه ام بسته نمیشد
کد ها به ترتیب اجرا میشن منم تا حالا همچین مشکلی باهاش نداشتم

ali_autumnal
دوشنبه 29 شهریور 1389, 23:09 عصر
مگه میشه استفاده نکرده باشم و بگم :متعجب:من تا حالا فقط از این روش استفاده میکردم برنامه ام بسته نمیشد
کد ها به ترتیب اجرا میشن منم تا حالا همچین مشکلی باهاش نداشتم

یا سرعت کامپیوتر من خیلی بالاست یا سرعت کامپیوتر شما...

همین الان تست کن.
یه پروژه درست کن هیچی توش نباشه جز 2 تا فرم. به این روشی که فرمودید عمل کنید.

هرگز نمیزاره فرم 2 اجرا بشه!

mehrsa_fr
دوشنبه 29 شهریور 1389, 23:14 عصر
این پروژه دانلود کنید و تست کنید رو دستگاه من که مشکلی نداشت

ali_autumnal
دوشنبه 29 شهریور 1389, 23:20 عصر
این پروژه دانلود کنید و تست کنید رو دستگاه من که مشکلی نداشت

دوست عزیز در این روش شما همیشه یه فرم Main در حال اجرا دارید.

تو این روش اگه بخواهید فرم Main رو ببندید به مشکلی که من گفتم بر میخورید.
در برنامه هایی که در هر لحظه فقط یه فرم در حال اجرا باشه کد شما جواب نمیده.

mehrsa_fr
دوشنبه 29 شهریور 1389, 23:25 عصر
بله شما فرمی که main هستو هر وقت close کنید برنامه بسته میشه چه بعدش فرم باز کنید چه نکنید شما با کد بالا در حقیقت انگار یه برنامه دیگه با این کارتون باز کردید

ali_autumnal
دوشنبه 29 شهریور 1389, 23:32 عصر
بله شما فرمی که main هستو هر وقت close کنید برنامه بسته میشه چه بعدش فرم باز کنید چه نکنید شما با کد بالا در حقیقت انگار یه برنامه دیگه با این کارتون باز کردید

شما روش دیگه ای برای بستن فرم main دارید؟

من 10 فرم دارم و نیاز دارم بعضی وقت ها فقط یه فرم ام لود بشه.

یا برنامه ای داریم اول فرم load اون اجرا میشه و بعد فرم login و بعد فرم main چه راه حلی پیشنهاد می کنید؟

موفق باشید
علی پاییزی

mehrsa_fr
دوشنبه 29 شهریور 1389, 23:38 عصر
شما روش دیگه ای برای بستن فرم main دارید؟

من 10 فرم دارم و نیاز دارم بعضی وقت ها فقط یه فرم ام لود بشه.

یا برنامه ای داریم اول فرم load اون اجرا میشه و بعد فرم login و بعد فرم main چه راه حلی پیشنهاد می کنید؟

موفق باشید
علی پاییزی

ببینید شما برنامه رو میبندید و یه برنامه دیگه باز میکنید که این دفعه یه فرم دیگه برای شما نشون میده این کار اصلا اصولی نیست شما میتونید فرم اصلی hide کنید و هر وقت دوباره بهش احتیاج داشتید دوباره show کنید
باز اگه بقیه دوستان هم اگه نظری دارند بگن شاید به نتیجه ای برسیم

ali_autumnal
دوشنبه 29 شهریور 1389, 23:49 عصر
ببینید شما برنامه رو میبندید و یه برنامه دیگه باز میکنید که این دفعه یه فرم دیگه برای شما نشون میده این کار اصلا اصولی نیست شما میتونید فرم اصلی hide کنید و هر وقت دوباره بهش احتیاج داشتید دوباره show کنید
باز اگه بقیه دوستان هم اگه نظری دارند بگن شاید به نتیجه ای برسیم

من نگفتم این روش عالیه و یا اصولی!!

سوال من این بود روش اصولی بستن فرم ها و فراخوانی فرم های دیگر و در آخر هم نوشتم که منتظر نظرات دیگر دوستان هستم.


در ثانی وقتی من با فرم load یا login کاری ندارم جز اینکه فقط یکبار اجرا شدن برای چی اونها رو hide کنم که فضایی از حافظه رو اشغال کنند؟

یا اگه بخوام فرم Main رو ببندم و دوباره باز کنم اما با تغییراتی که تو setting دادم اجرا بشه. اون موقع چی؟

manij_mhm
دوشنبه 29 شهریور 1389, 23:51 عصر
دوست عزیز میدم showdialog نمیذاره خط بعدی اجرا بشه.

اما شما تا بحال از کدی که نوشتید استفاده کردید؟
میدونید فرم 2 هرگز show نخواهد شد!!!!!!!!! چون دستور close بقدری سریع اجرا میشه که تا فرم 2 اجرا بشه اون دستور اجرا میشه و برنامه کلا بسته میشه!!!!!!

کد دوستمون درسته.
فقط شما قبل از اینکه فرم رو close کنید hide می کردید و اصلا close اجرا نمی شده.

موفق باشید.

mehrsa_fr
دوشنبه 29 شهریور 1389, 23:54 عصر
اگه شما میخواید login کنید میتونید اول فرم main بگید showdialog بشه اگه colse بشه که بقیه کدای main اجرا میشن وگرنه که برنامه همین طور میمونه
من برای سوال دومتون روش به خصوصی ندارم اگه بخوام اینکارو بکنم از applicatin.restart استفاده میکنم یا از همون روش شما که گفتید

ali_autumnal
دوشنبه 29 شهریور 1389, 23:57 عصر
کد دوستمون درسته.
فقط شما قبل از اینکه فرم رو close کنید hide می کردید و اصلا close اجرا نمی شده.

موفق باشید.

خواهشن پست هارو دقیق بخونید بیایید پایین بعد پاسخ بدید.
--------------------

اگه شما میخواید login کنید میتونید اول فرم main بگید showdialog بشه اگه colse بشه که بقیه کدای main اجرا میشن وگرنه که برنامه همین طور میمونه
من برای سوال دومتون روش به خصوصی ندارم اگه بخوام اینکارو بکنم از applicatin.restart استفاده میکنم یا از همون روش شما که گفتید

من نمیخوام فرم main بی جهت لود بشه. ترتیب مهمه واسم. زیبایی برنامه ازبین میره.

mehrsa_fr
سه شنبه 30 شهریور 1389, 00:07 صبح
در هر صورت باید یه فرم یا باز باشه یا hide تا برنامه بسته نشه بعد میشه رفت سر بقیه چیز ها بحث کرد که مثلا قبل از showdialog کردن که تو خوده main فرمو hide کنی که ترتیب و زیبایی از بین نره

ali_autumnal
سه شنبه 30 شهریور 1389, 00:17 صبح
در هر صورت باید یه فرم یا باز باشه یا hide تا برنامه بسته نشه بعد میشه رفت سر بقیه چیز ها بحث کرد که مثلا قبل از showdialog کردن که تو خوده main فرمو hide کنی که ترتیب و زیبایی از بین نره

یه برنامه داریم که فقط 2تا فرم داره. هر یک از فرم ها حکم فرم Main رو داره. پروسه ها و پردازش های سنگینی در هریک در حال اجراست. آیا جهت رفتن از فرم 1 به فرم 2 مجبور به استفاده کردن از روش hide هستیم؟ نمیشه close کنیم خلاص بشیم از دست اون؟

mehrsa_fr
سه شنبه 30 شهریور 1389, 00:32 صبح
ببینید تو Program.cs یه خط کد هست که هر وقت برنامه شما باز شد اول اون فرم رو نشون میده
Application.Run(newForm1());
شما هر وقت این فرمو ببندید برنامه به طور کامل بسته میشه چه شما 2 تا فرم داشته باشید که بخواید برید فرم 2 و قبلی ببندید چه 100تا
--------------------

یه برنامه داریم که فقط 2تا فرم داره. هر یک از فرم ها حکم فرم Main رو داره. پروسه ها و پردازش های سنگینی در هریک در حال اجراست. آیا جهت رفتن از فرم 1 به فرم 2 مجبور به استفاده کردن از روش hide هستیم؟ نمیشه close کنیم خلاص بشیم از دست اون؟
تویه فرم یک یه thread بزار که این پردازش هارو انجام بده اگه رفت فرم 2 اون thread غیر فعال کن یا ببندش

ali_autumnal
سه شنبه 30 شهریور 1389, 00:44 صبح
تویه فرم یک یه thread بزار که این پردازش هارو انجام بده اگه رفت فرم 2 اون thread غیر فعال کن یا ببندش


لطفا بیشتر توضیح دهید. حتی الامکان با ذکر مثال.

mmd2009
سه شنبه 30 شهریور 1389, 00:47 صبح
با سلام.

دوستانی که میگن hide کنید چرا hide کنیم؟؟؟؟ من نمی گم کد این دوستمون درسته ( ولی درسته ) ولی حداقل این خوبی رو داره که فرمی که دیگه بهش نیازی نداریم دیگه در کار نیست و حذف نمیشه و فضایی رو در بر نمی گیره. من این مثال رو چند هفته پیش تو سایت خودم زدم که به نظر من این روش از hide کردن بهتره

mehrsa_fr
سه شنبه 30 شهریور 1389, 00:57 صبح
لطفا بیشتر توضیح دهید. حتی الامکان با ذکر مثال.
اینم یه مثال اگه جاییشو مشکل داشتی بپرس
البته باید یکم با اصول thread اشنا باشید

mehrsa_fr
سه شنبه 30 شهریور 1389, 01:00 صبح
دوستانی که میگن hide کنید چرا hide کنیم؟؟؟؟
والا من از اول این تاپتیک داشتم می گفتم چرا hide کنیم از اون روش اول استفاده نکنید دیگه نمیتونم تکرار کنم

ali_autumnal
سه شنبه 30 شهریور 1389, 11:29 صبح
نظر دیگه ای پیشنهادی نیست؟

mhdhp86
یک شنبه 16 بهمن 1390, 17:38 عصر
ما بالاخره از کدوم استفاده کنیم؟!!!

majidrezaei2007
دوشنبه 17 بهمن 1390, 00:07 صبح
مهرسا : کد شما خرابه ، چون برنامه رو کلا میبنده

اگه تردینگ بلد باشی که کار علی جان خیلی قشنگه اما کاره دیگه و سریعتر و کم حافظه تر به نظر من استفاده از اشاره گرهاست . طوری که توی فرم دوم یک اشاره گر عمومی ایستا از جنس فرم اول داشته باشیم . سپس وقتی می خوایم فرم اول رو ببندیم ، اشاره گر اون فرم دوم رو برابر با آدرس فرم اول می کنیم . سپس فرم دوم رو نشون میدیم و توی فرم لود فرم دوم ، از طریق اشاره گری که داریم به آدرس فرم اول ، متد Close اونو اجرا میکنیم . اینطوری دقیقا زمانی که فرم دوم باز میشه ، فرم اول کاملا بسته میشه . اینکار فقط یک اشاره گر 2 بایتی می خواد و از نظر حافظه هم خیلی بهینه تره .

b.saminjad
دوشنبه 17 بهمن 1390, 10:56 صبح
سلام به همه دوستان




مخفی کردن فرم اصلی دو اثر بد داره:



اول بار اضافی بر رم(شاید در فرمهای ساده به نظر نرسه ولی در فرمهای بزرگ شاید حیاتی باشه واسه)



دوم اگه فرم اصلی مخفی بشه با بستن فرم جاری برنامه از رم خارج نمیشه و باید حتما فرم اصلی بسته بشه








راه حل من



برای فرم لود از نخ استفاده بشه و برای فرم لاگین هم فرم اصلی رو مخفی کرده پس از اتمام کار فرم



لاگین به برنامه (فرم اصلی)برگردیم و فرم لاگینو می بندیم





مزایا :





کنترل برنامه دست فرم اصلیه



فرم اضافی در رم نداریم





دوستان اینهایی که گفتم رو به صورت یک نمونه در برنامه زیر گذاشتم

b.saminjad
پنج شنبه 20 بهمن 1390, 19:15 عصر
گاهی اوقات پیش میاد که نمیخایم با بستن فرم اصلی برنامه بسته نشه (منظور اولین فرمی است که نمایش داده نمیشه)
رو پروژه راست کلیک کرده و properties را انتخاب کنبد سپس گزینه application را انتخاب
کنبد در قسمت پایین اون گزینه shutdown mode را برروی when last form closed قرار دهید

چون بنده این تاپیک (ترفندهای......) رو در تالار vb.net هم ایجاد کردم نوشته هارو کپی کردم و این نکته بالا فقط مربوط به vb.net است اگه باعث گمراهی شما شد معذرت میخام

برنامه ای که در همین تاپیک ضمیمه کردم رو دانلود کن نگاهی بهش بنداز فک کنم راه حل خوبی باشه

rqreza3409
شنبه 05 فروردین 1396, 12:25 عصر
با سلام

غالبا اگر بخواهم فرمی رو close کنم و فرم بعدی رو فراخوانی کنم از این کد استفاده میکنم:



this.Hide();
Form2 f = new Form2();
f.ShowDialog();
this.Close();


همیشه این کد منو به شک مینداخت که آیا فرم 1 بسته شد یا!!؟؟؟
در حالی که همیشه معتقد بودم نه فرم 1 بسته نشده و فقط hide شده اما خودم را با کدهای اکثر دوستان قانع میکردم که این روش واقعا درسته!!!!!!!!!!!!!!!

دیشب داشتم برنامه ای مینوشتم که یه پروسه زمان بری مشغول به کار بود. لازم بود فرم 1 در همان لحظه بسته بشه و فرم 2 اجرا بشه. وقتی دستور بالا رو نوشتم سرعت برنامه به طرز افتضاحی کاسته شد.!!!!!!!!!!

اونجا بود که گفتم نه واقعا کد بالا فقط فرم رو hide میکنه. روش اصولی بستن فرم نیست.
گشتم و کد زیر رو پیدا کردم.

این تکه کد دقیقا فرم 1 رو همون لحظه می بنده و فرم 2 مجددا اجرا میشه.



private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread mythread = new System.Threading.Thread(new System.Threading.ThreadStart(OpenNewFrom));
mythread.Start();
this.Close();

}
public static void OpenNewFrom()
{

Application.Run(new Form2 ());//Create an instance of your new form. No need to call show method.
}
}


منبع:
http://www.dotnetspider.com/forum/231115-How-close-Form-from-Form-C-windows-Application.aspx

خواستم نظر دوستای دیگم رو بدونم؟
موفق باشید.





ممنون از شما دوست عزیز کاملا درسته با این کد فرم دوم به عنوان فرم اصلی معرفی میکنه و فرم یکو میبنده

mvmproject
دوشنبه 07 فروردین 1396, 09:33 صبح
میشد تو فرم بعدی این کارو انجام داد

Application.OpenForms["splash"].Close();

semiem
دوشنبه 30 اردیبهشت 1398, 14:03 عصر
من این کد رو امتحان کردم اوکیه ، چون وقتی فرم های قبلی باز میشد . در build کردن دفعات بعدی خطا میداد ، که در کد های قبلی که تست کردم این مشکل بود مخصوصا وقتی hide میکنی ولی این کد اوکی هست برای سوییچ کردن بین کد ها
:تشویق:
System.Threading.Thread mythread = new System.Threading.Thread(new System.Threading.ThreadStart(OpenMain));
mythread.Start();
this.Close();

public static void OpenMain()
{


Application.Run(new mainFrm());//Create an instance of your new form. No need to call show method.
}

barnamenevispro
شنبه 17 آبان 1399, 00:04 صبح
سلام دوستان
البته من روش بهتری دارم که نه نیازی به Hide کردن داره و نه بخواد نخ بزنی.

شما اول بیاید فرم اصلی رو مین کنید.( Application.Run(new formmain());)

حالا توی لود formmain این کد رو بزنید تا فقط یکبار با حلقه for اجرا بشه



for(int i = 1; i < 2; i++)
{
this.Hide();
new loginform().ShowDialog();
}
this.Show();



خب حالا تو فرم لاگین توی اون قسمت از شرط که نام کاربری و رمز عبور درست بود نتیجه رو بزنید: this.Close();

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

mr.sirwan
شنبه 17 آبان 1399, 00:51 صبح
سلام دوستان
البته من روش بهتری دارم که نه نیازی به Hide کردن داره و نه بخواد نخ بزنی.

شما اول بیاید فرم اصلی رو مین کنید.( Application.Run(new formmain());)

حالا توی لود formmain این کد رو بزنید تا فقط یکبار با حلقه for اجرا بشه



for(int i = 1; i < 2; i++)
{
this.Hide();
new loginform().ShowDialog();
}
this.Show();



خب حالا تو فرم لاگین توی اون قسمت از شرط که نام کاربری و رمز عبور درست بود نتیجه رو بزنید: this.Close();

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


اگه طرف بدون اینکه یوزر و پسورد رو وارد کنه فرم لاگین رو ببنده که همینجوری فرم اصلی نمایش داده میشه و بهش خوشامد میگی
و اینکه اصلا نقش اون حلقه for چیه؟