PDA

View Full Version : MdiParent closing



iranrose63
دوشنبه 25 تیر 1386, 10:11 صبح
من یه برنامه دارم که تو اون فرم اصلیم یه MdiParent است و یه سری MdiChild هم دارم وقتی میخوام فرم اصلی رو ببندم اول FormClosing فرم های Child اتفاق می افته و در آخر کار Event FormClosing فرم اصلی ولی من می خوام برعکس این اتفاق رخ بده آیا میتونم این کار رو بکنم؟ در واقع می خوام در FormClosing فرم پدر یه خاصیتی رو متناسب با شرایطم تغییر بدم و در FormClosing فرم های فرزند متناسب با مقدار اون خاصیت یه سری کارها رو انجام بدم ولی مساله اینه که اول FormClosing فرمهای فرزند اتفاق می افته و در نهایت FormClosing فرم پدر حالا من باید چیکار کنم
متشکر میشم اگه منو راهنمایی کنید

MajerajooyeKhallagh
دوشنبه 25 تیر 1386, 10:40 صبح
من یه برنامه دارم که تو اون فرم اصلیم یه MdiParent است و یه سری MdiChild هم دارم وقتی میخوام فرم اصلی رو ببندم اول FormClosing فرم های Child اتفاق می افته و در آخر کار Event FormClosing فرم اصلی ولی من می خوام برعکس این اتفاق رخ بده آیا میتونم این کار رو بکنم؟ در واقع می خوام در FormClosing فرم پدر یه خاصیتی رو متناسب با شرایطم تغییر بدم و در FormClosing فرم های فرزند متناسب با مقدار اون خاصیت یه سری کارها رو انجام بدم ولی مساله اینه که اول FormClosing فرمهای فرزند اتفاق می افته و در نهایت FormClosing فرم پدر حالا من باید چیکار کنم
متشکر میشم اگه منو راهنمایی کنید

دوست عزیز
به نظر میرسه که منطق کارتون ایراد داره,فکر میکنم بهتر باشه که روش کارتونو عوض کنید,چون منطقا باید ابتدا فرمهای فرزند بسته شوند و سپس فرم پدر, و اینکه در Closing فرم پدر یه رویدادی اتفاق بیافتد قبل از اینکه فرمهای فرزند بسته شوند غیر منطقی و غیر ممکن میباشد(مگر اینکه فرمهای فرزند از نوع MDI نباشند که باز هم روش کار غیر منطقی میباشد)

iranrose63
دوشنبه 25 تیر 1386, 11:03 صبح
ببین دوست عزیز من یه کلاس برای فرمهام تعریف کردم و تو FormClosing اون کدی نوشتم که از کاربر بپرسه برای خروج اطمینان داره یا نه اگه کاربر مطمئن بود اون فرم بسته میشه حالا من وقتی فرم پدر رو می بندم به ازای تمام فرمهای فرزند که باز هستند این سوال پرسیده میشه ولی من می خوام فقط یه بار این سوال رو بپرسه حالا بگید منطق من چه مشکلی داره

MajerajooyeKhallagh
دوشنبه 25 تیر 1386, 11:50 صبح
ببین دوست عزیز من یه کلاس برای فرمهام تعریف کردم و تو FormClosing اون کدی نوشتم که از کاربر بپرسه برای خروج اطمینان داره یا نه اگه کاربر مطمئن بود اون فرم بسته میشه حالا من وقتی فرم پدر رو می بندم به ازای تمام فرمهای فرزند که باز هستند این سوال پرسیده میشه ولی من می خوام فقط یه بار این سوال رو بپرسه حالا بگید منطق من چه مشکلی داره

دوست خوبم,ببخشید من اصلا متوجه نمیشم که شما چه جوری میتونید فرم پدر را قبل از اینکه فرم فرزندان را ببندید,ببندید,لطفا بیشتر توضیح بدید تا بتونم راهنماییتون کنم.فرمهای فرزند را از چه نوعی تعریف کردید و با چه متدی Show میکنید؟

iranrose63
دوشنبه 25 تیر 1386, 12:19 عصر
ببینید وقتی من روی علامت ضربدر بالای فرم پدر کلیک میکنم یا کلید کنترلی ALT+F4 رو میزنم یا ... Event FormClosing فراخوانی میشه من رو فرم پدر یه منو دارم که با کلیک بر روی آیتم های اون فرم های فرزند ایجاد و نمایش داده می شوند مثلا برای نمایش فرم calculate از کد زیر استفاده میکنم


