PDA

View Full Version : گفتگو: تعریف ایونتی از فرم دوم درون فرم اول



میلاد قاضی پور
پنج شنبه 03 تیر 1389, 03:41 صبح
سلام . آیا میشه ایونتی برای فرم دوم درون فرم اول تعریف کرد و آیا این کار اصولی هست یا نه ؟
مثلا یک ایونت مانند formclosing فرم دوم رو درون فرم اول به نام form2closing تعریف کرد و براش دستور نوشت. منظورم فراخوانی توابع فرم دوم نیست البته.

اَرژنگ
پنج شنبه 03 تیر 1389, 06:17 صبح
سلام . آیا میشه ایونتی برای فرم دوم درون فرم اول تعریف کرد و آیا این کار اصولی هست یا نه ؟
مثلا یک ایونت مانند formclosing فرم دوم رو درون فرم اول به نام form2closing تعریف کرد و براش دستور نوشت. منظورم فراخوانی توابع فرم دوم نیست البته.

برایه امتحان ،اصولی بودن را فراموش کنید .
یک مثال که چطوری اینکار را میشه انجام داد بسازید.

Saeed.Masoumi
پنج شنبه 03 تیر 1389, 07:08 صبح
بله می شه اما باید به یک نکته توجه کنید اگر ایونتی را برای یک Instance از فرمتان می سازید آن ایونت فقط برای همان نمونه فایر میشه
یعنی:


private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.FormClosing += new FormClosingEventHandler(frm_FormClosing);
frm.Show();
}
void frm_FormClosing(object sender, FormClosingEventArgs e)
{
MessageBox.Show("Called by Button1");
}
private void button2_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.FormClosing += new FormClosingEventHandler(frm_FormClosing2);
frm.Show();
}
void frm_FormClosing2(object sender, FormClosingEventArgs e)
{
MessageBox.Show("Called by Button2");
}


می تونید برای اینکه یک ایونت کلی تعریف کنید یک Instance سراسری (در سطح کلاس جاری)بسازید و برای آن ایونت را در نظر بگیرید.
می تونید همزمان یک ایونت همشکل هم در داخل خود کلاس Form2 هم داشته باشید بالطبع در موقع خروج ابتدا ایونت داخل کلاس اجرا میشه سپس ایونتی که شما در خارج از کلاس فرم2 ایجاد کردید

میلاد قاضی پور
پنج شنبه 03 تیر 1389, 08:02 صبح
جل الخالق !
اگر با استفاده از این روش بخوایم مقادیر رو از فرم دو به فرم اول انتقال بدیم کار درستی هست یا نه ؟یا بهتره از همون روش application.openforms... استفاده بشه ؟
مثلا برای رویداد کلیک یک باتون در فرم دو ایونتی در فرم اول تعریف بشه و با رخ دادن اون ایونت مقادیر رو به فرم اول بکشیم.

میلاد قاضی پور
پنج شنبه 03 تیر 1389, 08:20 صبح
از فرم یک به دو که آسونه هم فهمیدنش هم هزاران روش هست به قول خودتون . مرد میخوام با رعایت اصول شی گرایی بدونایجاد اینستنس از فرم اول مقداری فرم دوم رو به اولی منتقل کنه . من خودم روی مساله اصولی بودن کد خیلی حساسم و گاهی جرات نمیکنم مساله ای رو یادبگیرم چون احساس میکنم بد عادت میشم و بهتره یا یاد نگیرم یا درستشو یادبگیرم . اما برای انتقال مقادیر از فرم دوم به اول فکر کردم شاید استفاده از ایونت ها اصولی باشه .

میلاد قاضی پور
پنج شنبه 03 تیر 1389, 08:40 صبح
استاتیک ؟؟؟؟ نههههه ...الان دستگیرمون میکنن . آقا من کدی مشابه نمونه شما نوشتم روی نیو فرم کلوزینگ ایونت هندلر این ارورو میده :



Error 1 Cannot implicitly convert type 'System.Windows.Forms.FormClosingEventHandler' to 'System.EventHandler'

Saeed.Masoumi
پنج شنبه 03 تیر 1389, 08:57 صبح
نمونه برنامه پیوست شد:

اَرژنگ
دوشنبه 07 تیر 1389, 11:27 صبح
با سلام،
متغییرهایه استاتیک بازمانده‌ای از زمان غیره شیگرائی هستند، حل این مسئله احتیاجی به استفاده از متغییر استاتیک ندارد و در کل متغییرهایه استاتیک روش مفت حل کردن مشکلاتی هستند که با یکمی درک در شیگرائی میشد به روش درست حلشان کرد.
سوال اصلی را دوباره بازبینی کنید و اگر بعد از مقداری تفکر به کمک در حلش نیاز بود در خدمت هستم. جوابی که خودتان پیدا کنید به هر زحمتی میارزه.

میلاد قاضی پور
دوشنبه 07 تیر 1389, 13:10 عصر
با تشکر از شما دقیقا متوجه نشدم منظورتون کدوم سوال بود اما در کل هدفم این بود که
من یک ایونت در فرم اولم تعریف میکنم . تا با به وقوع پیوستن اون متغیری یا مقداری از فرم دومم به فرم اولم انتقال داده بشه . چرا اینکارو میکنم ؟ چون نمیخوام اینستنسی از فرم اول درون فرم دومم ایجاد کنم . چرا ؟ چون اگر اون کارو بکنم . برای مشاهده تغییرات مجبورم نمونه ایجاد شده رو شو کنم . و نمونه ایجاد شده اول که در کلاس پروگرم ایجاد شده و با اجرای برنامه بالا اومده تغییری نمیکنه . سوال مهم اینه که اون ایونت چی هست ؟ جواب: بسته شدن فرم دوم .

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

اَرژنگ
دوشنبه 07 تیر 1389, 14:02 عصر
با تشکر از شما دقیقا متوجه نشدم منظورتون کدوم سوال بود اما در کل هدفم این بود که
من یک ایونت در فرم اولم تعریف میکنم . تا با به وقوع پیوستن اون متغیری یا مقداری از فرم دومم به فرم اولم انتقال داده بشه . چرا اینکارو میکنم ؟ چون نمیخوام اینستنسی از فرم اول درون فرم دومم ایجاد کنم . چرا ؟ چون اگر اون کارو بکنم . برای مشاهده تغییرات مجبورم نمونه ایجاد شده رو شو کنم . و نمونه ایجاد شده اول که در کلاس پروگرم ایجاد شده و با اجرای برنامه بالا اومده تغییری نمیکنه . سوال مهم اینه که اون ایونت چی هست ؟ جواب: بسته شدن فرم دوم .

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

خیر منافات که نداره که هیچ، از لحاظ شیگرائی یکی از درسترین روشهاست (هیچ وقت بدونه دلیل درست بودن و خوب بودن روش را قبول نکنید).
دلیل درستی این روش این است که از ایونتها که برایه باخبر شدن از اتفاقاتی که از لحاضی مهم هستند برایه باخبر شدن استفاده میکنیم.
یادتان باشد که مقدار داخل یک تکست باکس فقط یک متغییر بی‌معنی نیست که پاس داده میشه، یک خصوصیت است که از لحاظ کارکرد برنامه اهمیت دارد، و شما با استفاده از ایونتها از عوض شدن مقدار این پروپتیها باخبر میشید.
یک مثال که برتری این روش را به همه روشهایه من درآودری استفاده از متغییرهایه استاتی نشان میده ، قابلیت بدست آوردن مقدار یک خصوصیت فرمی که به جایه ShowModal با Show نشان داده شده و بدانه بسته شدن فرم از تغییرات باخبر شد. قبلاً یک مثال در همین تالار فرستاده بودم. روشهایه دیگر چنین قابلیت را نه اینکه نداشتن بلکه به گره‌خوردن در کد منجر میشند ولی هنوز مداوما استفاده میشند (مثل اینکه یادگرفتن روش درست از برنامه‌نویسیه کج و ماوج سختر است!).
این هم یک لینک برایه مثال شبیه به کاری که میخواهید انجام بدین، این مثال یکمی پیچیده تر است ولی واقعا به زمانی که روش برایه درکش بزارید میارزه:
http://barnamenevis.org/forum/showthread.php?p=466715#post466715

میلاد قاضی پور
دوشنبه 07 تیر 1389, 15:46 عصر
توضیحاتتون کامل بود . من اولش شک کردم که نکنه سوال غیر ممکنی کرده باشم . پس ماشالله به خودم . ممنون از شما.