PDA

View Full Version : سوال: شیئ گرایی و ایجاد Event(فوری)



Alt+F4
سه شنبه 05 خرداد 1388, 19:01 عصر
سلام؛دارم یه بازی طراحی میکنم که احتیاج دارم موقع اجرای برنامه آبجکتهایی از کلاسهای نوشتۀ خودم ایجاد کنم.ولی مشکلی که هست اینه که چطوری می شه واسه کلاسهای نوشتۀ خودم Event تعریف کنم؟
برای مثال برنامه طوریه که با زدن دکمه ای یه آبجکت جدید ایجاد میشه که در ظاهر یه button روی فرم دیده میشه(با مشخصاتی که مربوط به اون کلاسه).حالا مسئله اینجاست که چطوری رخداد Click رو می تونم واسش تعریف کنم؟
قابل توجه دوستان که من با فهمیدن این نکته تو شیئ گرایی 20 میشم:لبخند:.
خیلی مرسی

NewFoxStudent
سه شنبه 05 خرداد 1388, 19:27 عصر
با این کد میتونی بگی موقع کلیک شدن شی چه تابعی اجرا بشه

Button bt = new Button();
bt.Click += new EventHandler(MyEventHandler);

فقط باید تابع رو بنویسی
به عنوان مثال


void MyEventHandler(object sender, EventArgs e)
{
throw new NotImplementedException();
}

adinochestva
سه شنبه 05 خرداد 1388, 19:46 عصر
warning redundant code , lol !


bt.Click += MyEventHandler;

prankster
سه شنبه 05 خرداد 1388, 23:21 عصر
به صورت خلاصه برای تعریف event خاص باید نوع متدهایی که به این event اختصاص داده می شوند را به صورت delegate تعریف کنید، event را از نوع آن delegate تعریف کنید و احیانا برای ارسال argument مخصوص آن event کلاس خاصی به عنوان event argument بنویسید:



public delegate void MyClickHandler(object sender, MyClickEventArgs e);

public class MyClickEventArgs
{
public MyClickEventArgs()
{
}
}


کد بالا متدی را توصیف می کند که مقدار بازگشتی آن void است، و دو پارامتر را به عنوان ورودی قبول می کند، یکی object به عنوان ارسال کننده و دیگری argument توصیف کننده event است که از نوع کلاس MyClickEventArgs است
کافی است در بدنه کلاس event از نوع MyClickHandler تعریف کنید:



public class Class1
{
public event MyClickHandler Click;

protected void OnClick()
{
if (Click != null)
Click(this, new MyClickEventArgs());
}
}


هر جایی از بدنه کلاس (برای مثال در متد ها) که نیاز دارید event تعریف شده اجرا شود (اصطلاحا raise) شود می توانید متد OnClick را صدا بزنید. در این صورت هر کسی که به event تعریف شده از کلاس شما listen کند از اجرای آن باخبر خواهد شد.
برای مثال:



public class Class1
{
public event MyClickHandler Click;

protected void OnClick()
{
if (Click != null)
Click(this, new MyClickEventArgs());
}

private void SomeMethod()
{
OnClick();
}
}


و در کلاس دیگر از event تعریف شده به صورت زیر استفاده کنید:



public class OtherClass
{
public OtherClass()
{
Class1 Class1Object = new Class1();
Class1Object.Click += new MyClickHandler(Class1Object_Click);
}

void Class1Object_Click(object sender, MyClickEventArgs e)
{
}
}


نیاز به کمی تمرین و دقت دارد تا کاملا با آن آشنا شوید

Alt+F4
سه شنبه 05 خرداد 1388, 23:52 عصر
با تشکر از دوستان عزیز و مخصوصأ Prankster عزیز .ولی لطف می کنید بگید داخل کد شما کلاس MyClickEventArgs کجا تعریف میشه و همچنین داخل تابع MyClickEventArgs() چی نوشته می شه.و کلأ این قسمت از کد رو بیشتر توضیح بدین...؟
خیلی مچکر

salehbagheri
چهارشنبه 06 خرداد 1388, 00:09 صبح
ولی لطف می کنید بگید داخل کد شما کلاس MyClickEventArgs کجا تعریف میشه و همچنین داخل تابع MyClickEventArgs() چی نوشته می شه.و کلأ این قسمت از کد رو بیشتر توضیح بدین...؟

