PDA

View Full Version : اضافه کردن فرم فرزند به فرم پدر در برنامه های MDI



gomnam
دوشنبه 12 شهریور 1386, 18:11 عصر
همونطور که میدونین برای اضافه کردن یه فرم فرزند به فرم والد دز برنامه های MDI از کد زیر استفاده میکنیم



Form childForm = new Form();
childForm.MdiParent = this;
childForm.Show();



که this اشاره گر به فرم پدر هست
حالا اگه بخوایم از یه کلاس دیگه که مثلا در لایه business logic هست عمل فوق را انجام بدیم باید چه کدی نوشت ؟
درو اقع بهترین کد چیه؟

آیا این کد درسته؟




Form childForm = new Form();
childForm.MdiParent = Form1.ActiveForm;
childForm.Show();



Form1 در واقع فرم والد هست

البته این کد کار میکنه و هیچ مشکلی هم نداره ولی میخوامن ببینم آیا این روش درسته یا راه بهتری هست؟

once4ever
دوشنبه 12 شهریور 1386, 19:30 عصر
مطمئنی درست کار میکنه؟ و به عنوان فرزند کار میکنه

gomnam
دوشنبه 12 شهریور 1386, 19:58 عصر
مطمئنی درست کار میکنه؟ و به عنوان فرزند کار میکنه

شما شک دارین؟

ظاهرا که اینطوره

البته من درست بودن کد را از لحاظ performance و ... نمی دونم ولی علی الحساب که نشون میده کار میکنه

یه نمونه گذاشتم

ممنون میشم اگه کد ایرادی یا هر عیب و نقصی داره بگین

once4ever
چهارشنبه 14 شهریور 1386, 21:30 عصر
ببین دوست من
این کدی که شما نوشتی درست نیست
شما خط
mdiChildren.addChildForm(); در رویداد Load فرم 1 بذار ببین چه اتفاقی میافته!

درواقع شما یک BUG پیدا کردی. یه راه دیگه فهمیدنش اینه که یک Breakpoint به خط زیر اضافه کن و ببین چه اتفاقی میافته ;)

newChild.MdiParent = Form1.ActiveForm;
بنظر من بهترین روش برای اینکار اینه که به متد "اضافه کردن چایلد" یک شی از نوع فرم به عنوان ورودی اضافه کنی که فرم والد به عنوان ورودی بگیره.

gomnam
چهارشنبه 14 شهریور 1386, 23:17 عصر
ببین دوست من
این کدی که شما نوشتی درست نیست
شما خط
mdiChildren.addChildForm(); در رویداد Load فرم 1 بذار ببین چه اتفاقی میافته!

درواقع شما یک BUG پیدا کردی. یه راه دیگه فهمیدنش اینه که یک Breakpoint به خط زیر اضافه کن و ببین چه اتفاقی میافته ;)

newChild.MdiParent = Form1.ActiveForm;
بنظر من بهترین روش برای اینکار اینه که به متد "اضافه کردن چایلد" یک شی از نوع فرم به عنوان ورودی اضافه کنی که فرم والد به عنوان ورودی بگیره.

ممنون از پاسختون
بلا خره یه نفر پیدا شد یه جوابی به ما بده
اولا من یه همچین متدی (addchildForm) ندارم (البته شما حدس زدید که من کدهای اضافه کردن را در این متد نوشتم )
من برای فرم های child از روش singeltonepattern استفاده کردم و یک متد به نام مثلا showForm در فرم فرزند گذاشتم که ورودی اون هم یه فرم هست که به عنوان فرم والد عمل میکنه
مشکل اینجاست که من متد showForm را از کلاس Form1 فراخوانی نمی کنم که بخوام this را به عنوان پارا متر به اون پاس بدم
من از یک کلاس دیگه میخوام فرم فرزند را به فرم 1 add کنم
حالا میشه بگین چطوری باید فرم 1 را به متد showForm پاس بدم؟

اگه براتون مقدوره یه نمونه برنامه کوچیک بذارین ممنون میشم

