Ç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;
"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;
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;
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;
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;
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.