Procedure parametresi (Sender:Tobject)

Başlatan bunalmis, 11 Ocak 2010, 17:23:59

z

Parametresi (Sender:Tobject) olan procedure'u fonksiyondan cagirirken Sender kismina ne yollamamiz gerekiyor?

Ornegin forum uzerindeki buton tiklandiginda calisan procedure basligi asagidaki gibi;

procedure Tform1.BaslaClick(Sender:Tobject):
begin
.....
.....
end;

// Bu proceduru asagidaki gibi bir fonksiyondan cagirmak istiyorum

function fonk():boolean;
begin
         BaslaClick();
end;


Ancak BaslaClick(????) olmasi gerekiyor. Buradaki ??? yerine ne koymaliyim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

controller

Tobject türünden bir nesne.

myobject: Tobject;

fonk(myobject);
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Klein

@controller'e ek olarak

eğer  çağırdığınız rutinin içerisinde sender ile ilgili bir özellik kullanmayacaksanız , sender ile işiniz olmayacaksa
fonksiyon(nil) şeklinde çağırabilirsiniz.

eğer bu rutini herhangi bir komponentin  olayı içerisinden çağırıyor iseniz , yani zaten elinizde "sender" parametresi varsa
örn:
procedure TForm1.Button2Click(Sender: TObject);
begin
  caption:=timetostr(now);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
      button2click(sender);
end;

şeklinde çağırabilirsiniz.

sekoli

Bunlara da ek olarak eğer Sender'la işiniz olmayacaksa, yaygın kullanım

 BaslaClick(Self);


şeklindedir.

z

Cevaplar icin teşekkür ederim.

Programda forum uzerinde tasarim asamasinda componentler tiklandiginda procedure basliklari otomatik olarak olusuyor ve parametre kismina bu Sender otomatik olarak yerlestiriliyor.

Bugune kadar Sender parametresi ile hic isim olmadi.

Bu parametre ile neler yapilabilir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sekoli

Sender parametresi, sözkonusu Event'i hangi object çağırdı ise onu ifade eder. Bir çok işe yarayabilir, ama sanırım en belirgini şudur.
Farzedelim ki bir formun üzerinde 100 adet düğme var ve hepsinin OnClick event i aynı fonksiyona işaret ediyor.

 if (Sender as TButton).Name = '....'  then ...


gibi bir kullanımla, kullanıcının hangi düğmeye bastığını anlayabilirsiniz.

Daha fazla bilgi için :
http://delphi.about.com/od/objectpascalide/a/sender.htm

Klein

Alıntı yapılan: "bunalmis"Cevaplar icin teşekkür ederim.

Programda forum uzerinde tasarim asamasinda componentler tiklandiginda procedure basliklari otomatik olarak olusuyor ve parametre kismina bu Sender otomatik olarak yerlestiriliyor.

Bugune kadar Sender parametresi ile hic isim olmadi.

Bu parametre ile neler yapilabilir?
Hocam sender göndericinin kimliğidir. Sanırım  TLabel ile ilgili sorunuza gönderdiğim cevabı incelemediniz. Orada "sender" parametresinin kullanımına güzel bir örnek vermiştim.
procedure TForm1.Label4Click(Sender: TObject); 
begin 
   compindex:=tlabel(sender).ComponentIndex; 
   tlabel(sender).Caption:=''; 
end; 

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 
  var  targetComponent:tcomponent; 
begin 
      TargetComponent:=components[compindex]; 
      Tlabel(TargetComponent).Caption := Tlabel(TargetComponent).Caption+key; 
end;


Örneğin:
10 tane  butonunuz var.  Hangi butona basarsanız , o butonun form üzerindeki koordinatın bir Label nesnesinde görünmesini istiyorsunuz.
Eğer  "Sender" parametresini kullanmaz iseniz  her  buton için ayrı onClick olayı yazmanız gerekir.  yani kodunuz şuna benzer
procedure TForm1.Button1Click(Sender: TObject); 
begin 
         Label1.Caption:=inttostr(Button1.top) +':'+ inttostr(Button1.left); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
         Label1.Caption:=inttostr(Button2.top) +':'+ inttostr(Button2.left); 
end; 

procedure TForm1.Button3Click(Sender: TObject); 
begin 
         Label1.Caption:=inttostr(Button3.top) +':'+ inttostr(Button3.left); 
end;


ama  "Sender" parametresini kullanırsanız tüm butonların "onClick" olayını aynı rutinle halledebilirsiniz.
procedure TForm1.ButtonClick(Sender: TObject); 
begin 
         Label1.Caption:=inttostr(TButton(sender).top) +':'+ inttostr(TButton(sender).left); 
end;

z

Geriye donuk yazdigim programlari da editleyip sender parametresini kullanmaya basladim.

Eskiden form uzerinde  tiklanan her nesne kendine ait proceduru cagiriyordu. Bu da yazilimda bir suru procedure basligi, program parcasi olusturuyor ve oldukca kalabalik bir goruntuye neden oluyordu.

Simdi nesneleri gruplamaya basladim. Herhangi bir grubun uyesi o grubun procedurunu cagiriyor ve procedure icinde sender parametresinden kimlik testi yapiyor ve kimlige ait kodu calistiriyorum.

Bu yapi berebarinde daha cok anlasilirligi ve sadeligi getirdi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com