Ja, du hast Recht, es wird die Canvas von Image2 übergeben, somit hat es im ersten Moment wieder sein Richtigkeit, aber nur im ersten Moment. Wie gesagt, ich hab mir das vorhin nicht genauer angesehen.
Das Problem scheint hier zu liegen:
Delphi-Quellcode:
type
TI = class
private
...
s : TI; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Allerdings machst du es etwas verworren.
Zuerst wird TImage mit der Canvas erstellt. Diese Canvas ist in Wirklichkeit die Canvas der Bitmap der TImage. Somit hat das alles seine Richtigkeit.
Dann erstellst du das TI Objekt (I) und übergibst TImage Canvas als Methodenparameter
In der Methode Draw von TI übergibst du die Canvas Adresse an die Feldvariable sa. sa zeit jetzt also auf die Cnavas von TImage. Soweit noch alles gut.
Unter TI.move macht du dann aber das:
s.draw(sa,x+x2,y);
Das ist noch soweit nicht verboten, aber eine andere Instanz. Und diese Canvas geht ins leere und hat nichts mit der Image2 Canvas zu tun.
Letztendlich deklarierst du in der TI Klasse die TI Klasse. Beim ersten Zugriff knallte es nicht, da du da die Canvas der Image2 übergeben hast. Aber spätestens in TI.move hast du das Problem auf ein nicht erstelltes s Objekt zuzugreifen. Das hättest du vorher im Konstruktor machen müssen (nicht jetzt in TI.move, da du das ständig neu aufrufst). Aber wie gesagt, auch wenn du es machst, hast du dann trotz dem immer noch das Problem mit der Canvas.