PDA

View Full Version : سوال: تشخیص هندل کننده رویداد



svhasvha
سه شنبه 28 اردیبهشت 1395, 22:13 عصر
سلام به بچه ها
اول اینکه جستجوی سوالم یه خورده مشکل بود به همین خاطر اگه تاپیک تکرایه از مدیر میخوام منتقل کنه یا...
اما سوال
سوالمو در قالب یه مثال میگم که رون تر باشه
ببینید من مثلا 4 لیبل تو یه فرم دارم که هر وقت موس روشون قرار میگیره چشمک میزنن
این کارو با یه تایمر انجام میدم
خوب تا اینجا همه چیز اوکی
اما سوال اینجا که من میخوام کلا با با سه تا رویداد این کارو بکنم نه برای هر لیبل یه رویداد ویه تایمر
رویداد های زیر

label_MouseLeave
label_MouseHover
timer1_Tick
سوال اینجاست که تو رویداد تایمر چطور بفهمم کدوم یکی از لیبل ها تابع تایمر رو هندل کرده که من بگم همون لیبل رو چشمک زن کن
یعنی کلا این چند خط زیر
حتی اگه تعداد لیبلها 1000 تا هم باشه
فقط این چند خط و یه تایمر


private void label_MouseHover(object sender, EventArgs e)
{
timer1.Enabled = true;
}



private void label_MouseLeave(object sender, EventArgs e)
{
timer1.Enabled = false;
lkala.ForeColor = System.Drawing.Color.Blue;

}

private void timer1_Tick(object sender, EventArgs e)
{

if (؟؟؟.ForeColor == System.Drawing.Color.Blue)
؟؟؟.ForeColor = System.Drawing.Color.Red;


else
؟؟؟.ForeColor = System.Drawing.Color.Blue;

}

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

اینجوری میشه کد نویسی رو خیلی کوتاه کرد
دمتون گرم پیشاپیش تشکر میکنم

aryaei2000
چهارشنبه 29 اردیبهشت 1395, 00:08 صبح
سلام

با استفاده از sender این کار قابل انجام هست.
شما باید شی sender رو به نوع مورد نظر خودتون تبدیل کنید.

موفق باشید.