calculate c = new calculate();
c.MdiParent = this;
c.Show();

می خوام بدونم وقتی من علامت ضربدر فرم پدر رو میزنم چه رخدادی اتفاق می افته که اول وارد formclosing فرم های فرزند میشه و بعد وارد FormClosing فرم پدر. در واقع می خوام وقتی سعی میکنم فرم پدر رو ببندم دیگه پیغام های خروج از فرم برای فرم های فرزند نشون داده نشه

MajerajooyeKhallagh
دوشنبه 25 تیر 1386, 13:00 عصر
ببینید وقتی من روی علامت ضربدر بالای فرم پدر کلیک میکنم یا کلید کنترلی ALT+F4 رو میزنم یا ... Event FormClosing فراخوانی میشه من رو فرم پدر یه منو دارم که با کلیک بر روی آیتم های اون فرم های فرزند ایجاد و نمایش داده می شوند مثلا برای نمایش فرم calculate از کد زیر استفاده میکنم


calculate c = new calculate();
c.MdiParent = this;
c.Show();

می خوام بدونم وقتی من علامت ضربدر فرم پدر رو میزنم چه رخدادی اتفاق می افته که اول وارد formclosing فرم های فرزند میشه و بعد وارد FormClosing فرم پدر. در واقع می خوام وقتی سعی میکنم فرم پدر رو ببندم دیگه پیغام های خروج از فرم برای فرم های فرزند نشون داده نشه

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

iranrose63
دوشنبه 25 تیر 1386, 14:06 عصر
شما چون برای فرم پدر ,فرم فرزند تعریف کردید,مسلما تا فرم های فرزند بسته نشوند,فرم پدر بسته نمیشود,بنابراین به هنگام بستن فرم پدر,سعی بر بستن فرمهای فرزند مینماید,بنابراین ایونت Closing فرمهای فرزند به هنگام بستن فرم پدر ,فراخوانی میگردند
اینو خودمم میدونم می خوام بدونم چیکار کنم که پیغام خروج از فرم فرزند در صورتیکه سعی در بستن فرم پدر داریم نشون داده نشه؟:عصبانی++:

ghafoori
دوشنبه 25 تیر 1386, 14:44 عصر
دوست عزیز در رویداد form closing این کد را قراربده تا اگر کاربر خواست فرم را ببندد نتواند این کار را انجام دهد

if (this.MdiChildren.Length > 0) {
e.Cancel = false;
}

iranrose63
سه شنبه 26 تیر 1386, 08:35 صبح
نه شما متوجه منظور من نشدید ببینید یه برنامه بسازید تو اون سه تا فرم قرار بدید فرم اصلی را به عنوان فرم پدر و دو تا فرم دیگه رو فرزندان اون معرفی کنید ( این سه تا فرم یه کلاس هستند که در Event FormCLosing اونها یه پیغام نشون میده که اگه کاربر کلید بله رو زد اون فرم بسته میشه و اگه کلید خیر رو زد اون فرم باز میمونه ) حالا اگه بخواید یکی از فرم های فرزند رو ببندید این پیغام باید نشون داده بشه ولی اگه بخواید فرم پدر رو ببندید این پیغام باید یک بار نشون داده بشه ولی اگه دو تا فرم فرزند باز باشند این پیغام سه بار نشون داده میشه می خوام بدونم که چه اتفاقی می افته وقتی که علامت ضربدر بالای فرم پدر رو میزنیم که اول میره سراغ فرم های فرزند و FormClosing اونها رو انجام میده و در نهایت میاد سراغ فرم پدر منتظرم.:گیج:

