PDA

View Full Version : سوال: ساخت یک رویداد جدید برای کنترل در سی شارپ



harani
چهارشنبه 17 خرداد 1391, 23:41 عصر
یکی از دوستان پرسید که چطور می تونم برای یک کامپوننتی که خودم ساختم یک رویداد به اسم X بسازم؟ که بعد از ساخت این رویداد اون رو هندل کنم ؟

برای مثال کنترل button در سی شارپ رویدادی به اسم Click دارد که به محض کلیک کردن روی دکمه این رویداد اتفاق می افتد و تابع هندل کننده ی آن یعنی Button_Click اجرا می شود ، آیا در سی شارپ این امکان فراهم است که خودمون بتونیم رویدادی جدید برای کنترلمون تعریف کنیم ؟
اگر ممکنه با کد مثالی را بزنید . مننون از شما

emad2012
پنج شنبه 18 خرداد 1391, 12:35 عصر
به مثال زیر توجه کنید :


public class MyLabel : Control
{
public event EventHandler SetFinalText;

public string FinalText { get; set; }

public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
Invalidate();
if( base.Text.Equals( FinalText ))
SetFinalText( this, new EventArgs( ));
}
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawString(Text, this.Font, System.Drawing.Brushes.Red, new System.Drawing.PointF(10, 10));
}
}




در این کد کنترلی که ایجاد شده است رویداد جدیدی بنام SetFinalText ساختیم.

یک پروپرتی بنام FinalText هم ایجاد کرده ایم که چنانچه مقدار Text توسط کاربر برابر این مقدار ست شود این event فراخوانی میشود.
نحوه استفاده هم بصورت زیر است :
فرض میکنیم شما این کنترل را روی فرم خود گذاشته اید و پروپرتی FinalText آن را با hello ست کردهاید. همچنین در قسمت events از بخش Properties این کنترل با انتخاب رخداد SetFinalText ، مثلا کد زیر را برای زمانی که این رخداد باصطلاح fire میشود نوشته اید :


private void myLabel1_SetFinalText(object sender, EventArgs e)
{
MessageBox.Show("set final text");
}



یک textbox هم روی قرم قرار دارد که کاربر بوسیله این textbox امکان تغییر text کنترل MyLabel1 را دارد هرگاه کاربر مقدار hello را به کنترل شما ست کند event fire صورت میگیرد

sds1920
پنج شنبه 18 خرداد 1391, 19:35 عصر
ساخت رويداد خيلي ساده هست اما به نظر کار سختي مياد.
اين کار سه مرحله داره که توضيح مي دم.

1)تعريف delegate.
delegate در واقع ساختار يک تابع رو معرفي مي کنه و اين delegateي که شما تعريف مي کنيد ساختار تابع رويداد شما رو مشخص مي کنه.
معمولا ساختار رويدادها به صورت زير هست :

delegate void MyDelegateName(object sender,EventArgs e);

همونطوري که دوستمون گفتند اگه از delegateبه نام EventHandler استفاده کنيد همين ساختار رو داره ولي اگه بخواين ساختار دلخواهي تعريف کنيد بايد مثل کد بالا يک Delegate جديد بسازيد.

مرحله هاي 2 و 3 از اينم راحتره.

2)در اين مرحله بايد يک event رو با کلمه کليدي event از روي delegate که در بالا تعريف کرديد تعريف کنيد يعني :

public event MyDelegateName MyEventName;


3)مرحله سوم فراخواني event هست.دقيقا مثل فراخواني يک تابع.
بيشتر برنامه نويسايي که تازه مي خوان يک event ايجاد کنند توي اين بخش گيج مي شن.ولي اين نکته رو بدونيد وقتي شما يک کلاس مي نويسيد مالک و صاحب اون کلاس شما هستيد.پس هر کاري بخواين مي تونيد توش انجام بديد.يعني اينکه event رو هرجا دوست داشته باشيد مي تونيد فراخواني کنيد اما منطقي اين هست در جايي فرخواني کنيد که مرتبط با مسئله باشه.
يک نکته اينکه قبل از اينکه event رو فراخواني کنيد اول بررسي کنيد که null نباشه.

if(MyEventName!=null)
MyEventName(this,new EventArgs());


موفق و پيروز باشيد.

mjs1990s
یک شنبه 25 اسفند 1392, 00:13 صبح
سلام
میخوام از پورت موازی بخونم
هر بار که یه داده میاد یه بیت تو رجیستر کنتذلش یک میشه
حالا میخوام یه رویداد بسازم که با یک شدن یه عدد اتفاق بیوفته
اگه میشه کامل و ساده توضیح بدید آخه تازه واردم