نوشته شده توسط
mahdi_armed
سلام دوستان
من یک آرایه دارم به صورت زیر
string[] name = new string[]{"a","b","c","d","e"}
میخوام با استفاده از timer مقدایر این آرایه رو دونه دونه توی یک label چاپ کنه
و این موضوع بینهایت بار تکرار بشه
و خروجی به صورت زیر باشه
a b c d e a b c d e a b c d e a b c d e ...
یعنی به عبارتی هر ثانیه یکی از این حروف چاپ شه و تا بینهایت تکرار بشه
سلام دوست عزیز
راستش، به صورت مشخص به سوالی که داری یا جایی که گیر کردی اشاره نکردی. همین طرح موضوع هم برای من ابهام داره.
حالا من آنچه که برداشت خودم بوده رو سعی میکنم بگم، شما بخون اگه لازم شد دقیقتر بپرس.
صورت مسئله: یه آرایه ای از اسامی داریم که میخوایم در هر ثانیه یکیش به متن لیبل اضافه بشه. چطور با استفاده از تایمر هر ثانیه متنی که نوبتشه رو انتخاب کنیم و پشت سر قبلی نمایش بدیم؟ (اگر درک بنده از سوال اشتباه بود، لطفا خودتون دقیقتر بپرسین)
فرض اول: البته شما گفتی تو یک لیبل چاپ بشه ، فعلا فرض میکنیم منظور شما اینه تو یه کنترل لیبل تو فرم نمایش داده بشه. (یه حالت هم اینه که روی لیبل کاغذی چاپ بشه)
و اما بعد:
ابتدا تو کلاس اصلی فرم یه نمونه ویندوز تایمر بسازین.
private Timer printerTimer = new Timer();
تو بخش اماده سازی فرم:
1- ویژگی وقفه رو هزار میلی ثانیه (یک ثانیه) مقدار دهی کنین
2- رویداد اتمام تایمر رو بسازین
3- تایمر رو استارت کنین
printerTimer.Tick += printerTimer_Tick;
printerTimer.Interval = 1000;
printerTimer.Start();
خب تا اینجا، این شد که وقتی فرم بالا میاد، یه تایمر ساخته میشه و استارت میخوره و بعد از هزار میلی ثانیه، تیک اجراش میخوره.
پس حالا بریم تو رویداد تیکش، دو تا کار باید بکنیم.
1- متن رو چاپ کنیم.
خب باید یه اندیس چندم اون آرایه رو هم نگه داریم که بعد از نمایش، ترتیب رو گم نکنیم. لذا تو کانستراکتور فرم یه اینت بذاریم :
private int toPrintIndex = 0;
حالا داخل ائونت تیک، متن اول رو مقدار دهی میکنیم و نمایش میدیم. بعد ایندکس بعدی رو چک میکنیم، اگه از طول آرایه بیرون نزد، ادامه میدیم وگرنه صفرش میکنیم:
uxNamesLabel.Text += string.Format("{0}, {1}", names[toPrintIndex], new string(' ', 1));
toPrintIndex++;
if (toPrintIndex == names.Length)
toPrintIndex = 0;
2- مجدد تایمر رو اجرا کنیم. اینطوری بعد از اینتروال (وقفه) مجدد تایمر تیک میخوره و میاد برای چاپ و مجدد استارت و ... به قول شما تا بی نهایت (البته این بی نهایت نیست، چون به استارت و پایان فرم بستگی داره. اگه قرار باشه بی نهایت باشه بر اساس ساعت واقعی داستان فرق میکنه)
نهایتا به صورت کل میشه این:
public partial class TestForm : Form
{
private Timer printerTimer = new Timer();
private string[] names = new string[] { "Ali", "Amir", "Reza", "Naser", "Mahdi" };
private int toPrintIndex = 0;
public TestForm()
{
InitializeComponent();
uxNamesLabel.Text = string.Empty;
printerTimer.Tick += printerTimer_Tick;
printerTimer.Interval = 1000;
printerTimer.Start();
}
void printerTimer_Tick(object sender, EventArgs e)
{
uxNamesLabel.Text += string.Format("{0}, {1}", names[toPrintIndex], new string(' ', 1));
toPrintIndex++;
if (toPrintIndex == names.Length)
toPrintIndex = 0;
printerTimer.Start();
}
}