PDA

View Full Version : سوال: مشکل در بستن فرم ها



peyman.kh
شنبه 16 شهریور 1398, 02:18 صبح
سلام , من میخوام ی برنامه بنویسم که دوتا فرم داره و در فرم یک یدونه باتن وجود داره , میخوام با کلیک اول فرم دوم باز بشه و با کلیک دوم بسته , به عبارتی به تعداد دفعات زوج فرم دوم بسته بشه و به تعداد دفعات فرد فروم دوم باز بشه .
من یک متغیر تعین کردم تا به ازای هر بار کلیک یک واحد به اون اضافه بشه و با دستور ایف کاری کردم که همون رابطه دفعات زوج و فرد انجام بشه و برای دستور بستن [ ;()frm.close ] و برای باز شدن [;()frm.show ] .
اما چی بگم :گریه:
این برنامه یچ اروری نداد اما باگ داره و من نمیدونم باگش برای چیه.
باگ برنامه:با کلیک بر روی باتن تعداد فرم هایی پشته هم ظاهرمیشه اما اون کاری که که میخوام انجام نمیشه.
لازم به ذکره که من فرم دوم رو در پانل نمایش میدم.

Mahmoud.Afrad
شنبه 16 شهریور 1398, 03:36 صبح
کدت رو بزار.

ASHKANLAEI
شنبه 16 شهریور 1398, 09:53 صبح
چرا این کد رو نوشتید؟؟ میتونستید خیلی راحت از یک متغیر بولین کمک بگیرید. (1 برای باز بودن فرم دوم و 0 برای عکس اون)

peyman.kh
شنبه 16 شهریور 1398, 11:48 صبح
این متغیری که میگین رو نمیشناسم , میشه ی توضیحی برام بدین

peyman.kh
شنبه 16 شهریور 1398, 12:04 عصر
;0=int a
;++a
;()Form4 frm = new Form4
;frm.FormBorderStyle = FormBorderStyle.None
;frm.Dock = DockStyle.Fill
;frm.TopLevel = false



