PDA

View Full Version : سوال: کمک در مورد event و delegate



amin.m1993
سه شنبه 02 خرداد 1391, 22:52 عصر
سلام خواهش میکنم یه نفر به من بگه فرق event با delegate چیه؟ اصلا وقتی delegate داریم چه نیازی به event هست؟ من هر چقدر میخونم بیشتر قاطی میکنم.:گریه:

فرید نجفلو
سه شنبه 02 خرداد 1391, 23:34 عصر
سلام
دوست عزیز به صورت مختصر می تونم بگم delegate امضای یک event هست
پس یک event رویدادی همسان(از نظر آرگومان و ...) delegate خودش رو راه اندازی می کنه

samadblaj
چهارشنبه 03 خرداد 1391, 09:38 صبح
سلام گنگ ترین مبحث برای منم delegate هستند.

لطفا اگه امکانش هست یه مثال بزنید.

amin.m1993
چهارشنبه 03 خرداد 1391, 17:23 عصر
سلام گنگ ترین مبحث برای منم delegate هستند.

لطفا اگه امکانش هست یه مثال بزنید.

من delegate رو بلدم اما یه کم با event مشکل دارم اگه کسی توضیحی در مورد event داره بگه .

اما delegate:
در حقیقت delegate آبجکتی است که رفرنسی از یک متد یا مجموعه ای از متدها رو در خودش نگه میداره. اما این مجموعه متدها بایستی از یک سری قوانین تبعیت کنند تا بتونن به لیست متدهایی که اون delegate بهشون اشاره میکنه اضافه بشن، به عبارت دیگه برای اینکه متدی به لیست Reference Method های یک delegate اضافه بشه باید با تعریف اون delegate هماهنگ باشه، به این هماهنگی و تطابق اصطلاحا امضا (Signature) میگن، پس مجوز ورود یک متد به لیست Reference Method یک delegate اینه که امضای اون متد با تعریف delegate مورد نظر یکی باشه.
هر delegate یک Invokation list داره یه لیستس از تابع ها رو در خودش (به ترتیبی که قبلا به آن اضافه شدن)
نگه میداره.به مثال زیر نگه کن:
public delegate void myDelegate(string argument);
در بالا delegate تعریف شد.طبق تعریف delegate مورد نظر، نام delegate ما myDelegate است و متدهایی را میتواند به Invocation List خود اضافه کند که :

1. هیچ مقداری بر نگردانند.
2. یک پارامتر از نوع string بگیرند.

به این متد نگاه کنید :
private void myMethod(string msg)
{
// method body
}
همانطور که در کد بالا میبینید، امضای متد myMethod با تعریف myDelegate مطابقت دارد، پس این متد میتواند به Invocation List آبجکت myDelegate ما اضافه شود
myDelegate del = new myDelegate(myMethod);
متد myMethod اولین متدی است که به Invocation List آبجکت myDelegate یعنی del اضافه میشود، برای اضافه کردن متدهای بیشتر بایستی به شیوه ی زیر عمل کنیم :
del += new myDelegate(myMethod2);
برای حذف متد از invokation list به شیوه ی زیر عمل میکنیم:
del -= new myDelegate(myMethod2);
حال اگر آبجکت delegate مورد نظر را Invoke کنیم، تمام متدهایی که در Invocation List آن موجود هستند اجرا میشوند، نحوه ی Invoke کردن یک آبجکت delegateمانند فراخوانی یک متد و ارسال پارامتر (در صورت نیاز) به آن میباشد :
del("my message value");

موفق باشید.

فرید نجفلو
چهارشنبه 03 خرداد 1391, 18:26 عصر
سلام
روش کار با Event های سفارشی:

ایجاد امضای رویداد:

public delegate void MyDlg(string param1, int param2);


ایجاد (تعریف) رویداد:

public event MyDlg MyEvent;


راه اندازی (وقوع) رویداد:

public event MyDlg MyEvent;


انتساب رویداد:

if (MyEvent != null)
MyEvent("Value1", 2);


گرداننده رویداد:

private void Form1_MyEvent(string p1, int p2)
{
MessageBox.Show("p1 is " + p1 + "\n p2 is " + p2.ToString());
}

amin.m1993
چهارشنبه 03 خرداد 1391, 19:54 عصر
سلام.
اگه میشه یه توضیحی هم در مورد event handling بدید .

فرید نجفلو
چهارشنبه 03 خرداد 1391, 20:56 عصر
سلام
کاش منظورتون رو واضح تر می گفتید

به هر حال event handling یعنی گرداندن (اداره کردن) رویداد مورد نظر
شما در یک پروژه برنامه نویسی با رویداد های زیادی در گیر می شید از رویداد شروع برنامه و باز شدن فرم گرفته تا ریزترین نکات مثلا ویرایش یک سلول در دیتا گرید
تقریبا موارد CallBack رو هم میشه تو این بحث وارد کرد

البته شما هیچ وقت نیاز ندارید که به همه رویداد ها پاسخ بدید و فقط رویداد های مورد نظر رو انتخاب می کنید

برای پاسخ به رویداد شما باید گرداننده خودتون رو برای اون رویداد ثبت (ریجستر ) یا اضافه کنید

در سی شارپ برای اینکه شما بتونید یک رویداد رو زیر نظر بگیری یعنی وقتی اون رویداد اتفاق افتاد به شما اطلاع داده بشه باید عملگر =+ و برای انصراف از ادامه دریافت (حذف گرداننده ثبت شده) از =- استفاده می کنید

برای مثال:

//Register --- Add Handler
this.Click += this.Form1_Click;
//Unregister --- Remove Handler
this.Click -= this.Form1_Click;


توجه داشته باشید که اینجا باید امضا ها یکی باشه یعنی Form1_Click باید به صورت (امضا) زیر تعریف شده باشه:
private void Form1_Click(object sender, EventArgs e)

mohammad272005
چهارشنبه 03 خرداد 1391, 22:11 عصر
در این لینک (http://barnamenevis.org/showthread.php?332834-چگونگی-ساختار-نوشتن-یک-Event-؟&p=1473181&viewfull=1#post1473181)از همین سایت، همه چیز مفصل توضیح داده شده

amin.m1993
پنج شنبه 04 خرداد 1391, 09:13 صبح
سلام
کاش منظورتون رو واضح تر می گفتید

به هر حال event handling یعنی گرداندن (اداره کردن) رویداد مورد نظر



ممنون.فکر کنم دیگه همه چی رو در مورد event یاد گرفته باشم

فقط یه سوال: آیا این گرداننده ی event هم یه تابع هست که به invokation list اضافه میشه؟و اینکه همیشه آخرین تابعی هست که به اون اضافه میشه ؟ یعنی اول توابع دیگه اجرا میشن آخر سر این تابع اجرا میشه؟