Klaus Füller wrote:
Bert Freudenberg schrieb:
Klaus Füller wrote:
Ich habe einen SketchMorph (=Igel) gezeichnet, den ich per Methode aus einer anderen Klasse (=IgelFenster) auf dem Bildschirm auftauchen und herumlaufen lasse --- funktioniert wunderbar.
Aber wenn ich das Projekt sichere und anschließend in ein anderes Image lade, ist der SketchMorph nicht da.
Ich habe den Igel in einer Klassenvariablen von IgelFenster, ich habe den Igel in einer Variablen des Workspace, ich habe den Igel als globale Variable --- nichts funktioniert.
Ich habe beim Speichern des Projekts immer gesagt, ich will den gesamten "changeSet" speichern, obwohl ich nicht genau weiß, was das bedeutet.
Das speichert den Smalltalk-Code des aktuellen Changeset (also das was man im Change Sorter sieht) mit ab - normalerweise werden nur die sichtbaren Objekte gesichert. Und das ist auch das Problem: Lass den Igel einfach auf dem Bildschirm, dann klappt das mit dem Abspeichern auch.
Das ist leider nur ein Teilerfolg. Ich habe des Igel jetzt auf dem Bildschirm. Aber die Klassenvariable igelMorph ist nil.
Wenn ich einen Inspektor des SketchMorph aufrufe und dort sage 'IgelFenster igelMorph: self', dann habe ich den gewünschten Zustand wieder hergestellt (diese Methode setzt das Klassenattribut).
Ich frage mich, ob das auch automatisch geht? Wo ist diese Klassenvariable gespeichert?
Gar nicht. Es wird alles was sichtbar ist gespeichert, plus optional der Quelltext. Mehr nicht.
Du bewegst dich da an der Grenze zwischen zwei Welten - der Smalltalk-Welt mit Browser, Quelltext, etc., und der E-Zeug-Welt, die Projekte, Skripting etc. bietet. Was du willst ist einfach nicht vorgesehen.
Klassenvariablen initialisiert man üblicherweise beim Laden der Klasse in der #initialize Methode (schau dich einfach im Image um). Da kann man z.B. Bilder aus einer Datei laden. Die ganz Harten speichern ein Bild auch schon mal als Quelltext ab (siehe z.B. MenuItemMorph class >> initialize).