Mahmoud.Afrad
چهارشنبه 29 اردیبهشت 1395, 00:18 صبح
علاوه بر روش آقای aryaei2000 (http://barnamenevis.org/member.php?71621-aryaei2000) ، میتونید یک کنترل ایجاد کنید که از لیبل ارث میبره. در اون میتونید متدهای مورد نیاز رو override کنید.

svhasvha
چهارشنبه 29 اردیبهشت 1395, 08:13 صبح
سلام

با استفاده از sender این کار قابل انجام هست.
شما باید شی sender رو به نوع مورد نظر خودتون تبدیل کنید.

موفق باشید.

سلام ممنون از راهنماییت
تو رویداد لیبل از Sende استفاده کردم ولی تو تایمر نشد

private void label_MouseLeave(object sender, EventArgs e)
{
timer1.Enabled = false;
((Label)sender).ForeColor = System.Drawing.Color.Blue;

}

svhasvha
چهارشنبه 29 اردیبهشت 1395, 08:14 صبح
علاوه بر روش آقای aryaei2000 (http://barnamenevis.org/member.php?71621-aryaei2000) ، میتونید یک کنترل ایجاد کنید که از لیبل ارث میبره. در اون میتونید متدهای مورد نیاز رو override کنید.

ممنون از راهنماییتون
راجب ارث بری یه خورده توضیح میدی زیاد با این مقوله آشنا نیستم

svhasvha
چهارشنبه 29 اردیبهشت 1395, 08:32 صبح
این کد تو تایمیر خطا میده
منطقیم هست
لطفا را هنمایی کنید
private void timer1_Tick(object sender, EventArgs e)
{

if (((Label)sender).ForeColor == System.Drawing.Color.Blue)
((Label)sender).ForeColor = System.Drawing.Color.Red;


else
((Label)sender).ForeColor = System.Drawing.Color.Blue;

}

svhasvha
چهارشنبه 29 اردیبهشت 1395, 09:08 صبح
بچه ها کلا بر خودم خیلی جالب شد
چطور میشه فهمید کدوم کنترل(حالا هر چی) تایمر رو فعال کرده
که بشه بهش اشاره کرد
مثلا بگیم تو متد تایمر کنترلی که تایمر رو فعال کرده مثلا..... تکستش عوض شه یا چه میدونم....

aryaei2000
چهارشنبه 29 اردیبهشت 1395, 22:46 عصر
بچه ها کلا بر خودم خیلی جالب شد
چطور میشه فهمید کدوم کنترل(حالا هر چی) تایمر رو فعال کرده
که بشه بهش اشاره کرد
مثلا بگیم تو متد تایمر کنترلی که تایمر رو فعال کرده مثلا..... تکستش عوض شه یا چه میدونم....

ببینید رویداد Tick رو خود تایمر بر اساس بازه زمانی که بهش داده شده فعال می کنه. یه راه حل که الان به ذهنم میرسه این هست که در هربار تیک زدن تایمر بررسی کنید رنگ کدام کلید تغییر کرده و تغییرات را برای همان کلید اعمال کنید.

موفق باشید

Mahmoud.Afrad
پنج شنبه 30 اردیبهشت 1395, 00:50 صبح
میتونید در رویداد MouseEnter لیبل ، یک ارجاع به اون لیبل نگهدارید و در رویداد تیک تایمر استفاده کنید.
private Label _label;
private Timer _timer;

private List<Color> _colors;
private int _colorIndex;
private Color _originalColor;
public Form1()
{
InitializeComponent();

label1.MouseEnter += Label_MouseEnter;
label2.MouseEnter += Label_MouseEnter;

label1.MouseLeave += Label_MouseLeave;
label2.MouseLeave += Label_MouseLeave;

_timer=new Timer();
_timer.Interval = 1000;
_timer.Tick += _timer_Tick;

_colors = new List<Color> {Color.Red, Color.Blue};
}
private void Label_MouseEnter(object sender, EventArgs e)
{
_label = sender as Label;
_label.BackColor = _colors[0];
_timer.Start();
}
private void Label_MouseLeave(object sender, EventArgs e)
{
_label.BackColor = _originalColor;
_colorIndex = 0;
_label = null;
}
private void _timer_Tick(object sender, EventArgs e)
{
if (_label == null)
{
_timer.Stop();
return;
}

_colorIndex++;
if (_colorIndex >= _colors.Count)
{
_colorIndex = 0;
}
_label.BackColor = _colors[_colorIndex];
}

در مورد ارث بری هم جستجو کنید، در مورد ارثبری از تکست باکس و ... مطلب هست.

svhasvha
پنج شنبه 30 اردیبهشت 1395, 08:37 صبح
ببینید رویداد Tick رو خود تایمر بر اساس بازه زمانی که بهش داده شده فعال می کنه. یه راه حل که الان به ذهنم میرسه این هست که در هربار تیک زدن تایمر بررسی کنید رنگ کدام کلید تغییر کرده و تغییرات را برای همان کلید اعمال کنید.

موفق باشید

سلام اول اینکه ممنون از اینکه جواب سوالمو دادی
لطف کردی
حرفتون کاملا منطقی وشدنی ولی مشکل اینجاست که باز برسی کردن این که کدام کلید رنگش تغییر کرده یعنی کد بیشتر حالا شما فرض کنید تو فرم 500 لیبل باشه !!!!!!!
هدف من خلاصه نویسی تو کده
بازم ممنون از لطفی که کردی و وقت گذاشتی
یاعلی

svhasvha
پنج شنبه 30 اردیبهشت 1395, 08:41 صبح
میتونید در رویداد MouseEnter لیبل ، یک ارجاع به اون لیبل نگهدارید و در رویداد تیک تایمر استفاده کنید.
private Label _label;
private Timer _timer;

private List<Color> _colors;
private int _colorIndex;
private Color _originalColor;
public Form1()
{
InitializeComponent();

label1.MouseEnter += Label_MouseEnter;
label2.MouseEnter += Label_MouseEnter;

label1.MouseLeave += Label_MouseLeave;
label2.MouseLeave += Label_MouseLeave;

_timer=new Timer();
_timer.Interval = 1000;
_timer.Tick += _timer_Tick;

_colors = new List<Color> {Color.Red, Color.Blue};
}
private void Label_MouseEnter(object sender, EventArgs e)
{
_label = sender as Label;
_label.BackColor = _colors[0];
_timer.Start();
}
private void Label_MouseLeave(object sender, EventArgs e)
{
_label.BackColor = _originalColor;
_colorIndex = 0;
_label = null;
}
private void _timer_Tick(object sender, EventArgs e)
{
if (_label == null)
{
_timer.Stop();
return;
}

_colorIndex++;
if (_colorIndex >= _colors.Count)
{
_colorIndex = 0;
}
_label.BackColor = _colors[_colorIndex];
}

در مورد ارث بری هم جستجو کنید، در مورد ارثبری از تکست باکس و ... مطلب هست.

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

public partial class Form1 : Form
{
// تعریف یک کلاس از نوع کنترل مورد نظر
private Label lab;

public Form1()
{
InitializeComponent();
}
// ************************************************** ************************************************
private void label_MouseHover(object sender, EventArgs e)
{
//فعال کردن تایمر در رویداد مورد نظر
timer1.Enabled = true;
// انتقال اطلاعات سندر به شی ایجاد شده(فکر کنم ارث بری باشه)1
lab=((Label)sender);
}
//************************************************** ************************************************** *
private void label_MouseLeave(object sender, EventArgs e)
{
//غیر فعال کردن تایمر
timer1.Enabled = false;
//تغیر رنگ لیبلی که این رویداد را فعال کرده به حالت پیش فرض
((Label)sender).ForeColor = System.Drawing.Color.Blue;
}
//************************************************** ************************************************** ***
private void timer1_Tick(object sender, EventArgs e)
{
// چشمک زدن شی ایجاد شده که حالا اطلاعات لیبل که رویداد رو فعال کرده توشه
if (lab.ForeColor == System.Drawing.Color.Blue)
lab.ForeColor = System.Drawing.Color.Red;

else
lab.ForeColor = System.Drawing.Color.Blue;
}


}

سعی میکنم بیشتر راجب ارث بری یاد بگیرم
ممنون از لطفت شما