invalidate tam olarak ne işe yarar

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

invalidate tam olarak ne işe yarar

Mesaj gönderen anonymousdelphicoder »

Cümleten Selamun Aleyküm,

Konu başlığından da anlaşıldığı gibi Delphi'deki Invalidate olayı tam olarak ne işe yaramaktadır görevi nedir ve ne değildir. Bilgisi olan kardeşlerim ağbilerim varsa aydınlatabilirler mi ?

sağlıcakla.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen mrmarman »

Merhaba.

- Kemik bir bilgi olduğundan forumda bulunsun diye cevap yazıyorum. Sorunu sorarken bir proje örneği ve kullanım alanı belirtmediğin için bu gibi sorulara yere basan cevaplar vermek zordur. Sözlük bilgisini zaten google'da bulmuşsundur. Form / Grid vb. boyama bol kullandığım için elimin altında olan bir metoddur kendileri. :)

(1) Canvas operasyonları ile bir nesneye örneğin bir forma bir şeyler boyama yapıyor musun ? Bunu yapıyorsan Invalidate / RePaint konusu sana hitap eder. Aksi halde afaki bir konu olarak zihninde yer eder.

(2) Şimdi aşağıda iki örnek vericem. Bunlar birbirinin tıpkısının aynısı işe yarıyor... Sadece Invalidate'in yeri ile Repaint'İn yerini gözlemle... Sana verdiğim örnekte göreceksin ki, bir FOR döngüsü ile REPEAT UNTIL döngüsü arasındaki farka benzer.

(3) Aşağıda kullanım şekillerine -genel olarak- aykırı bir kurgu hazırladım. Sadece farkı / benzerliği gözlemleyebilmen için. Daha önce bir çok başlıkta verdiğim örnek gibi yinleyeyim, CANVAS üzerine yazı / boyama yapmak akar su üzerine boyama yapmak gibidir. Kalıcı değildir. Sizin burada kalıcı olmasını sağlamak için OnPaint eventlerinde boyama işlemini daima yenilelemeniz gerekir.

(4) Özet olarak RePaint hemen boyama işlemini hayata geçirir. Invalidate iş akışının sonunu bekler ondan sonra RePaint metodunun aynısını yapar. Bunların hiçbirini kullanmazsan tazeleme yapmaz yaptığın boyama ekranda öylece kalır ama üzerine başka bir pencere gelir ve/veya bu boyamayı ekran sınırlarının dışına taşırır da geri içeri alırsan silinirler. Bu noktada yukarıda dediğim OnPaint olayında boyamaları sürekli tazelemen gerekir. :idea:

Resim

(5) Aşağıdaki her iki button işlemi da aynı mimiği verecektir. Her ikisi de resimde gördüğün 4 tane kareyi önce ekrana basacak, procedure sorunda ekrandan silecektir.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Form1.Canvas.Brush.Style := bsSolid;
  Form1.Invalidate; // Bu satırın procedure içindeki yerine dikkatini çekeyim...

  Form1.Canvas.Brush.Color := clYellow;
  Form1.Canvas.Rectangle( 100,100, 120, 120 );
  Sleep(1000);

  Form1.Canvas.Brush.Color := clRed;
  Form1.Canvas.Rectangle( 100,140, 120, 160 );
  Sleep(1000);

  Form1.Canvas.Brush.Color := clBlue;
  Form1.Canvas.Rectangle( 140,100, 160, 120 );
  Sleep(1000);

  Form1.Canvas.Brush.Color := clGreen;
  Form1.Canvas.Rectangle( 140,140, 160, 160 );
  Sleep(1000);

  // Form1.Repaint; // Bu satırı devre dışı bıraktım...
end;

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Form1.Canvas.Brush.Style := bsSolid;
//  Form1.Invalidate; // Bu satırı devre dışı bıraktım...

  Form1.Canvas.Brush.Color := clYellow;
  Form1.Canvas.Rectangle( 100,100, 120, 120 );
  Sleep(1000);

  Form1.Canvas.Brush.Color := clRed;
  Form1.Canvas.Rectangle( 100,140, 120, 160 );
  Sleep(1000);

  Form1.Canvas.Brush.Color := clBlue;
  Form1.Canvas.Rectangle( 140,100, 160, 120 );
  Sleep(1000);

  Form1.Canvas.Brush.Color := clGreen;
  Form1.Canvas.Rectangle( 140,140, 160, 160 );
  Sleep(1000);

  Form1.Repaint; // Bu satırın procedure içindeki yerine dikkatini çekeyim...
end;
Resim
Resim ....Resim
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen anonymousdelphicoder »

sağolun örnek çok iyiydi anladım. fakat neden ne nasıl eğilimli biri olduğum için sormadan geçemicem :)

invalidate metodu en başta yazılı alt satırdaki repaint pasif modda şuan. Invalidate iş akışını bekler tamamlanması halinde RePaint gibi çizime başlar. Buraya kadar sıkıntı yok :) sorun şu Invalidate komutunu çalıştırmadığımızda ekranı silmiyor. Fakat peki invalidate i kodların en başına koydukdan sonra nasıl daha başka iş akışının olduğunu anlayıp çizimler bittikten sonra devreye giriyor ? sonuçta ınvalidate den önce bir çizim yok akış yok invalidate çalıştıktan sonra altındaki kodlara mı bakıyor kod var yok diye yada invalidate çalıştıkdan kaç sn yada ms sonra iş akışı varmı diye kontrol ediyor sonuçta bu methoddan hemen sonra çizimler baslıyor ve o satırlara atlaması ms sürer bu arada bekliyor mu ? :S
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen mrmarman »

