PDA

View Full Version : عدم فهم sender



ordebehesht
یک شنبه 13 مرداد 1392, 22:48 عصر
دوستان سلام یه منبع جالب یا فیلم ویدیو در مورد object sender‌و e‌در واقع کلاسهایی که e رو اراعه میدن بگین خواهشن اگه توضیح میدین کامل باشه

hojjatshariffam
یک شنبه 13 مرداد 1392, 23:49 عصر
عزیز من اون دوتا اشیاعی از دو کلاس object و EventArgs هستند
مثلا اگر بر روی باتنی کلیک کردی خود باتن در sender و عمل انجام شده (یه سری پارامتر های کمکی)در e قرار می گیره
تعریفشون هم در موقع تعریف deligate هستش ، البته شما منظورتون در متد رویداد ها باشه فکر کنم
خب دیزاینر ویزال استودیو وقی می خواد یه متد رویداد برای شما بسازه (مثلا کلیک) میاد اینارو براتون درست می کنه که در تعریف دلیگیت onClick براش تعریف شده
شما ازش استفاده کنید فعلا
اگرم می خواین بدونید که چطور ایجاد می شن باید برید مباحث پیشرفته رو بخونید ،
فعلا برای تست می تونید مثلا در رویداد کلیک به این صورت تست کنید و بشناسیدش

MessageBox.Show(((Button) sender).Name);

ordebehesht
دوشنبه 14 مرداد 1392, 00:29 صبح
میدونم delegate هستش مفهوم دلگت رو میدونم ولی میشه برای منابع پیشرفته منبع لینک بدی

hojjatshariffam
دوشنبه 14 مرداد 1392, 01:31 صبح
تو کتاب مهندس هاشمیان یه کوچولو توضیح داده ، برو اول اونو بخون بعد دنبال مطالب پیشرفته تر برو

مهرداد صفا
دوشنبه 14 مرداد 1392, 01:35 صبح
با سلام.
همونطور که در اینجا (http://barnamenevis.org/showthread.php?371479-%D9%83%D8%AF%D9%87%D8%A7%D9%8A-%D8%AB%D8%A7%D8%A8%D8%AA-%D9%87%D8%B1-%D9%BE%D8%B1%D9%88%DA%98%D9%87) بحث شده sender همیشه به شی فرستنده رویداد اشاره می کند. فرستنده رویداد به آبجکتی اطلاق می شود که عامل اصلی رویداد بوده و یا رویداد مثلا روی این کنترل اتفاق افتاده است. مثل کنترلی که کلید روی آن زده می شود (در رویدادهای کیبورد)، کنترلی که موس روی آن حرکت می کند و حتی مثلا WebBrowser بعد از ورود به آدرس جدید رویداد DocumentCompleted را تولید می کند و خود WebBrowser در این رویداد sender محسوب می شود.

ordebehesht
چهارشنبه 16 مرداد 1392, 00:28 صبح
به عبارتی میشه با استفاده از Sender رویداد مورد نظر رو به به یک کنترل دیگه فرستاد و با استفاده از e به اون دسترسی داشت

مهرداد صفا
چهارشنبه 16 مرداد 1392, 00:49 صبح
نیاز استفاده از e یا EventArgs زمانی است که نیاز به جزئیاتی همراه با رویداد باشد. مثلا در رویدادهای کیبورد کلیدهای فشرده شده و در رویدادهای موس، مکان موس می توانند نمونه هایی از این جزئیات باشند. پس e جزئیاتی مربوط به چگونگی اتفاق افتادن رویداد را با خود دارد که طبیعاتا این جزئیات بسته به نوع رویداد می توانند متغیر باشند.
اما نیاز به وجود sender زمانی حس می شود که مثلا شما از یک متود برای هندل کردن چندین رویداد استفاده می کنید. فرض کنید که چند Textbox دارید که قصد دارید ورودی آنها را به اعداد محدود کنید و به هر دلیل امکان استفاده از وراثت نیست. در چنین وضعیتی بازنویسی رویداد KeyPress در تک تک Textbox ها می تواند کار خسته کننده ای باشد درحالیکه شما می توانید از یک متود برای هندل کردن رویداد همه Textbox ها استفاده کنید و در صورت نیاز با استفاده از sender به کنترلی که KeyPress بر روی آن اتفاق افتاده دسترسی داشته باشید.
در کد زیر از یک متود برای هندل کردن click سه button استفاده شده که بررسی رفتار آن می توان به درک بهتر مساله کمک کند:


public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

button1.Click += (EventHandler)ButtonClicked;

button2.Click += (EventHandler)ButtonClicked;

button3.Click += (EventHandler)ButtonClicked;

}