once4ever
پنج شنبه 15 شهریور 1386, 12:30 عصر
اولا من یه همچین متدی (addchildForm) ندارم (البته شما حدس زدید که من کدهای اضافه کردن را در این متد نوشتم )
والا من از رو این برنامه ای که اینجا گذاشتید به شما جواب دادم و طبق اون راه درستش گفتم.
شما کدی که دارید اینجا بزارید تا دوستان بهتر کمک کنند

gomnam
پنج شنبه 15 شهریور 1386, 15:08 عصر
والا من از رو این برنامه ای که اینجا گذاشتید به شما جواب دادم و طبق اون راه درستش گفتم.
شما کدی که دارید اینجا بزارید تا دوستان بهتر کمک کنند

بهتره سوال را اینطوری مطرح کنم شاید بهتر متوجه بشین
یه برنامه داریم که 3 تا فرم به نام های Form1 و Form2 و Form3داریم

حال میخواهیم در فرم 3 یه آبجکت از فرم 2 ساخته و اونو به فرم 1 اضافه کنیم
خاصیت ISMdiContainer مربوط به فرم 1 نیز true میباشد
حال پیدا کنید پرتقال را ......
دیگه ساده تر از این نمیشد گفت

hmm
پنج شنبه 15 شهریور 1386, 18:32 عصر
کد پست اول شما درسته ، من هم از همین روش استفاده میکنم و به خوبی خواب میده

gomnam
پنج شنبه 15 شهریور 1386, 21:44 عصر
کد پست اول شما درسته ، من هم از همین روش استفاده میکنم و به خوبی خواب میده

تو پست اول 2 تا کد هست
من بحثم وی کد دوم هست وگر نه کد اول که روش استاندار هستش
منظور شما هم کد دوم هست؟

PC2st
جمعه 16 شهریور 1386, 20:29 عصر
یه برنامه داریم که 3 تا فرم به نام های Form1 و Form2 و Form3داریم

حال میخواهیم در فرم 3 یه آبجکت از فرم 2 ساخته و اونو به فرم 1 اضافه کنیم
خاصیت ISMdiContainer مربوط به فرم 1 نیز true میباشد
در Form3:


Form1 frm1 = new Form1();
Form2 frm2 = new Form2();
frm1.IsMdiContainer = true;
frm2.MdiParent = frm1;

چیزی مثل بالا باید باشه.

once4ever
جمعه 16 شهریور 1386, 20:41 عصر
خوب چی شد؟
منتظرم
مرسی
1. کد دوم شما در پست اول به دلیلی که گفتم صحیح نمیباشد.
2. برای تعریف کردن یک فرم چایلد برای فرم اول هیچ راهی نیست جز اینکه به عضو کلاس فرم اولت دسترسی داشته باشی
....
بنابر این ببین آیا میتونی به نحوی به اون تابع پاس بدی یا نه. یا اینکه فرم از همون فرم اول باز بشه ولی رویدادش از اون کلاس صدا زده بشه.

omid_Ahmadi
شنبه 17 شهریور 1386, 14:06 عصر
یه برنامه داریم که 3 تا فرم به نام های Form1 و Form2 و Form3داریم

حال میخواهیم در فرم 3 یه آبجکت از فرم 2 ساخته و اونو به فرم 1 اضافه کنیم
خاصیت ISMdiContainer مربوط به فرم 1 نیز true میباشد
حال پیدا کنید پرتقال را ......
دیگه ساده تر از این نمیشد گفت


باید به نحوی در کد فرم سوم (Form3) به اشاره گری به فرم والد (Form1) دسترسی داشته باشید، مثلاً با استفاده از Owner. به این ترتیب می تونید بعد از اینکه فرم دوم رو در Form3 ایجاد کردید، MdiParent اون رو Form1 معرفی و بعد، فرم رو Show کنید. اگر مورد دیگه ای مد نظرتون هست هم می تونید مطرح کنید، فقط مودبانه.
در صورتی که برخوردی مشابه پستهای 16 به بعد از هر کدام از دو کاربر مشاهده بشه، برخورد میشه.
موفق باشید.