Başlık ilk okunduğunda anlaşılabilecek türden olmadı biliyorum. Metin kutusunun içeriği değiştiğinde içeriğine müdahale etmek pek mümkün değildir (Yani OnChange yordamında içeriği değiştirecek işlemler yapmak). OnChange olayında içeriği değiştirirseniz, oluşan değişiklikten dolayı OnChange tekrar çalıştırılır ve bu böyle sonsuza kadar devam eder. Aslında yığın (stack) dolana kadar devam eder. Yığın neden dolar derseniz, bir nevi recursive (özyineli) bir süreç başlatırsınız, yani her alt süreçten geri dönebilmek için, sürecin geri dönüş noktası (yordamın enson çağırıldığı konuma karşılık gelen bellek adresi) yığına kaydedilir ve LIFO (Last in First out) düzeniyle geri boşaltılır.
Bu tarz birşeye ihtiyaç duyduğumuzda OnChange olayı boşaltılırsa yukarıdaki gibi bir zincirleme reaksiyon başlamayacaktır. İşimiz bittiğinde de OnChange olayını eski haline geri çevirmeyi unutmamalıyız. Olayın içini boşaltmak için nil değerini kullanıyoruz. Aşağıda bir örnek yer alıyor.
1 2 3 4 5 6 7 8 9 10 11 12 |
procedure TForm1.Edit1Change(sender:Tobject); begin // OnChange olayinin ici bosaltiliyor Edit1.OnChange := NIL; // Edit1'in icerigini degistiren kodlar burada // OnChange olayi yeniden yukleniyor Edit1.OnChange := Edit1Change; end; |