anonymousdelphicoder yazdı:sağolun örnek çok iyiydi anladım. fakat neden ne nasıl eğilimli biri olduğum için sormadan geçemicem :)
Bu iyi bir özellik, kaybetmemeye çalışın... :bravo:

- Zaten bu konu sadece ilgilisine demekle bunu kastettim. Yere basan örnek vererek anlatmaya çalışıyorum. Siz ortaya attınız temizlemesi bana kalıyor, çünkü hala ne yapmak isteyip de Invalidate metodunu araştırdığınızı bilmiyorum.

- Konu tümüyle canvas operasyonlarıyla ilişkili olduğundan bu konudaki bilgi birikiminizi bilmeyerek, başka bir örnek ile destekleyeyim. Invalidate'e neden ihtiyacım olsun diye bir soru ile başlayalım. Anlamazsanız daha başka örnekler ile anlatmaya çalışırım ama umarım boşu boşuna zaman harcıyor olmuyorumdur. :roll: Genel kültürden ziyade çözüm odaklı olmayı tercih ederim.

- Ekranda yanıp sönen tek bir sembol olsun. Bir de ekranda bundan 1000 tane olsun. Ona da ek olarak bu 1000 tane sembol vardı ya, her biri art arda 25'er adet farklı sembolden oluşan animatif bir akış olsun. Kaosu siz düşünün.

- Şimdi resim tazelemesinde meydana gelen flicker dediğimiz ama kalıcı olmayan bozulmalar ile karşılaşılır. Bu bozulmaları yaşamamak için elimizdeki ilk enstrüman DOUBLEBUFFER := TRUE olayıdır. Ama bu da yetmez. Ne yapılır, resim ekrana basılır amaa.... OnPaint olayı tetiklenmesin ki yeniden PAINT metodu devreye girmesin istenir. Böylece üst üste ardışık Paint içerikli mesaj akışı olmayınca bizlere daha stabil ve akıcı bir görsel sağlamış olur. Paint de bir mesajdır çünkü.

- Sonuç olarak Invalidate derseniz sona kadar beklenir, Paint derseniz hemen işlem yapılır.

- Aslında önceki verdiğim örneği doğru incelerseniz anlaşılmayacak bir şey yok... Bence bir daha bakın.
Resim
Resim ....Resim
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen anonymousdelphicoder »

sevgili üstad aslında invalidate'i sormamdaki amaç projemde kullandığım bir çizimden ötürü olmasından değil yalnızca bir kaç yerde invalidate methodunu sıklıkl görüyor olmam çizim olaylarında kendimi geliştiriyorum aktif olarka GDI+ kullanıyorum.

- Sonuç olarak Invalidate derseniz sona kadar beklenir, Paint derseniz hemen işlem yapılır.

burada sorun yok sorun aslında şu bekleme işlemini nasıl algılıyor olması. Ayrıca ilk defa duydum. Dediğiniz gibi yüzlerce binlerce çizim nesnesi veya çizim var. OnPaint olayının tetiklenmesini nasıl engelliyorsunuz. Invalidate kullanarak mı? yani örneğin var olan çizimime 10 tane line ekleyeceğim her line eklemesinde RePaint yaparsam 10 kere OnPaint çalışır ve gereksiz yere çizim yapılmış olur ayrıca performans kaybıda yaşanır. Fakat Invalidate i çağırdıkdan sonra 10 tane line çizilir ve çizim işlemleri bittikten sonra tek bir kere OnPaint çalışır ve gereksiz çağrımlardan kurtuluruz. bu örneği vermeniz konuya daha da ışık kattı. Fakat dediğim gibi Invalidate i çağırdıkdan sonra 10 tane line çizim komutum var ve Invalidate methodu nasıl oluyorda 10 canvas çizim operasyonu olduğunu algılıyor sanırım Invalidate çizim mesajını kuyrukluyor Procedure çalışmayı bitirince kuyruk işliyor ?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen mrmarman »

anonymousdelphicoder yazdı:sanırım Invalidate çizim mesajını kuyrukluyor Procedure çalışmayı bitirince kuyruk işliyor ?
İşte tam anlamıyla budur... Konuyu kavramışsınız... :bravo: Her çizimde tetiklemez, en son tetikler. Böylece flicker önlenmiş olur.
Resim
Resim ....Resim
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen anonymousdelphicoder »

sayenizde hocam ilginize teşekkür ederim. birde flicker dediğiniz olay tam olarak nedir :)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen mrmarman »

- Ekrana sık aralıklarla, art arda resim basarsan gözle görünen bir kırpışma olur. Kozmetik olarak hoş görülmeyen bir durumdur. Buna grafikte ve videoda flicker denir.
- Videoda yüksek kare oranında çekim yaparken de florasan lambalar sanki voltaj düşmüşçesine titrek görünür. Buna da flicker denir.
- Yani görsel olarak bu gibi gözlemlenen her şey için bu terim kullanılır.
Resim
Resim ....Resim
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: invalidate tam olarak ne işe yarar

Mesaj gönderen anonymousdelphicoder »

Anlatımlarınız için çok teşekkür ediyorum :)
Cevapla