محدود كردن اجراي دوباره يك فرم
سلام
بنده برنامه اي نوشتم كه داراي چندين فرم هست كه خاصيت فرزند پدري دارند
بنده ميخوام وقتي فرمي رو اجرا كردم در صورتي كه كاربر دوباره خواست اون فرم رو فراخواني كنه پيغامي مبني بر اينكه فرم در حال اجرا ميباشد نمايش دهد
اين را هم خاطر نشان شوم كه نميخواهم از showdialog استفاده كنم چون ميخوام چندين فرم به صورت همزمان فعال باشد
ممنون از شما دوستان
نقل قول: محدود كردن اجراي دوباره ي يك فرم
با سلام خدمت شما دوست عزیز
راحت ترین راه ممکن :
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();
}
موفق باشین
بایت بایت
نقل قول: محدود كردن اجراي دوباره ي يك فرم
جواب نداد
انگار نه انگار كه براش كد نوشتم
نقل قول: محدود كردن اجراي دوباره ي يك فرم
با سلام مجدد
1.این کدو تو رویداد نشون دادن فرم بنویسید.
2.f.Text.CompareTo("Form2")==0 کپشن فرمتونو بررسی میکنه آیا با کپشن فرمتون یکیه؟
نقل قول: محدود كردن اجراي دوباره ي يك فرم
تو كپشن فرم مشكل داشت
ممنون از راهنمائيت
موفق باشي
نقل قول: محدود كردن اجراي دوباره ي يك فرم
چرا لقمه رو می پی چونید ؟
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();
نقل قول: محدود كردن اجراي دوباره ي يك فرم
درود
من این کد رو نوشتم برای بار اول که میخوام فرم2 رو شو کنم اول پیام Error میده بعد فرم2 رو باز میکنه!!!!:متفکر:
نقل قول: محدود كردن اجراي دوباره ي يك فرم
آقا Farshid007 عزيز
من اكثر پست هايي كه دادين رو خوندم نميدونم چطوري فك ميكنيد كه اينطوري با اين لحن صحبت ميكنيد
ادب هم خوب چيزيه
نقل قول:
نقل قول: محدود كردن اجراي دوباره ي يك فرم
درود
من این کد رو نوشتم برای بار اول که میخوام فرم2 رو شو کنم اول پیام Error میده بعد فرم2 رو باز میکنه!!!!
شما هم از سورس آقا يونس استفاده كني جواب ميده
من امتحان كردم
موفق باشي
نقل قول: محدود كردن اجراي دوباره ي يك فرم
سلام
اگر می خواهید روش علمی را انتخاب کنید از Pattern بنام SingleTone استفاده کنید این Pattern تضمین میکند که یک شی فقط یکبار بیشتر ایجاد نمی شود اگر دقت کرده باشید در VB.NET می توان نوشت Form1.Show این همین مفهوم است یعنی روی کلاس Form1 متد Show یک متد Static است که از SingleTone استفاده میکند و اگر شی قبل ایجاد شده باشد فقط آن را Show می کند
نقل قول: محدود كردن اجراي دوباره ي يك فرم
فرقی نداره روی دو کد امتحان کردم ولی اول پیام به من نشان داده میشه!
شاید روند کارم اشتباه هست!
من دوتا فرم دارم 1 و2 از طریق فرم 1 فرم 2 شو میشه.این کد رو هم توی فرم لود فرم2 نوشتم.
درسته؟
نقل قول: محدود كردن اجراي دوباره ي يك فرم
با سلام مجدد
نه دوست عزیزم این کدها رو باید روی آیتمی که با کلیک روش فرم دومت قراره باز بشه بنویسی,مثلا رو آیتم منوبارت یا دکمه نمایش فرم جدیدت.(تو مثال شما میشه بخشی که تو فرم اول هست و قراره فرم دوم رو نشون بده)
قراره اول ببینه چنین فرمی قبلا لود شده یا نه اگه لود شده بود ارور بده و اگه نبود لودش کنه و نشونش بده,کد شما وقتی اجرا میشه که فرم دوم داره لود میشه پس سریعا ارور میده چون داره لود میشه,این کد برای جلوگیری از باز شدن فرم تکراریه.
موفق باشی
بایت بایت
1 ضمیمه
نقل قول: محدود كردن اجراي دوباره ي يك فرم
ممنون از توجهتون من این کار رو هم کردم ولی با این خطا مواجه شدمضمیمه 90177:متفکر:
نقل قول: محدود كردن اجراي دوباره ي يك فرم
با سلام مجدد خدمت شما
آهان این مشکل مال اینه که شما IsMdiContainer مربوط به فرم اولتونو برابر true نکردید,فرم اولتونو انتخاب کنید و تو پروپرتیسش خاصیت IsMdiContainer رو برابر با True نمائید.
اگه دوست ندارین فرم اولتونو از حالت معمولیش خارج شه میتونین با این کد فرم دومتونو تو فرم اول بیارین :
...
Form2 frm = new Form2();
frm.TopLevel = false;
this.Controls.Add(frm);
frm.Show();
...
موفق باشین
بایت بایت
نقل قول: محدود كردن اجراي دوباره ي يك فرم
می تونید از 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();
}
}
نقل قول: محدود كردن اجراي دوباره ي يك فرم
تشکر آقا یونس.جواب گرفتم.
آقا سیروان این کد به من جواب نداد من از این کدی که نوشتید برای این استفاده میکنم که اگر برنامه در حال اجراست دوباره اجرا نشود. 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);
}
}
نقل قول: محدود كردن اجراي دوباره ي يك فرم
اوه اوه من عنوان تاپیک رو اشتباه دیدم .... درسته کد من برای اجرا نشدن دوباره ی برنامست:خجالت:
نقل قول: محدود كردن اجراي دوباره ي يك فرم
آقا سيروان از شما هم ممنون بخاطر اينكه تاپيك منو بي جواب نذاشتيد
موفق باشي
نقل قول: محدود كردن اجراي دوباره ي يك فرم
سلام.
راه حل سادش اینه که همه ی فرم ها رو برای اجرا به یک تابع دیگه بفرستی و از اونجا 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 ه فورم بود.
نقل قول: محدود كردن اجراي دوباره ي يك فرم
این کد رو در کلاس خود اون فرم اضافه کنید تا اگه دید تنها نمونه موجود نیست خودش مانع نمایش خودش بشه :
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();
}
نقل قول: محدود كردن اجراي دوباره ي يك فرم
سلام اقای Fast code من بعضی جاها به شما بی احترامی کردم .شرمنده
شما استاد من هستید .
Message Loop Per Form
Single Instance
چیه؟
نقل قول: محدود كردن اجراي دوباره ي يك فرم
نقل قول:
نوشته شده توسط
Farshid007
سلام اقای Fast code من بعضی جاها به شما بی احترامی کردم .شرمنده
شما استاد من هستید .
Message Loop Per Form
Single Instance
چیه؟
سلام
اشکالی نداره من هم قبلاً از این کارها کردم.پیش میاد.
Message Loop
حلقه ای هست که از system پیغام های مربوط به برنامه رو میگیره.
وقتی یک برنامه یک پیغام رو میگیره, کنترل به حلقه برنمیگرده تا پردازش پیغام تموم بشه.
حالا این پیغام میتونه هر چیزی باشه(click,mouse_move,form_close)
اگر هر فرم یک message loop داشته باشه اگر پردازش پیغامی طول بکشه(تعریف هنگ کردن), بقیه فرمها هنگ نمیکنن چون از یک loop ه دیگه استفاده میکنند.
single instance هم یعنی همین کاری که ما داریم سعب میکنیم انجام بدیم.