Canvas does not allow drawing” hatası tuval çizime izin vermiyor gibi bir anlam taşıyor. Tuval ressamların resimlerini çizdikleri yüzeye verilen ad burada ise programdaki bileşenlerin görsel kısımlarına (arabirim) karşılık geliyor.

Canvas hatası iki nedenden kaynaklanabilir. Ya çizim yapacak kaynağınız kalmamıştır ya da multithread bir programda tuvali boyamaya çalışan iki fırça birbiriyle çakışıyordur. Dediğimiz gibi bu Canvas hatası ençok multithread programlarda karşımıza çıkıyor. VCL bileşenleri thread-safe değillerdir. Bu yüzden bileşenlerin görsel özellikleriyle işlem yaparken Synchronize fonksiyonunu kullanmalısınız. Synchronize’a parametre olarak verdiğiniz alt program thread-safe olarak çalıştırılır. Yani canvas sorunu çıkartacak görsel işlemleri güvenli bir zamanda icra ettirmiş olursunuz. Aşağıdaki thread örneğini inceleyebilirsiniz.

unit Unit1;
interface
uses
Classes;
type
MyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ Onemli: VCL ve CLX nesnelerinin metod ve özellikleri
Synhronize içinden çağırılarak kullanılmalıdır. Örneğin,
Synchronize( MemoyuGuncelle);
ve MemoyuGuncelle su sekildedir,
procedure MyThread.MemoyuGuncelle;
begin
Memo1.Text := 'Thread içinde güncellendi';
end; }
{ MyThread }
procedure MyThread.Execute;
begin
{ Place thread code here }
end;
end.

Multithread programlarınızda mesaj kutusu kullanmanız gerektiğinde Synchronize kullanmak pratik olmayabilir. Bunun için Delphi’nin Messagebox fonksiyonunu kullanabilirsiniz. Messagebox’ın diğer diyalog kutularından farkı thread-safe olmasıdır. Ayrıca Delphi’de multithread programlama konusunda okumanızı şiddetle tavsiye edeceğim bir makale dizisi burada.

Canvas (tuval) hatasının birkaç oluşma nedeni olabilir. Burada GDI (Graphic Device Interface) kaynaklarının aşırı tüketilmesi durumunda oluşabildiği de yazmakta. GDI,  çizgiler, eğriler, fontların yorumlanması, renklerin yönetilmesi gibi işlerden sorumlu, işletim sistemi çekirdeği ile çıktı aygıtı (ekran kartı) arasında görev yapan bir Windows bileşeni. Bu sorundan sıyrılmak için programdaki görsel bileşen sayısını azaltmak, sistem belleği miktarını veya ekran kartı belleğini artırmak çözüm yolu olarak gözüküyor.

Umarım canvas hatasını ayıklamayı becerebilirsiniz.

CEVAP VER