Merhaba ,
bir nesnenin örneğin bir TEdit in OnEnter olaymetodunun yazılıp yazılmadığını nasıl anlayabilirim? ben şöyle bir yol izledim ama tutarsız bir sonuç ortaya çıktı;
Aslında yapmak istediğim olay şu;
Bir form üzerindeki bütün Editlere tek bir OnEnter olay metodu atayacağım ancak başka sebeplerden dolayı eğer daha önceden bir OnEnter olayı yaratılmışsa o editin OnEnter olayı çağrıldığında hem daha çnceden yazılan hem beni OnEnter olayım çalıştırılacak.
Inherited; anahtar gelimesiyle oluşturuyorum yeni olayları ama yinede Eziyor. eğer varsa eski olaylar çalışmıyor.
Inherited atadaki olayın çalışmasını sağlar, ezmek için override etmelisiniz..Bu noktadan yaklaşmanız gerek sanırım olaya..Söz konusu formu türettiniz mi, yani atası var mı?
Merhaba ,
oldukça falza sayıda formu ve bu formlar üzerinde yine kayda değr miktarda nesneleri olan bir projem var ,
bütün formlarda li TEdit , TComboBox ve birkaç nesne türünün OnExit ve OnEnter olaylarına ortak bir fonksiyon atamak için böyle bir şeye ihtiyaç doğdu ama bu formlarda Tasarım anında yazılmış OnEnter ve OnExit olaylarına sahip nesneler de var dolayısıyla benim hem yeni atananı hemde eski oalyı çalıştırmam gerekiyor şu şekilde bir yapı kullanıyorum
procedure Tgecici.GlobalOnEnter(Sender: TObject);
Const Renk:TColor=$00B8CBDE;
begin
inherited;
if Sender is TEdit then
TEdit(Sender).Color:=Renk;
if Sender is TCurrencyEdit then
TCurrencyEdit(Sender).Color:=Renk;
if Sender is TComboBox then
TComboBox(Sender).Color:=Renk;
if Sender is TDateTimepicker then
TDateTimePicker(Sender).Color:=Renk;
if Sender is TRxDBLookupCombo then
TRxDBLookupCombo(Sender).Color:=Renk;
if Sender is TMaskEdit then
TMaskEdit(Sender).Color:=Renk;
end;
procedure Tgecici.GlobalOnExit(Sender: TObject);
Const Renk:TColor=$00D2DDDD;
begin
Inherited;
if Sender is TEdit then
TEdit(Sender).Color:=Renk;
if Sender is TCurrencyEdit then
TCurrencyEdit(Sender).Color:=Renk;
if Sender is TComboBox then
TComboBox(Sender).Color:=Renk;
if Sender is TDateTimepicker then
TDateTimePicker(Sender).Color:=Renk;
if Sender is TRxDBLookupCombo then
TRxDBLookupCombo(Sender).Color:=Renk;
if Sender is TMaskEdit then
TMaskEdit(Sender).Color:=Renk;
end;
procedure Tgecici.SetGlobalEvents(Form: TForm);
var
i:integer;
begin
for i:=0 to Form.ComponentCount-1 do
begin
if (Form.Components[i] is TEdit) or (Form.Components[i] is TComboBox) or (Form.Components[i] is TCurrencyEdit) or (Form.Components[i] is TMaskEdit) or (Form.Components[i] is TDateTimePicker) or (Form.Components[i] is TRxDBLookupCombo) then
begin
if (Form.Components[i] is TEdit) then
begin
TEdit(Form.Components[i]).OnEnter:=GlobalOnEnter;
TEdit(Form.Components[i]).OnExit:=GlobalOnExit;
end;
if (Form.Components[i] is TCurrencyEdit) then
begin
TCurrencyEdit(Form.Components[i]).OnEnter:=GlobalOnEnter;
TCurrencyEdit(Form.Components[i]).OnExit:=GlobalOnExit;
end;
if (Form.Components[i] is TMaskEdit) then
begin
TMaskEdit(Form.Components[i]).OnEnter:=GlobalOnEnter;
TMaskEdit(Form.Components[i]).OnExit:=GlobalOnExit;
end;
if (Form.Components[i] is TDateTimePicker) then
begin
TDateTimePicker(Form.Components[i]).OnEnter:=GlobalOnEnter;
TDateTimePicker(Form.Components[i]).OnExit:=GlobalOnExit;
end;
if (Form.Components[i] is TRxDbLookupCombo) then
begin
TRxDbLookupCombo(Form.Components[i]).OnEnter:=GlobalOnEnter;
TRxDbLookupCombo(Form.Components[i]).OnExit:=GlobalOnExit;
end;
if (Form.Components[i] is TComboBox) then
begin
TComboBox(Form.Components[i]).OnEnter:=GlobalOnEnter;
TComboBox(Form.Components[i]).OnExit:=GlobalOnExit;
end;
end;
end;
end;
Formların OnCreate Metodlarında hazırladığım SetGlobalEvents (Form :Tform); proceduresine bulunduğum formu geçerek form üzerindeki belitrttiğin neslnlerin olayllarını ayarlıyorum ama eski olaylar ezilip gidiyor.
Eğer form türeterek yapıyorsanız ata formun eventlerine yazdığınız kodların çalışması için Inherited anahtar kelimesi yeterlidir ve herhangi bir ezilme söz konusu olmaz..Run time esnasında mı yapılıyor yönlendirme tam olarak anlayamadım olayı..?
daha önceden bir metod bağlanmışsa OnEnter alanının değeri o metodun adresidir. Delphi, c# gibi multieventdelegate desteklemediği için bir olaya birden fazla metod bağlayamazsınız.
Ama alternatif bir yöntem olarak;
OnEnter metodu önceden atanmış sınıfları ve metodlarını bir listede tutup, sizin yazdığınız OnGlobalEnter ve OnGlobaleExit olaylarındaki kodu da listeyi Sender'a denk gelen nesneye ait önceden eklenmiş bir metod var mı yok mu diye taratarak istediğinizi yapabilirsiniz. Lakin çok uzun iş bu.
Merhaba ,
olayı , halletik kısmen , yani en azından geçerli bir adresi olup olmadığını anlayabiliyoruz ,
if @OnEnter =nil ... şeklinde , bakalım eski olayıda geçici bir değişkene alıp yeni olayın içinden önce eskisini çağırabilirsem sonuca uklaşmış oalcağım.
İlgilenen arkadaşlara teşekkürler.
Neden sonradan eski event'e ekleme yapman gereksinimini anlamadım. Ancak eski event handler içine yeni handler'ı çağıracak şöyle birşey eklemen sorunu çözmüyor mu? İlla runtime'da dinamik mi yapman lazım?
coderlord yazdı:
Neden sonradan eski event'e ekleme yapman gereksinimini anlamadım.
Bazı nesnelerin OnEXit ve ONEnter larında çeşitli hesaplamaların yapıldığı procedureler çalıştırılıyor, benim kullanacağım onEnter ve OnExit ta ise her zaman sabit olan mesela nesnenin içindeyken renginin farklı görünmesi gibi bir takım özellik ayarlamaları yapan olaların gerçekşemesini istiyorum . Çok fazla nesne olduğu için runtime da dinamik olarak olay ataması yapıyorum. aslında olmasını arzu ettiğim olay Inherited formlarda olduğu gibi Olayın eski olayın üzerinden çalışmaya devam etmesi. yani bir nevi tali olay.
Teşekkürler.
Daha iyi bir yöntem bulana kadar şöyle yapabilirsin. Bu yöntemde eski handler'ın pointer'ını bir stringlist te bir string ile ilişkilendirerek saklıyoruz ki sonradan geri çağırabilelim. Belki sana faydası olabilir.