کنترل Timer

کنترل Timer، دستور یا دستورات خاصی را در بازه‌های زمانی خاصی، که در خصوصیت interval مشخص می‌شود، اجرا می‌کند. به عنوان مثال، اگر بخواهید نامتان را هر 5 ثانیه یکبار چاپ کنید، می‌توانید از این کنترل استفاده نمایید. کنترل Timer از کنترل‌های غیر بصری است و در قسمت Component Tray قرار می‌گیرد. این کنترل خصوصیات زیادی ندارد.

وقتی که خصوصیت Enabled را برابر true قرار دهید کنترل شروع به کار و اگر برابر false قرار دهید متوقف می‌شود. خصوصیت interval مقدار زمانی که باید بگذرد تا دستور یا دستورات داخل رویداد tick فراخوانی شود را مشخص می‌کند. رویداد tick رویداد پیشفرض کنترل تایمر است. به این نکته توجه کنید که مقدار این خصوصیت (interval) بر حسب میلی ثانیه مشخص می‌شود. به عنوان مثال قرار دادن مقدار 5000 در جلوی این خصوصیت به معنای این است که رویداد tick هر 5 ثاینه یکبار فراخوانی شود. به یک نمونه برنامه که در آن از کنترل timer استفاده شده است توجه نمایید. برنامه شامل یک دکمه است که در جهت بالا و پایین فرم حرکت می‌کند. یک پروژه Windows Application با نام TimerDemo ایجاد کنید. یک دکمه را در وسط فرم مانند شکل زیر قرار دهید.
timer-control-01
یک کنترل Timer را به روی فرم بکشید. این کنترل در قسمت Component جعبه ابزار قرار دارد. همانطور که قبلاً گفته شد این کنترل در قسمت Component Tray قرار می‌گیرد.
timer-control-02
کنترل timer را انتخاب و خاصیت interval آن را برابر 50 و خاصیت Enabled آنرا برابر true قرار دهید :
timer-control-03
این کار باعث می‌شود زمانی که برنامه اجرا شود کنترل timer شروع به کار کند. روی کنترل timer دابل کلیک کنید تا کنترل کننده رویداد پیشفرض آن که همان رویداد tick است ایجاد شود. به یاد داشته باشید دستورات داخل این کنترل کننده رویداد هر 50 میلی ثانیه یکبار فراخوانی می‌شوند. یک نمونه متغیر به شکل زیر در کلاس فرم تعریف کنید. این متغیر، برای نگهداری تعداد پیکسل‌هایی است که، در هر بار فراخوانی رویداد tick، پیمایش می‌شوند.

private int velocity = 5;

کدهای زیر را به کنترل کننده رویداد tick اضافه کنید.

private void timer1_Tick(object sender, EventArgs e)
{
    if (button1.Top <= 0 || button1.Bottom > this.ClientSize.Height)
        velocity = -velocity;

    button1.Top += velocity;
}

وقتی که رویداد tick فراخوانی می‌شود دستورات بدنه آن اجرا می‌شوند. در دستور شرط ابتدا بررسی شده است که دکمه به پایین فرم رسیده است یا به بالای فرم؟ برای اینکه مشخص کنیم که دکمه به بالای فرم چسبیده است از خاصیت Button.Top استفاده کرده‌ایم. این خصوصیت مقدار مختصات y گوشه‌ی بالا و چپ دکمه را مشخص می‌کند.
اگر مقدار این خصوصیت برابر یا کوچکتراز 0 باشد به این معنی است که دکمه به بالای فرم رسیده است. به این نکته توجه کنید که مبدأ مختصات در فرم گوشه بالای و سمت چپ فرم است. قسمت دوم شرط بررسی می‌کند که آیا دکمه به قسمت پایین فرم رسیده است یا نه? برای این کار از خاصیت Button.Bottom که مختصات y دکمه را بر می‌گرداند استفاده کرده‌ایم. سپس بررسی کرده‌ایم که این مقدار را با مقدار خصوصیت Height (ارتفاع) فرم مقایسه کرده‌ایم. برای بدست آوردن ارتفاع فرم از خصوصیت Height که خود در خاصیت Form.ClientSize قرار دارد استفاده کرده‌ایم. اگر هر کدام از شرط‌ها درست باشند به راحتی با قرینه کردن مقدار velocity جهت حرکت دکمه را تغییر می‌دهیم (velocity-). اگر دکمه به سمت بالا فرم حرکت کند (به این خاطر که 5 پیکسل به سمت بالا حرکت می‌کند) و به بالای فرم برسد جهت حرکت آن تغییر می‌کند. برنامه را اجرا کنید و نتیجه را مشاهده کنید. به یک مثال ساده دیگر در مورد عملکرد این کنترل توجه کنید. یک پروژه Windows Application جدید ایجاد کنید و یک کنترل RichTextBox و یک کنترل Timer بر روی فرم قرار دهید. خاصیت Interval کنترل Timer را برابر 1000 و خاصیت Enabled آن را برابر True تنظیم کنید :
timer-control-04

روی کنترل timer دابل کلیک کنید و در داخل رویداد tick آن کدهای زیر را بنویسید :

private void timer1_Tick(object sender, EventArgs e)
{
    richTextBox1.Text += "Hello World!\n";
}

با تنظیم خاصیت Interval بر روی 1000 هر یک ثانیه یک بار متن !Hello World در داخل کنترل RichTextBox چاپ می‌شود. برنامه را اجرا و نتیجه را مشاهده کنید :
timer-control-05