(1==if(a%2
}
;(panel1.control.add(frm
;()frm.show


{
else
}
;(panel1.controls.remove(frm
;()frm.close
{

peyman.kh
شنبه 16 شهریور 1398, 12:18 عصر
اون دستور رو در رو رویداد کلیک نوشتم

وقتی این نشد یک راه دیگه هم امتحان کردم:
با کلیک بر روی دکمه در فرم یک , یک واحد به متغیر a اضافه میشد (من تو این یکی , متغیر a رو public ) تعریف کردم به طوری که با هر بار کلیک در فرم یک, یک واحد به متغیری در فرم چهار اضافه میشد و شرط بسته شدن در فرم چهار و شرط باز شدن فرم4 رو در فرم یک بررسی کردم. اما باز هم جواب نداد.
نمیدونم مشکل چیه ولی توی اولین کد که امتحان کردم , فقط هردستوری که توی اولین شرطی که برقرار شده وجود داره اجرا میشه .و با کلیک های بعدی که من امتحان کردم باید مقدار a تغیر کنه و یک شرط دیگه برقرار بشه , اما همچین اتفاقی نمیافته , حسابی گیج شدم

peyman.kh
شنبه 16 شهریور 1398, 13:22 عصر
راستی در مورد متغیر بول که گفتید , من میتونم ترو یا فالس بودنشو از روش باقی مانده تقسیم بر دو تعین کنم اما باز هم جواب نمیده , کد منطقی به نظرم میرسه و ارور هم نداره اما تو برنامه باگ درست میشه و مدام ی فرم باز میشه به عبارتی با کلیک اول یک فرم جدید باز میشه و برخلاف تصور من که باید با کلیک دوم فرم بسته شه , یک فرم دیگه روی فرم قبلی باز میشه

peyman.kh
شنبه 16 شهریور 1398, 13:53 عصر
الان کد رو عوض کردم و دوباره مشکلی شبیه به اون برام پیش اومدبا کلیک اول فرم دو باز میشه و با کلیک دوم هیچ اتفاقی نمی افته و با کلیک سوم دوباره فرم باز میشه , خوب الان من فکر میکنم که مشکل از دستور بستن فرم دوم هستمن از این دستور استفاده میکنم اما جواب نمیده : ;()form2 frm = new form2;()frm.close خوب من مشکل این کد رو نمیدونم که که چرا ارور نداره اما اجرا نمیشه .حتی این کد رو بدون هیچ کد دیگه ای در یک کلید گذاشتم اما جواب نداد.

peyman.kh
شنبه 16 شهریور 1398, 15:53 عصر
من دوتا فرم دارم (پدر...form1)(فرزند...form2)
در فرم یک , یک عدد کلید باتن وجود دارد.
من میخوام با کلیک های فرد فرم دو باز بشه و با کلیک های زوج بسته.
در کدی که من گذاشتم برای دستور بستن فرم دو از .... استفاده کردم:
;()frm.close
.
مشکل اینجاست که دستور جواب نمیده و با کلیک های فرد فرم باز میشه و با کلیک های زوج هیچ اتفاقی نمیافه .
من به منظور تست دستور بالا رو به application.exit تغییر دادم اما این بار جواب داد و با کلیک زوج کل برنامه بسته شد ولی این چیزی نیست که من میخوام.
قصد من اینه که فقط فرم 2 بسته بشه.
این عکس اسکرین شاتی از محیط برنامه و کدها هست.

ASHKANLAEI
شنبه 16 شهریور 1398, 17:13 عصر
دوست عزیز مشکل کد شما این هست که سعی در بستن یک فرم جدید دارید که در اصل از اول آشکار نشده!
برای حل این مشکل باید فرم های جدید نمایان شده رو در یک نوع متغیر ذخیره کنید که بعدا به همون فرم دسترسی داشته باشید.
حالا این کار رو میتونید با آرایه، لیست یا هر چیز که به ذهنتون میرسه انجام بدید.
البته این جا چون هر لحظه حد اکثر یک فرم بازه میتونید بدون آرایه و با یک متغیر هم این کار رو انجام بدید.

ASHKANLAEI
شنبه 16 شهریور 1398, 17:39 عصر
راستی اگر کدش رو میخواید اینه:

childFormNumber++;
if (childFormNumber % 2 == 1) { cchild = new Form1(); cchild.MdiParent = this; cchild.Show(); } else cchild.Close();
(یادتون باشه cchild متغیری هست که فرم در اون ذخیره میشه و بیرون از رویداد تعریف میشه، childFormNumber هم همینطور)
دقت داشته باشید که cchild در حالتی از نو تعریف میشه که کارمون با مقدار قبلیش تموم شده باشه.

peyman.kh
شنبه 16 شهریور 1398, 19:03 عصر
اصلا متوجه نمیشم , کدی که گفتید رو نوشتم و جایگزین کد خودم کردم و ارور داد , اگر امکان داره واضح تر توضیح بدین

ASHKANLAEI
شنبه 16 شهریور 1398, 21:15 عصر
ببینید، شما یک متغیر میخواستین که عدد اون با هر کلیک دکمه افزایش پیدا کنه. البته من در یک پاسخ دیگه به شما گفتم که از یک متغیر بولین استفاده کنید، حالا به هر دلیل فرض کنیم باید با عدد این کار رو انجام بدیم. اول باید در رویداد کلیک دکمه بنویسیم:
childFormNumber++
برای افزایش مقدار متغیرمون این رو مینویسیم.

مرحلۀ بعدی این طوریه که ما مقدار متغیر رو در نظر میگیریم. اگه مقدارش فرد بود (اولین بار این طوریه) باید متغیر فرم رو برابر یک فرم جدید قرار بدیم. سپس متغیر رو (دقت کنید فرم نه، خود متغیر) آشکار میکنیم:
cchild.Show();
البته من یک کد هم برای تنظیم والد نوشتم که به دلیل این بود که شما نوشتید فرم اول پدر است.

حالا در نظر میگیریم که بار دومه که کلیک میکنیم؛ در این صورت باید فرمی که ایجاد شده رو ببندیم. این جا بود که شما احتمالاً به اشتباه برخوردین.
شما متغیرتون رو در این حالت هم مقداردهی میکردین به یک فرم جدید که با این کار ارتباط با فرم قبلی رو از دست میدادین.
در حالی که اگه اینجا متغیر رو بروز نکنیم، ارتباط قطع نمیشه. پس من متغیر رو فقط در موقعی که کلیک ها فرد باشه (یعنی فرم قبلی بسته باشه)، بروز میکنم.
حالا که ارتباط قطع نشده، من فرم قبلی که در متغیر هنوز هست رو میبندم.

البته در کل زمانی که چنین کاری رو دقیقا این طوری میخواین، میتونید بدون متغیر انجام بدید و مستقیم با همون فرم کارتون رو انجام بدید.
یعنی بنویسید:
if (childFormNumber % 2 == 0) { Form1.MDIParent = this; Form1.Show(); } else Form1.close();

Mahmoud.Afrad
یک شنبه 17 شهریور 1398, 09:40 صبح
اگر از متغیر(frm) استفاده می کنید باید خارج از متد تعریفش کنید.

یا از openforms استفاده کنید
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.application.openforms

یا از الگوی singleton استفاده کنید.

peyman.kh
یک شنبه 17 شهریور 1398, 16:05 عصر
من ی نگاه به سایت انداختم اما چیزی سر در نیاوردم , من تازه واردم و ممنون میشم از روش های ساده تر این موردو برام شرح بدین. یکم زیر دیپلمی تر

peyman.kh
یک شنبه 17 شهریور 1398, 17:09 عصر
خیلی خوب , از ی روش ساده تر من یک متغیر سراسری درست میکنم و برای خروج از فرم از اون استفاده میکنم , طوری که شرط فرد بودن برای باز شدن فرم , در فرم یک انجام بشه , و شرط زوج بودن و بسه شدن فرم دوم , در فرم دوم و با دستور this.close انجام بشه , به نظرتون جواب میده ؟ فقط مسئله ای که هست من اصلا با متغیر های سراسری کارنکردم و واضح بگم بلد نیستم , ی بار هم از تو اینترنت برای استفاده از این متغیر خوندم و انجام دادم اما جواب نداد و من فکرمیکنم هنوز متوجه این متغیر نشدم.ممنون میشم اگه بهم کمک کنید.

peyman.kh
یک شنبه 17 شهریور 1398, 20:34 عصر
سلام دوباره , روش متغیر public رو تست کردم اما جواب نداد , مقدار متغیر با کلیک بروز نمیشه , روشی برای اینکه اتوماتیک بروز شه هست؟

Mahmoud.Afrad
یک شنبه 17 شهریور 1398, 21:46 عصر
مثلا راه دومی که گفتم به اینصورت
private void button1_Click(object sender, EventArgs e)
{
bool form2IsOpened = false;
Form2 frm2 = null;

foreach (Form form in Application.OpenForms)
{
if (form is Form2)
{
form2IsOpened = true;
frm2 = form as Form2;
break;
}
}

if (form2IsOpened)
{
frm2.Close();
}
else
{
frm2= new Form2();
frm2.Show();
}
}

peyman.kh
دوشنبه 18 شهریور 1398, 20:25 عصر
ای به فدای تو مدیر , خاک پاتیم , ناموسا دسخوش , جواب داد , خیر ببینی الهی

ASHKANLAEI
سه شنبه 19 شهریور 1398, 13:29 عصر
کد من که بالا توضیح دادم کار نکرد؟؟ :متعجب: من که تست کرده بودمش :متفکر:

peyman.kh
سه شنبه 19 شهریور 1398, 15:26 عصر
فدایی داری ولی اصلا ازش سر در نیاوردم , داداش دستت طلا که برای ما پیگیری کردی , ما که لطفتو فراموش نمیکنیم