PDA

View Full Version : برگرداندن مقدار از فرم فراخوانی شده



HAIdle
چهارشنبه 17 مرداد 1386, 10:59 صبح
سلام به همه
من می خوام یه فرم بسازم که کار messageBox را انجام بده. یعنی یه پیامی بده و 3 تا

دکمه yes و no و cancel داشته باشه. فرض کنید اسم آن فرم را

farsiMessageForm بگذاریم. می خواهیم در فرم پدر کد زیر را بنویسیم:


farsiMessageForm temp = new farsiMessageForm();
int i = temp.ShowDialog();


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

ولی من نمی خواهم این کار را بکنم بلکه می خواهم دقیقا شکل کد بالا را رعایت کنم.

mehdi.mousavi
چهارشنبه 17 مرداد 1386, 11:17 صبح
سلام به همه
من می خوام یه فرم بسازم که کار messageBox را انجام بده. یعنی یه پیامی بده و 3 تا

دکمه yes و no و cancel داشته باشه. فرض کنید اسم آن فرم را

farsiMessageForm بگذاریم. می خواهیم در فرم پدر کد زیر را بنویسیم:


farsiMessageForm temp = new farsiMessageForm();
int i = temp.ShowDialog();
چه جوری میشه کاری کرد که وقتی فرم ساخته شده بسته شد یه عدد صحیح به فرم پدرش برگرداند.
البته می دانم می شود متغیر عمومی در فرم شدر تعریف کرد و از فرم فرزند آن را مقدار دهی کرد

ولی من نمی خواهم این کار را بکنم بلکه می خواهم دقیقا شکل کد بالا را رعایت کنم.


سلام.
منظورتون اینه که جای یه DialogResult یه Int32 به استفاده کننده بر گرده؟ اگر منظورتون اینه، کد زیر رو به فرم farsiMessageForm اضافه کنید:



public new Int32 ShowDialog()
{
DialogResult res = base.ShowDialog();
return 0;
}

البته من این کار رو توصیه نمیکنم، چون اولا با این کار دارین استاندارد رو بهم میزنید، ثانیا نیازی به یه Int32 ندارید، چون هر چی بخواهید تو DialogResult هست.

MH2538
چهارشنبه 17 مرداد 1386, 13:22 عصر
سلام
یه نمونه برنامه همراه این مطلب فرستادم . فکر کنم دقیقاً همون چیزی باشه که شما لازم داری.


private void bRetry_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Retry;
}

اَرژنگ
چهارشنبه 17 مرداد 1386, 18:06 عصر
سلام
یه نمونه برنامه همراه این مطلب فرستادم . فکر کنم دقیقاً همون چیزی باشه که شما لازم داری.


private void bRetry_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Retry;
}


با تشکر از زحمتتان، در فرم frmMessage این کدها را برداشتم چونکه احتیاجی بهشان نیست:

privatevoid bRetry_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Retry;
}
privatevoid bOK_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
}
privatevoid bCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}


در Form1 ابجکت را بوجود میاریم ب بلافاصله بعد از استفاده رهایش میکنیم. به همین خاطر احتیاجی نیست که frmMessage یک فیلد از Form1 باشه.

در ضمن اگر قراره که وظیفه frmMessage این باشه که یک مساج نشان بده. این را باید در کد کاملا مشخص کرد که جایی برایه ابهام باقی نماند ، بخاطر همین کد را ا به frmMessage اضافه میکنیم و در Form1 کالش میکنیم:



publicstring ShowMessage(string Message)
{
this.lMsg.Text = Message;
this.ShowDialog();
returnthis.DialogResult.ToString();
}



در ضمن در frmMessage احتیاجی نیست که Label1 پابلیک باشد، این روش پابلیک کردن کنترلهایه یک فرم برایه دسترسی بهشان عادتیه که برنامه نویسان تنبل و بدانه دیسیپلین رایج کرده‌اند، شما ازش پرهیزی کنید و به جمعشان نپیوندید :) من دوباره این لیبل را پرایوتش کردم.

حالا در Form1 فقط کنترل را بوجود میاریم و ازش درخواست میکنیم که وظیفه ShowMessage را انجام بده، فرق این روش این است که ما دیگر در Form1 با اشیائ داخلی frmMessage کاری نداریم و احتیاجی به دانستن اینکه باید لیبلش را مقدار بدیم نداریم. تنها راهی هم که میشه استفاده‌اش کرد دقیقا مشخص است (چونکه مساج را در یک پارامتر بهش پاس میدیم).
با اجازه‌تان مثالتان را یکمی تغییر دادم.

