PDA

View Full Version : محدود كردن اجراي دوباره يك فرم



daneshjo90
سه شنبه 03 مرداد 1391, 09:58 صبح
سلام
بنده برنامه اي نوشتم كه داراي چندين فرم هست كه خاصيت فرزند پدري دارند

بنده ميخوام وقتي فرمي رو اجرا كردم در صورتي كه كاربر دوباره خواست اون فرم رو فراخواني كنه پيغامي مبني بر اينكه فرم در حال اجرا ميباشد نمايش دهد

اين را هم خاطر نشان شوم كه نميخواهم از showdialog استفاده كنم چون ميخوام چندين فرم به صورت همزمان فعال باشد

ممنون از شما دوستان

Y_Safaiee
سه شنبه 03 مرداد 1391, 10:49 صبح
با سلام خدمت شما دوست عزیز


راحت ترین راه ممکن :



int r=0;
foreach (Form f in Application.OpenForms)
{
if (f.Text.CompareTo("Form2")==0) r = 1;
}

if (r == 1) MessageBox.Show("Error");
else
{
Form2 frm = new Form2();
frm.MdiParent = this;
frm.WindowState = FormWindowState.Maximized;
frm.Show();
}




موفق باشین
بایت بایت

daneshjo90
سه شنبه 03 مرداد 1391, 11:01 صبح
جواب نداد

انگار نه انگار كه براش كد نوشتم

Y_Safaiee
سه شنبه 03 مرداد 1391, 11:09 صبح
با سلام مجدد

1.این کدو تو رویداد نشون دادن فرم بنویسید.

2.f.Text.CompareTo("Form2")==0 کپشن فرمتونو بررسی میکنه آیا با کپشن فرمتون یکیه؟

daneshjo90
سه شنبه 03 مرداد 1391, 11:14 صبح
تو كپشن فرم مشكل داشت

ممنون از راهنمائيت

موفق باشي

Farshid007
سه شنبه 03 مرداد 1391, 12:16 عصر
چرا لقمه رو می پی چونید ؟

foreach (Form Frm in Application.OpenForms)
{
if (Frm.Text == "Form2")
{
MessageBox.Show("You Cannot Open This form For twice"); return;
}
}
Form2 frm = new Form2();
frm.MdiParent = this;
frm.WindowState = FormWindowState.Maximized;
frm.Show();

speralda
سه شنبه 03 مرداد 1391, 12:27 عصر
درود

من این کد رو نوشتم برای بار اول که میخوام فرم2 رو شو کنم اول پیام Error میده بعد فرم2 رو باز میکنه!!!!:متفکر:

daneshjo90
سه شنبه 03 مرداد 1391, 13:36 عصر
آقا Farshid007 عزيز

من اكثر پست هايي كه دادين رو خوندم نميدونم چطوري فك ميكنيد كه اينطوري با اين لحن صحبت ميكنيد

ادب هم خوب چيزيه


نقل قول: محدود كردن اجراي دوباره ي يك فرم
درود

من این کد رو نوشتم برای بار اول که میخوام فرم2 رو شو کنم اول پیام Error میده بعد فرم2 رو باز میکنه!!!!


شما هم از سورس آقا يونس استفاده كني جواب ميده

من امتحان كردم

موفق باشي

ASKaffash
سه شنبه 03 مرداد 1391, 13:47 عصر
سلام
اگر می خواهید روش علمی را انتخاب کنید از Pattern بنام SingleTone استفاده کنید این Pattern تضمین میکند که یک شی فقط یکبار بیشتر ایجاد نمی شود اگر دقت کرده باشید در VB.NET می توان نوشت Form1.Show این همین مفهوم است یعنی روی کلاس Form1 متد Show یک متد Static است که از SingleTone استفاده میکند و اگر شی قبل ایجاد شده باشد فقط آن را Show می کند

speralda
سه شنبه 03 مرداد 1391, 16:18 عصر
فرقی نداره روی دو کد امتحان کردم ولی اول پیام به من نشان داده میشه!

شاید روند کارم اشتباه هست!
من دوتا فرم دارم 1 و2 از طریق فرم 1 فرم 2 شو میشه.این کد رو هم توی فرم لود فرم2 نوشتم.

درسته؟

Y_Safaiee
سه شنبه 03 مرداد 1391, 16:23 عصر
با سلام مجدد

نه دوست عزیزم این کدها رو باید روی آیتمی که با کلیک روش فرم دومت قراره باز بشه بنویسی,مثلا رو آیتم منوبارت یا دکمه نمایش فرم جدیدت.(تو مثال شما میشه بخشی که تو فرم اول هست و قراره فرم دوم رو نشون بده)

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

موفق باشی
بایت بایت

speralda
سه شنبه 03 مرداد 1391, 17:50 عصر
ممنون از توجهتون من این کار رو هم کردم ولی با این خطا مواجه شدم90177:متفکر:

Y_Safaiee
سه شنبه 03 مرداد 1391, 17:56 عصر
با سلام مجدد خدمت شما