هر جای ممکن میتونید بنویسید! معمولا داخل یه فایل جدا بنویسید بهتره!
در کل این چیزها سلیقه برنامه نویسه!

داخل این تابع باید کارهایی که میخواهید انجام بشه رو بنویسید! البته توضیح بیشتر رو میذارم خود Prankster جان بدهند!

prankster
چهارشنبه 06 خرداد 1388, 10:11 صبح
EventArgs ها توصيف كننده event هستند، به اين معني كه پارامتري هستند كه event منتشر شده را توصيف كي كنند. در event model پيشنهادي Net. براي هر event يك Object به عنوان ارسال كننده event و يك EventArgs به عنوان توصيف كننده event منتشر شده تعريف مي شود. در هر حال هيچ الزامي به پيروي از استاندارد تعريف شده نيست، مي توان event را به گونه اي تعريف كرد كه هيچ پارامتري را ارسال نكند. براي اين كار كافي است مثلا در مثال قبل delegate تعريف شده را بدون پارانتر تعريف كنيد:


public delegate void MyClickHandler();


در صورتي كه بخواهيد از استاندارد تعريف event‌در Net. پيروي كنيد نياز به تعريف كلاسي براي توصيف event داريد كه در مثال قبل با MyClickEventArgs توصيف شده است

براي مثال فرض كنيد مي خواهيد event مربوط به click را بنويسيد، در اين صورت مثلا نياز داريد بدانيد كه click در چه location اتفاق افتاده است. اين كار با كلاس توصيفي argument ارسال شده امكان پذير است.

در مثال قبل:


public class MyClickEventArgs
{
int _x, _y;

public int X
{
get { return _x; }
}

public int Y
{
get { return _y; }
}

public MyClickEventArgs(int x, int y)
{
this._x = x;
this._y = y;
}
}


طبعا كلاس منتشر كننده event هم تغيير مي كند:


public class Class1
{
public event MyClickHandler Click;

protected void OnClick(int x, int y)
{
if (Click != null)
Click(this, new MyClickEventArgs(x, y));
}

private void SomeMethod()
{
OnClick(Control.MousePosition.X, Control.MousePosition.Y);
}
}

sinasadeghi
چهارشنبه 06 خرداد 1388, 12:37 عصر
با تشكر از جواب عالي PRANKSTER عزيز من هنوز يه كوچولو مشكل دارم.اين چيزي كه خودشون توضيح دادن رو تا يه حدودي فهميدم ولي يه مثالي به نام CHAR_CHECKER تو كتاب آموزش سي شارپ انتشارات نص كه مولفش برادلي جونزه هست كه اونو هنوز نميفهمم.امكانش هست كه اونو هم واسمون توضيح بدي؟آخه اونجا گفته كه مثلا كلاس تعريف شده MYCLICKEVENTARGS حتما بايد مشتق شده از EVENTARGS باشه و يه سري چيزاي ديگه.خيلي لطف ميكني

prankster
چهارشنبه 06 خرداد 1388, 13:27 عصر
مثال را نديده ام، اگر كد را پست كنيد شايد بتوانم كمك كنم


كلاس تعريف شده MYCLICKEVENTARGS حتما بايد مشتق شده از EVENTARGS باشه

بله، بهتر است كه اينطور باشد، گرچه هيچ اازامي نيست. اگر به كلاس EventArgs از Net. نگاه كنيد مي بينيد كه هيچ چيز خاصي در آن تعريف نشده است. اما از آنجا كه در برنامه نويسي شيئ گرا بهتر است Polymorphism رعايت شود بهتر است اين كلاس از EventArgs مشتق شود

Alt+F4
چهارشنبه 06 خرداد 1388, 15:10 عصر
با سلام دوباره
Pranksterجان از آنجایی که من برای اولین بار است که با این مفاهیم در سی شارپ آشنا شده ام،هر کاری که کردم نتونستم که مثالی رو در این رابطه اجرا کنم.اگه لطف کنی و یه Sample کوچولو ازش بزاری یا واسم ایمیل کنی ممنون میشم
amir_64ay@yahoo

prankster
پنج شنبه 07 خرداد 1388, 19:37 عصر
یک sample کوچک ضمیمه کرده ام :
برای یک UserControl وقفه MyClick تعریف شده است. در فرمی که از این UserControl استفاده می کند از فقفه MyClick استفاده می شود