MajerajooyeKhallagh
سه شنبه 26 تیر 1386, 09:55 صبح
نه شما متوجه منظور من نشدید ببینید یه برنامه بسازید تو اون سه تا فرم قرار بدید فرم اصلی را به عنوان فرم پدر و دو تا فرم دیگه رو فرزندان اون معرفی کنید ( این سه تا فرم یه کلاس هستند که در Event FormCLosing اونها یه پیغام نشون میده که اگه کاربر کلید بله رو زد اون فرم بسته میشه و اگه کلید خیر رو زد اون فرم باز میمونه ) حالا اگه بخواید یکی از فرم های فرزند رو ببندید این پیغام باید نشون داده بشه ولی اگه بخواید فرم پدر رو ببندید این پیغام باید یک بار نشون داده بشه ولی اگه دو تا فرم فرزند باز باشند این پیغام سه بار نشون داده میشه می خوام بدونم که چه اتفاقی می افته وقتی که علامت ضربدر بالای فرم پدر رو میزنیم که اول میره سراغ فرم های فرزند و FormClosing اونها رو انجام میده و در نهایت میاد سراغ فرم پدر منتظرم.:گیج:

دوست عزیز
همونطور که خدمتت عرض کردم,تا زمانیکه فرزندان بسته نشوند,فرم پدر بسته نمیشود,پس غیر قابل اجتناب است که وارد ایونتهای Closing فرزند نشود چون ایونتهای آنها به ترتیب در Stack قرار گرفته اند و به ترتیب هم باید Closing ها اجرا شوند تا به Closing فرم پدر برسند,در ضمن,من متوجه نمیشم که شما چرا می خواهید دوتا فرزند را باز کنید و بعد فرم پدر را ببندید بدون بستن فرمهای فرزند؟,این باز شدن فرمهای فرزند به صورت Show و نه showdialog بر روی فرم پدر,چه مزیتی برای شما دارد؟ اصولا اینکار یعنی Show کردن فرم فرزند به جای ShowDialog ,بر روی فرم پدر,کار اصولی نیست,شما نیازتون را بفرمایید دقیقتر,تا شاید راه حل بهتری برای طراحی و پیاده سازی فرمهاتون بیابیم

iranrose63
سه شنبه 26 تیر 1386, 10:24 صبح
ببینید جناب MajerajooyeKhallagh برعکس نظر شما من فکر میکنم نشون دادن فرم های فرزند به صورت Show کاربردیتره و نشون دادن اونها به صورت ShowDialog فقط کار برنامه نویس رو راحت تر میکنه و کار اونو کمتر.
بینید مشکل من اینه که نمیدونم چه طور بفهمم که کی باید پیغام خروج از فرم نشون داده بشه و کی نشون داده نشه یعنی کی بسته شدن فرم به خاطر زدن کلید ضربدر بالای خود فرمه و کی به خاطر بسته شدن فرم پدرش

MajerajooyeKhallagh
سه شنبه 26 تیر 1386, 11:23 صبح
ببینید جناب MajerajooyeKhallagh برعکس نظر شما من فکر میکنم نشون دادن فرم های فرزند به صورت Show کاربردیتره و نشون دادن اونها به صورت ShowDialog فقط کار برنامه نویس رو راحت تر میکنه و کار اونو کمتر.
بینید مشکل من اینه که نمیدونم چه طور بفهمم که کی باید پیغام خروج از فرم نشون داده بشه و کی نشون داده نشه یعنی کی بسته شدن فرم به خاطر زدن کلید ضربدر بالای خود فرمه و کی به خاطر بسته شدن فرم پدرش

پس با این حساب که شما میفرمایید,از روی فرم پدر,اگر از یک نوع فرم فرزند(مثلا فرمی با نام ورود اطلاعات کارمندان),1000 بار هم باز شود,موردی نیست!!!!!!!!!! چون Show جلوی اینکار را نمیگیرد(از نظر خود من,این کار اصلا منطقی نیست مگر اینکه,بتونید کنترل کنید که آیا از آن نوع فرم در حال حاضر در حافظه New شده است یا خیر)
به هر حال دوست عزیز,فکر میکنم نشه این مورد را کنترل کرد و متوجه شد که کی باید پیغام خروج از فرم نشون داده بشه و کی نشون داده نشه یعنی کی بسته شدن فرم به خاطر زدن کلید ضربدر بالای خود فرمه و کی به خاطر بسته شدن فرم پدرش

امیدوارم که راه حلی برای این مشکل به ذهن دوستان دیگه برسه و بتونن کمکتون کنن

موفق باشید

