22 Ekim 2009 Perşembe

C# - Yer değiştiren form ; Timer ve Random Kullanımı


Tekrar merhaba. Bugün güzel ve sık kullanılan kontrollerden biri olan Timer'ı ve daha sık kullanılan class'lardan biri olan Random'u inceleyeceğiz.
Timer'ın pek fazla özelliği yoktur. Kullanım amacı bir şeyi belirli aralıklarla tekrar yapmaktır. Örnek olarak bu Event tetikleme olabilir.
Timer'ın en çok kullanılan yönü "tick event"dir. Tick Event'i verilmiş bir zaman aralığında (ki bunuda Interval ile yapıyoruz) Event'inin içinde bulunan kodları çalıştırır.

Örnek uygulama olarak gelin belirli bir zaman aralığında, mesela her 3sn de bir yer değiştiren bir form uygulaması yapalım. Hatta form'un bir saat göstergesi de olsun.

Ok hemen yeni bir Windows Form uygulaması açıp ismine timerSaat diyorum. Kolay olandan başlayalım önce saati göstereceğimiz bir yer olmalı öyle değilmi? Hemen bir Label koyuyoruz forma. Label'ın AutoSize'ını kapatıp (false), boyutları ve Font'uyla oynuyorum (süsliyim biraz). Label'ın ve Form'un BackColor özelliğini Siyah seçtim. Gelin birde Form'un Border'ını kapatalım (yani başlığı olmasın). Bunu yapmak için Form a tıklayıp F4 ile özelliklerine gidip buradan FormBorderStyle'ı "None" yapıyorum. Evet hep başlık olucak değil ya.
Güzel olduda bu seferde kapatmada sıkıntı vericek böyle olursa. Ozaman bir Button koyar bu işide hallederiz. Button'un da Text'ine "Kapat" dedik mi dadından yenmez.

Süslemeye devam. Form'a bir Label daha ekleyelim, form'un yer değiştirme olayı ile ilgili bilgi verici bir kaç kelam ederiz.
Fark etmişsinizdir, eklediğim label siyah renkte yazıldığı için görülemiyor. Rengini değiştirmek için özelliklerine gelip ForeColor (yani text rengi) özelliğini (güzel bir renktir severim) "Maroon" yapalım. Font'unu da "Verdana" ve boyutunu 14 yaptım.


(tabii ben bu screenshot'ı aldığım da faz geçip font'u verdana, boyutu 12 yapmıştım)

label2'nin textini açıklayıcı bilgileri yazalım; "Bu Form 3sn aralıklarla yer değiştirecektir! Duyurulur". Gördüğünüz gibi AutoSize'ını false yapmadığımız için sağa doğru ilerledi ve formdan dışarı çıktı. İşte AutoSize ı nasıl kullanmak gerektiğinin güzel bir örneği. Hemen AutoSize ı false yapıp, güzelce yerleştiriyoruz form'a.

Saat'in de (label1) rengi biraz mat mı oldu ne? Sanki oldu gibi. Red yapayım onu ben. Siz istediğiniz gibi takılın tabiki. Hatta baştan vereyim renkleri iyisimi.

Eveet herşey tamamda Timer'lar nerde dimi? Ok ToolBox'a gelip Components sekmesinden (aşağılara doğru) Timer'ı bulup form'umuza ekliyoruz. Gördüğünüz gibi Timer'ın form üzerinde bir görünümü yok. Sadece altta çalışan bir özelliktir. Alttan timer1'i seçip F4 ile özelliklerine bakalım biraz. Burada Timer'ın iki önemli özelliği var. Biri "Enable" diğeri ise "Interval" özelliğidir.

1 - Enable özelliği; Uygulamanın başlar başlamaz (yani çalıştığında) timer'ın aktif hale gelmesini ayarlar. Yani Enable'ı True yaparsak Form çalışır çalışmaz timer saymaya başlar. False yapılacak durumlarda; Timer'ın sizin istediğiniz anda başlamasını istiyorsanız Enable'ını False seçersiniz. Ör) Saat 20:00'da çalışsın gibi..

2 - Interval özelliği; Timer'ın çalışma sıklığını belirler. Yani Timer "tick event"ini hangi sıklıkla (saniye,milisaniye) gerçekleştirsin. Örnek olarak Interval'i 1000 olan bir timer; her 1sn de bir çalışır. (1000ms = 1sn)

Not : Timer'ın ilk "tick event" i sadece ilk çalıştığında olmak üzere Interval süresi kadar gecikir.

Ok amacımızı unutmayalım. Hem saati göstereceğiz, hem de form kendini 3sn de bir yer değiştirticek. Hmm düşünme zamanı; Sanırım buldum bize iki timer lazım. Bir tanesi saat için; Her bir saniye de bir çalışıp ekrana o anki saati yazdıracak. Ve diğeri; form'un üç saniyede bir yer değiştirmesi için.
Tamamdır ilk eklediğimiz timer1 in Interval'ini 1000, Enable'ını true, şimdi ekleyeceğimiz timer2'ın Interval'ini 3000 ve Enable'ını True yapıyoruz.



Hadi artık kod yazmaya başlayalım.Kapat Button'unu aradan çıkaralım. Button'a çift tıklayıp kodunu yazıyoruz:

private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

this : O an üzerinde olduğun Class'ı temsil eder. İleri de Class mantığına değineceğiz. Bizim için "this" = "form" şuan da. this.Close() ; Bu form'u kapat anlamına gelir. Button'a tıklandığında form kapanacak.

Saat'i yazmak için tabiki timer1'e çift tıklayıp; "timer1"in tick event'ine geliyoruz. Ve oraya şu kodları yazıyoruz. (daha önce göstermiştim; bkz: Basit Saat Uygulaması)

private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString();
        }

Şimdi çalıştırıp test edelim. İlk çalıştığında "label1" yazıyor değilmi saatin yerinde :) Evet bunun sebebi; Yukarda bahsettiğim Timer'ın Interval değeri kadar gecikmesidir. Düzeltmek için Form'a çift tıklayıp Form'un Load'u na timer1 de bulunan kodları yazıyoruz. Böylelikle form yüklendiğinde de (yani ilk açıldığında) saat'i göstersin.

Tamamdır. Sıra geldi yer değiştirmeye; Bunun için timer2'ye çift tıklayıp tick event'ine gidiyoruz.Şimdi her 3sn de bir ne olmasını bekliyorduk? Yer değiştirmesini değilmi. Peki bunu nasıl yapar sizce? Şöyle söyliyeyim. Ekranda bulunan herşeyin bir Kordinat'ı vardır aslında bilgisayarda. Neyin nerede olduğunu sürekli saklar ve günceller. İşte biz bunu değiştirerek istediği yerlere gitmesini (tabi belirli sınırlar dahilinde) sağlayacağız. Ve tabi bu değer sürekli değişmeli. Yani sabit kalırsa hep aynı yerinde kalmaz mı? Bu tür durumlar için C#'ta Random class'ını kullanırız. Yalnız Random bir class olduğundan yeni bir kopyası üretilmeden özellikleri kullanılamaz.

Şimdi ilk başta bir Random kullanılmak isteniyorsa kopyalanmalıdır demiştik. Aynen şunları yazıyorum: Random rastgele = new Random();
rastgele nesnemi " . " ile çağırarak özelliklerini artık kullanabilirim.
VS size zaten yardımcı olacaktır yazarken (IntelliSense).


Şimdi bir x sayısı tanımlayalım ve bu x sayısını rastgele sayılar üretsin. Ve timer2 nin içinde olsun ki her 3sn bir bu rastgele üretme işlemi gerçekleşsin.

int x = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Width - this.Width);

random üretmek için kopyaladığımız rastgele yi çağırır ve onun "Next" özelliğini kullanırız. Next özelliği; ( ) Parantezleri arasına aldığı değer aralığında rastgele pozitif sayılar üretir. Ör) Next(50) mesela, 1,5,49,30 gibi sayılar üretebilir. Fakat Next tek başına çalışmaz. Mutlaka onun çağırdığı bir kopyalanmış Random nesnesi olmalı. Bizim nesnemiz  burada "rastgele".

Screen.PrimaryScreen.WorkingArea; ise o an ekranda çalışılan alanı tanımlar. Eğer biz ekranın genişliğinden (width) kendi form'umuzun genişliğini çıkarırsak geriye bizim form'umuzun ekranın dışına çıkmadan rahatça sağ sol yapabileceği bir alan oluşur. Bunuda random lar ve form'un left ine verirsek iş tamamdır.

Peki nasıl atayacağız bu değeri? "this.left" ve "this.top" bunlar bize form'u (yani this'i) yer değiştirmemizi sağlayacak özellikleridir.

Örneğin: this.left = 10; yapın ve çalıştırıp gözlemleyin.
veya
       this.top = 200; yapıp gözlemleyin. Daha iyi anlayacaksınızdır.
Ama ben bu top ve left özelliklerini sürekli değişik değer gelmesini istiyordum öyle değilmi? Çünkü her timer2 "tick" olduğunda (yani 3sn de bir) yeni bir this ve top değerinin form'un yerini değiştirmesini istiyorum


this.Left = x;

Aynı şekilde yükseklik (y ekseni) için de yapıyorum.

int y = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Height - this.Height);

Önce bir rastgele y sayısı üretim bunu form'un yukarıdan olan uzaklığı olarak atıyorum.

this.Top = y;

Yalnız burada Width değil Height kullanıyoruz (yükseklik ayarı için) unutmayın.

Çalıştırıp gözlemliyoruz. Unutmayın ilk tick interval süresinden sonra çalışır (yani 3sn sonra tetiklenir).

Şimdilik bukadar. Tekrar görüşmek üzere...

KODLAR:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace blogTimerSaat
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            Random rastgele = new Random();
            int x = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Width - this.Width);
            this.Left = x;
            int y = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Height - this.Height);
            this.Top = y;
        }
    }
}

Link : blogTimerSaat

1 yorum:

  1. TITanium Tail - Titsanium Art
    Titsanium Tail is the tail ford titanium ecosport of Titsanium titanium car Art, t fal titanium inspired by the ancient Chinese culture. micro touch trimmer Titsanium titanium mig 170 has an intricate design.

    YanıtlaSil