MH2538
پنج شنبه 18 مرداد 1386, 10:22 صبح
سلام
1 - غرض از گذاشتن سه دکمه retry و OK و Cancel این بود که به دوست عزیزم HAidle نشون دادن نحوه ارسال DialogResult به فرمی که اون رو فراخوانی کرده فقط من اشتباها بجای YES NO CANCEL سه تای دیگه رو گذاشته بودم که در هر حال باز هم روش حل رو روشن می کرد.
پس نباید حذف می شد. چون حالا این فرم فقط می تونه Cancel رو پاس بده .

2 - من frmMessage رو در همون ابتدای برنامه new کردم با این ذهنیت که معمولاً پیغام های زیادی در برنامه داده می شود. بنا براین نباید همواره در حال new کردن یک فرم بود،‌زیرا GC همواره در حال جمع کردن پوینتر های null شده نیست و من هم قصد رزرو کردن حافظه های متوالی به امید آزاد شدن توسط GC را ندارم زیراحافظه تخصیص یافته به handle های ازاد شده در همان لحظه آزاد نمی شود بلکه GC در زمان لازم اینکار را میکند و من هم نیازی به این کار احساس نکردم.
3-همونطور که گفتم قصد من نشون دادن نحوه ارسال dsialogresult به فرم فراخواننده بود نه نحوه ارسال مقادیر به label فرم mressage پابلیک کردن label هم به همین دلیل بود اما در هر حال در این ورد قبول دارم که روشی که گفتید بهتر است.

اَرژنگ
پنج شنبه 18 مرداد 1386, 16:08 عصر
سلام
1 - غرض از گذاشتن سه دکمه retry و OK و Cancel این بود که به دوست عزیزم HAidle نشون دادن نحوه ارسال DialogResult به فرمی که اون رو فراخوانی کرده فقط من اشتباها بجای YES NO CANCEL سه تای دیگه رو گذاشته بودم که در هر حال باز هم روش حل رو روشن می کرد.
پس نباید حذف می شد. چون حالا این فرم فقط می تونه Cancel رو پاس بده .


کسی آٔن ۳ دگمه را حذف نکرده، اگر به مثالی که از شما گرفتم و تغییر دادم نگاه اندخته باشید میبیینید دقیقا همان کار را انجام میده ولی با کد کمتر.



2 - من frmMessage رو در همون ابتدای برنامه new کردم با این ذهنیت که معمولاً پیغام های زیادی در برنامه داده می شود. بنا براین نباید همواره در حال new کردن یک فرم بود،‌زیرا GC همواره در حال جمع کردن پوینتر های null شده نیست و من هم قصد رزرو کردن حافظه های متوالی به امید آزاد شدن توسط GC را ندارم زیراحافظه تخصیص یافته به handle های ازاد شده در همان لحظه آزاد نمی شود بلکه GC در زمان لازم اینکار را میکند و من هم نیازی به این کار احساس نکردم.


و شما هم کاملا درست میگید، و این نقطه جالبی است که من در نظر نگرفته بودم ولی در آٓینده در نظر میگیرم. غرض از روش دیگر این نبود که روشه شما درست نیست، فقط اینکه روش دیگر چه فایده و یا کمبود داره (که یکیش را شما عرض فرمودید).
یک دلیل از روشی دیگری که استفاده کردم این است که معمولا در برنامه‌ها تعداد زیادی فرم استفاده میشه و اگر تمامشان را در موقع اجرا برنامه نیو کنیم سرعت لود برنامه میره پائین که خیلیها همیشه ازش شکایت میکنند ه چرا برنامه شان کند لود میشه.



3-همونطور که گفتم قصد من نشون دادن نحوه ارسال dsialogresult به فرم فراخواننده بود نه نحوه ارسال مقادیر به label فرم mressage پابلیک کردن label هم به همین دلیل بود اما در هر حال در این ورد قبول دارم که روشی که گفتید بهتر است.
روش شما کامل درست است و اگر شما زحمت نمیکشیدید که این مثال را بفرستید من چیزی نداشتم که به این موضوع اضافه کنم. با یکمی تغییر دادن کد شما هدفم این بود که نظر شما و یا دیگران را در این مورد جویا بشم و با دادن توضیح در مورد دلیال تغییرات این روشهایی را که مداوم استفاده میکنم را خودم بهتر درک کنم.
مثال خوب شما این فرصت را داد که به یک مسائل درجه دوم یکمی تحریر کنیم.