آهان این مشکل مال اینه که شما IsMdiContainer مربوط به فرم اولتونو برابر true نکردید,فرم اولتونو انتخاب کنید و تو پروپرتیسش خاصیت IsMdiContainer رو برابر با True نمائید.


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



...
Form2 frm = new Form2();
frm.TopLevel = false;
this.Controls.Add(frm);
frm.Show();
...


موفق باشین
بایت بایت

sirvan-me
سه شنبه 03 مرداد 1391, 18:07 عصر
می تونید از Mutex استفاده کنید ... به نظرم این روش منطقی تره ( اگه کتاب سیستم عامل Silberschatz رو خونده باشی ) .... بسیار عالی و مطمئن . برای اینکار فایل Programe.cs برنامتون رو باز کنید و اینطور بنویسید :

قبل از نوشتن کدها فضای نام System.Threading رو اضافه کنید ....

static void Main()
{
bool instanceCountOne=false;
Mutex mtx = new Mutex(true, Application.ProductName, out instanceCountOne);
if (instanceCountOne)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Main());
mtx.ReleaseMutex();
}

}

speralda
سه شنبه 03 مرداد 1391, 18:31 عصر
تشکر آقا یونس.جواب گرفتم.

آقا سیروان این کد به من جواب نداد من از این کدی که نوشتید برای این استفاده میکنم که اگر برنامه در حال اجراست دوباره اجرا نشود. static void Main()
{
bool instancecountone = false;
Mutex mtx = new Mutex(true, Application.ProductName, out instancecountone);
if (instancecountone)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
mtx.ReleaseMutex();
}
else
{
MessageBox.Show("این برنامه قبلا اجرا شده است","خطا", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}

sirvan-me
سه شنبه 03 مرداد 1391, 18:35 عصر
اوه اوه من عنوان تاپیک رو اشتباه دیدم .... درسته کد من برای اجرا نشدن دوباره ی برنامست:خجالت:

daneshjo90
سه شنبه 03 مرداد 1391, 19:30 عصر
آقا سيروان از شما هم ممنون بخاطر اينكه تاپيك منو بي جواب نذاشتيد

موفق باشي

FastCode
سه شنبه 03 مرداد 1391, 20:58 عصر
سلام.
راه حل سادش اینه که همه ی فرم ها رو برای اجرا به یک تابع دیگه بفرستی و از اونجا show کنی.فقط قبل از show کردن event ه form.closed ه form رو handle کنی که متوجه بشی فرم بسته شده و اجازه دوباره باز شدن رو داره.
میتونی از type ه هر فرم به عنوان کلید ه dictionary ه فرمهای باز استفاده کنی
تقریباً اینطوری

form1 f = new form1();
//f.show();
showform(f);

List<Type> openForms = new ...
void showform(Form f){
if (openForms.Contains(f.GetType())){
Exception up = new Exception("Form " + f.Title + " is open");
throw up;
}
else{
openForms.Add(f.GetType());
form.FormClosed+= f_close;
form.show();

}
}
void f_close(object sender, eventargs e){
openForms.Remove(sender.GetType());
}


ولی به نصیحت من گوش کن:
من اینها رو امتحان کردم:
Tab Control
Tree View
Message Loop Per Form
Single Instance
....

تنها چیزی که ۶ ماه کاربرها رو خوشحال کرد تغییر Title ه فورم بود.

the king
سه شنبه 03 مرداد 1391, 21:46 عصر
این کد رو در کلاس خود اون فرم اضافه کنید تا اگه دید تنها نمونه موجود نیست خودش مانع نمایش خودش بشه :

protected override void OnCreateControl()
{
foreach (Form form in Application.OpenForms)
{
if ((form != this) && (form.GetType() == this.GetType()))
{
MessageBox.Show("your message.");
this.Dispose();
return;
}
}
base.OnCreateControl();
}

Farshid007
سه شنبه 03 مرداد 1391, 22:10 عصر
سلام اقای Fast code من بعضی جاها به شما بی احترامی کردم .شرمنده
شما استاد من هستید .

Message Loop Per Form
Single Instance
چیه؟

FastCode
سه شنبه 03 مرداد 1391, 23:26 عصر
سلام اقای Fast code من بعضی جاها به شما بی احترامی کردم .شرمنده
شما استاد من هستید .

Message Loop Per Form
Single Instance
چیه؟
سلام
اشکالی نداره من هم قبلاً از این کارها کردم.پیش میاد.

Message Loop
حلقه ای هست که از system پیغام های مربوط به برنامه رو میگیره.
وقتی یک برنامه یک پیغام رو میگیره, کنترل به حلقه برنمیگرده تا پردازش پیغام تموم بشه.
حالا این پیغام میتونه هر چیزی باشه(click,mouse_move,form_close)
اگر هر فرم یک message loop داشته باشه اگر پردازش پیغامی طول بکشه(تعریف هنگ کردن), بقیه فرمها هنگ نمیکنن چون از یک loop ه دیگه استفاده میکنند.

single instance هم یعنی همین کاری که ما داریم سعب میکنیم انجام بدیم.