PDA

View Full Version : فراخوانی یکی از متدهای فرم اصلی



smt1383
یک شنبه 23 خرداد 1389, 12:06 عصر
با سلام خدمت دوستان
می خواستم بدانم چگونه می شود از داخلی یک فرم دیگر (مثلاً Form2) به یکی از متدهای تعریف شده در فرم اصلی ( Form1) دسترسی پیدا کرد و آن را فراخوانی کرد. (البته به روشی که اصول oop را نقض نکند)
با تشکر

اَرژنگ
یک شنبه 23 خرداد 1389, 13:23 عصر
با سلام خدمت دوستان
می خواستم بدانم چگونه می شود از داخلی یک فرم دیگر (مثلاً Form2) به یکی از متدهای تعریف شده در فرم اصلی ( Form1) دسترسی پیدا کرد و آن را فراخوانی کرد. (البته به روشی که اصول oop را نقض نکند)
با تشکر
دوست عزیز،
شما جواب سوالتان را گفتید، ولی با این حال به این سوالها جواب بدین:
۱.قابلیت دسترسی متدها را چگونه معین میکنیم؟(کلمه کلیدی برایه اینکار چیه؟)
۲.اگر به یک نمونه دسترسی داشته باشید صدا زدن متد را بلد هستید.

smt1383
یک شنبه 23 خرداد 1389, 15:41 عصر
ممنون دوست عزیز
می دانم که باید متد را به صورت public تعریف کرد و فراخوانی متد را هم که همه ما می دانیم. اما سوال من این بود که دسترسی به متدهای public فرم اصلی برنامه چگونه است؟ دسترسی به متدهای فرم های دیگر که مشخص است و همه بلدیم. مثلاً در Form2 متدی به نام GetText() را به صورت public تعریف می کنیم و با فرض اینکه frm2 نمونه Form2 باشد به صورت:



frm2.GetText();
به این متد public دسترسی پیدا می کنیم. اما از فرم اصلی برنامه که نمونه ای در دست نداریم. البته راه حل هایی ارائه شده که به نظر می رسد اصول oop را نقض می کند. مثلاً اینکه در form2 تعریف کنیم:



Form1 frm;

حال در Form1 و به هنگام ساختن نمونه از Form2 می نویسیم:




Form2 frm2=new Form2();
frm2.frm=this;
frm2.ShowDialog();

حال به عنوان مثال برای دسترسی به متد ShowResult() که به صورت public در Form1 تعریف شده است به راحتی می توان از کد:



frm.ShowResult();

استفاده کرد. اما این روش به نظر می رسد که با اصول oop سازگار نیست. من دنبال یک روش اصولی می گردم که اصول oop را نقض نکند.

اَرژنگ
یک شنبه 23 خرداد 1389, 17:55 عصر
با سلام.
دیدتان کاملاً صحیح است و نقته‌ای که بیان کردید نشان دهنده این است که پایه بسیار مستحکمی در برنامه‌نویسی واقعی دارید.
اوّل: فرم اصلی و یا فرعی وجود ندارد، چیزی که بهش فرم اصلی گفته میشه در عمل فرم کنترل کننده است، فرمهایه فرعی از فرم اصلی کنترل میشند. متاسفانه استفاده از واژه‌هایه اصلی و فرعی نحوه تفکر در این زمینه‌ها را تخریب کردن و باعث مشکلات ذهنی میشند که جلویه دیدن جواب را مصلوب میکنند.
اگر به یاد بیارید که متدها و ایونتها پایه
هایه برنامه‌نویسی شیگرا را تشکیل میدن، و اینکه ایونتها برایه با خبر شدن از اتفاقاتی که بهشان اهمیت میدیم هستند، شاید اینکه جوابی که به دنبالش هستید استفاده از متد نیست به نظرتان بیاد.
این حالت فرضی شاید این مطلب را برایتان روشن کند:
از فرمی که درش هستیم و دارد نمایش داده میشه (همان فرم اصلی)، یک فرم دیگر نشان بدیم ، و در این فرم قابلیت عوض کردن یکی از خصوصیتهایه فرم قبلی (فرم اصلی) را به وکالت این فرم قرار دادیم.
حالا همانطوری که در زندگی واقعی وقتی که به یکی وکالت میدیم، انتظار داریم قبل و یا بعد از اینکه یک خصوصیتی را از جانبتان ِعوض کند بهتان خبر بده (ایونت ) که مطلع باشید که چی شد.
حالا شاید همان فرم از جاهایه دیگر (فرمهایه) استفاده بشه ، صدا زدن متد فرم اصلی شاید دیگر درست نباشد. شاید باید به یک متد از فرمی که علاقه به اتفاقاتش دارد دارد صدا بزنه.
در این حالت استفاده از ایونت درست است.
در همان مثال شما دلیل برایه سفت کد کردن (Hard Coding) فرم ۱ وجود ندارد، مانند دایلوگ باکسها که هر فرمی میتونه ازشان استفاده کند. حالا اگر همان فرم ۲ نیاز دارد که متدهایه فرم ۱ را صدا بزنه دلیلش این است که واقع شدن اتفاقی را خبر بده و ایونتها دقیقاً برایه همین کارند.
در فرم یک ایونت ResultSet را میتوانید تعریف کنید و هر فرم دیگری (چه فرم اصلی و یا نه) میتوانند خودشان را به این ایونت رجیستر کنند که با خبر بشند.
پ.ن. اول سعی کنید که با پیاده کردن ایونت در فرم ۲ این را ببینید ، اگر مشکلی پیش آمد کمک میکنیم.
روشهایه دیگر قبل از بسته شدن فرم ۲ ، Modal Result فرم ۲ را چک میکنند و بنابر آن در داخل خودشان مقادیر را تغییر میدن ، ولی اینگونه روشها برنامه را تا زمانی که فرم ۲ بسته بشه را قفل میکنند. استفاده از ایونتها احتیاجی به قفل کردن با استفاده از ShowDialog نمیگزاره.