Sender Değişkeni Ne Anlama Geliyor

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
RamazanG
Üye
Mesajlar: 73
Kayıt: 16 Tem 2010 03:38

Sender Değişkeni Ne Anlama Geliyor

Mesaj gönderen RamazanG »

Makale: Zarko Gajic.
Çeviri: Ramazan Gülbahar.

Olay Bağlantısı ve Sender

Button1 in OnClick olayına bakalım:

Kod: Tümünü seç

 procedure TForm1.Button1Click(Sender: TObject) ;
 begin
   ...
 end; 
Button1Click metedu TObject sınıfına Sender parametresiyle işaret etmektedir. TObject sınıfı Delphide her olayın başlangıç sınıfıdır. Tuş tıklandığı zaman, OnClick olayı için button1 çağırılır.

"Sender" değişkeni çağırma metoduna referanslık eder. Eğer Button1 Kontrolüne tıklarsan, Button1Click metodu çağrılır, Button1Click’in Sender değişkeni tıklanan button1 objesine işaret etmiştir.

Kod Paylaşımı
Sender değişkeninin özellikleri kodumuzda inanılmaz değişiklikler yapabilmektedir. Sender değişkenini değişik komponentlerle kullanabiliriz.
Örnek olarak bir button ve bir menu nesnesiyle aptalca birşeyler yapmak istiyoruz, aynı kodu iki kez yazalım.

Delphi olayları:
1. İlk obje için olayı yazalım (SpeedBar üzerine button)
2. Yeni obje ya da objeler seç - yes, ikiden fazlasını paylaşabilir(MenuItem1)
3. Object Inspector den olaylar sayfasına git.
4. Önceden oluşturulan olay işlevlerini görmek için olay yanındaki ok tuşunu tıklayın
5. Açılır listeden olayı seç ( Button1Click)

Burada Button ve menu nesnesinin OnClick olayına yeni olay atadık. Şimdi çağırdığımız komponentle herşeyi yapabiliriz. Örnek:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject) ;
 begin
   {İki tuş ve bir menü nesnesi için kod}
   ...
   {Bağzı özel kodlar:}
   if Sender = Button1 then
    ShowMessage('Button1 tıklandı!')
   else if Sender = MenuItem1 then
    ShowMessage('MenuItem1 tıklandı!')
   else
    ShowMessage('??? tıklandı!') ;
 end; 
Sender komponent adıyla aynımı kontrol et.

Not: İkinci if-then-else yapısını kullanırken Olayın nedeni Button2 ise Button2 ye ihtiyacın olacaktır.

Kod: Tümünü seç

 procedure TForm1.Button2Click(Sender: TObject) ;
 begin
    Button1Click(Button2) ;
    {Sonucu bu olacak: '??? tıklandı!'}
 end; 
IS ve AS
Tobject’in Sender’inden sonra herhangi ibr obje de Sender oluşturabilir. Sender değeri daima kontrol altında ya da komponentin izin verdiği kadardır. Komponentin type sini bularak Sender’ı test edebiliriz ya da kontrolün sözcüğü olay işleyicisini çağırır. Örnek olarak:

if Sender is TButton then
Birşeyler yap
else
Gerçekleşmezse birşeyler yap;

"is" ve "as" operatörleri kullanılarak editbox a ekle (adı Edit1) aşşağıdaki kodu OnExit olayına ekle:

Kod: Tümünü seç

 procedure TForm1.Edit1Exit(Sender: TObject) ;
 begin
   Button1Click(Edit1) ;
 end; 
burayı değiştir ShowMessage('??? clicked!') ; Button1 OnClick olayına:

Kod: Tümünü seç

 {... else}
 begin
   if Sender is TButton then
     ShowMessage('Some other button triggered this event!')
   else if Sender is TEdit then
     with Sender as TEdit do
      begin
       Text := 'Edit1Exit has happened';
       Width := Width * 2;
       Height := Height * 2;
      end {begin with}
 end; 
Tamam şimdi bir bakalım: Eğer Button1 e tıklanırsa 'Button1 clicked!' mesajı görünür, Eğer MenuItem1 tıklanırsa 'MenuItem1 clicked!' mesajı görünür. ancak Buton2 ye tıklarsak 'Some other button triggered this event!' mesajı görünür, ama Edit1 kutusundan çıktığımız zaman ne olacak, Bunu bulmasınıda size bırakıyorum.

Sonuç
Görebileceğimiz gibi Sender parametresi uygun bir şekilde kullanıldığında çok etkili olabiliyor. Varsayalım ki biz aynı olay işleyicisinin Editlerine ve Labellerine sahibiz. Eğer olay ve olayı tetikleyenle bir anlaşma yapmak istersek hareketi tetikleyen şeyin ne olduğunun farkına varmamız gerekir.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Sender Değişkeni Ne Anlama Geliyor

Mesaj gönderen Bay_Y »

Teşekkürler.
Cevapla