void ButtonClicked(object sender, EventArgs e)

{

MessageBox.Show((sender as Button).Name+ " clicked!");

}



}

مهرداد صفا
چهارشنبه 16 مرداد 1392, 02:26 صبح
اشتباهی که در خیلی از کدها دیده می شود این است که برخی برای فراخوانی هندلر یک رویداد دیگر از sender و e مربوط به رویداد جاری به عنوان پارامتر استفاده می کنند.
به عنوان مثال اگر قصد دارید با فشرده شدن کلید enter روی textbox1 متود هندلر رویداد Button1.Click را فراخوانی کنید، عمل زیر خطاست:
1
2
3
4
5
6
void Textbox1_Keydown(object sender,KeyEventArgs e)
{
//invalid method!
Button1_click(sender,e);//dont use it.
}

صرف نظر از خطایی که ممکن است compiler با این قضیه داشته باشد، sender در Textbox1_Keydown به textbox1 اشاره می کند در حالیکه توقع میرود sender در Button1_click نماینده Button1 باشد.
از طرفی e آرگومنت رویداد keyDown است و جزئیات این رویداد را با خود دارد نه هر رویدادی پس پاس دادن آن به رویداد click کار صحیحی نیست. بلکه باید به شیوه ای شبیه به زیر عمل شود:
1
2
3
4
5
void Textbox1_KeyDown(object sender,KeyEventArgs e)
{
Button1_click(Button1,new EventArgs());
}

mousa1992
چهارشنبه 16 مرداد 1392, 02:56 صبح
توصیه میکنم در مورد نحوه ی تعریف رویداد مطالعه کنی ( خودتون رویداد جدید ایجاد کنید نه استفاده از رویدادها ) . باعث بازتر شدن دیدتون میشه و کاملا موضوع رو درک میکنید

ordebehesht
چهارشنبه 16 مرداد 1392, 19:56 عصر
توصیه میکنم در مورد نحوه ی تعریف رویداد مطالعه کنی ( خودتون رویداد جدید ایجاد کنید نه استفاده از رویدادها ) . باعث بازتر شدن دیدتون میشه و کاملا موضوع رو درک میکنید


ممنون میشم اگه امکان داره منبع لینک فیلم بشه من هنو گیجم هنو نتونستن درک کنم تو این حتالت کلافه مبشم ولی باید تا تش برم تا بفهمم

Mahmoud.Afrad
چهارشنبه 16 مرداد 1392, 20:15 عصر
از چیش کلافه اید؟ sender شئ ایست که رویداد را فراخوانی میکنه.
آموزش دلیگیت در امضای مدیر بخش آقای جمشیدی(gwbasic) هست.

ordebehesht
چهارشنبه 16 مرداد 1392, 22:00 عصر
دلگیت رو بلذم ولی نمیگیرم مطلب و برای یه کابوس شده

ordebehesht
چهارشنبه 16 مرداد 1392, 22:01 عصر
اصلا handler چیه

mousa1992
چهارشنبه 16 مرداد 1392, 23:25 عصر
این لینک (http://barnamenevis.org/showthread.php?412973-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%AF-%D8%AF%D8%B1-5-%D8%AF%D9%82%DB%8C%D9%82%D9%87)و ببین ایشالا که حل میشه

موفق باشی