iranrose63
سه شنبه 26 تیر 1386, 11:44 صبح
پس با این حساب که شما میفرمایید,از روی فرم پدر,اگر از یک نوع فرم فرزند(مثلا فرمی با نام ورود اطلاعات کارمندان),1000 بار هم باز شود,موردی نیست!!!!!!!!!! چون Show جلوی اینکار را نمیگیرد(از نظر خود من,این کار اصلا منطقی نیست مگر اینکه,بتونید کنترل کنید که آیا از آن نوع فرم در حال حاضر در حافظه New شده است یا خیر)
به هر حال دوست عزیز,فکر میکنم نشه این مورد را کنترل کرد و متوجه شد که کی باید پیغام خروج از فرم نشون داده بشه و کی نشون داده نشه یعنی کی بسته شدن فرم به خاطر زدن کلید ضربدر بالای خود فرمه و کی به خاطر بسته شدن فرم پدرش

امیدوارم که راه حلی برای این مشکل به ذهن دوستان دیگه برسه و بتونن کمکتون کنن

موفق باشید

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

ghafoori
سه شنبه 26 تیر 1386, 13:31 عصر
دوست عزیز با توجه به این توضیحات و رداشتی که من از حرف های شما داشتم

نه شما متوجه منظور من نشدید ببینید یه برنامه بسازید تو اون سه تا فرم قرار بدید فرم اصلی را به عنوان فرم پدر و دو تا فرم دیگه رو فرزندان اون معرفی کنید ( این سه تا فرم یه کلاس هستند که در Event FormCLosing اونها یه پیغام نشون میده که اگه کاربر کلید بله رو زد اون فرم بسته میشه و اگه کلید خیر رو زد اون فرم باز میمونه ) حالا اگه بخواید یکی از فرم های فرزند رو ببندید این پیغام باید نشون داده بشه ولی اگه بخواید فرم پدر رو ببندید این پیغام باید یک بار نشون داده بشه ولی اگه دو تا فرم فرزند باز باشند این پیغام سه بار نشون داده میشه می خوام بدونم که چه اتفاقی می افته وقتی که علامت ضربدر بالای فرم پدر رو میزنیم که اول میره سراغ فرم های فرزند و FormClosing اونها رو انجام میده و در نهایت میاد سراغ فرم پدر منتظرم.
خوب شما داخل تمام فرمهایتان چه فرزند و چه والد داخل رویداد بسته شدن کدی نوشتید که به کاربر پیغامی را می دهد حالا خودتان که می خواهید همه ان پنجرهها را با کد ببنید برنامه فکر می کند کاربر داره این کار را انجام می دهد در این صورت مرتب پیغام می دهد
در این مورد من جای شما بودم داخل فرمهام یک متغییر bool تعریف می کردم در صورتی که false باشه معنیش اینه که فرم توسط کاربر بسته میشه و اگر true باشه فرم داره بوسیله برنامه بسته می شود در این صورت با کنترل مقدار این متغییر در رویداد بسته شدن برنامه پیغام را نشان می دهد یا نمی دهد

iranrose63
سه شنبه 26 تیر 1386, 14:03 عصر
در این مورد من جای شما بودم داخل فرمهام یک متغییر bool تعریف می کردم در صورتی که false باشه معنیش اینه که فرم توسط کاربر بسته میشه و اگر true باشه فرم داره بوسیله برنامه بسته می شود در این صورت با کنترل مقدار این متغییر در رویداد بسته شدن برنامه پیغام را نشان می دهد یا نمی دهد
مساله دقیقا همینجاست چه طور تشخیص بدم که کاربر فرم رو بسته یا اینکه بوسیله برنامه بسته شده؟

ghafoori
سه شنبه 26 تیر 1386, 14:36 عصر
خوب من که توضیح دادم یک متغییر تعریف کنید در فرمهای فرزندتان بعد هنگامی که می کاربر خواست فرم والد را ببندد شما مقدار تک تک این مقدار را در فرمهای فرزند برابر ture قرار بدید و فرم ها را ببندید

iranrose63
چهارشنبه 27 تیر 1386, 06:57 صبح
مساله اینجاست که formclosing فرم های فرزند زودتر از فرم پدر فراخوانی میشن پس اگه من در formclosing فرم پدر این متغیر رو مقدار دهی کنم بازم فرقی نمیکنه و این متغیر نمیتونه به ما کمک کنه