42 | | Der Dreh und Angelpunkt ist hier die Klasse `Form`. Die Basis von `Form` ist die "Squeak Canvas", eine Bitmap, die Bilder enthält, oder auf der gezeichnet werden kann. Diese Objekte können dann in einem `ImageMorph` verwendet werden. Bei größeren oder vielen Bildern lohnt ein Blick auf die Klassenseite von Form. Da gibt es eine Methode, die aus einer Datei direkt ein Form-Objekt lädt. Ähnliches findet sich auch auf den Klassenseiten von den Klassen `PNGReadWriter`, `JPEGReadWriter`, `GIFReadWriter und weitere für spezielle Bildformate. |
43 | | |
44 | | Mit Klassen wie `FileDirectory` oder `FileUrl` kann im Dateisystem navigiert werden. Hierbei gilt es auch zu bedenken, dass die Trennzeichen in den Pfaden je nach Betriebssystem unterscheidlich sind: "\" bei Windows, Linux und OSX benutzen "/"). Für Plattformunabhängigkeit könnt ihr `FileDirectory>>slash` oder `FileDirectory class>>slash` benutzen (siehe [#platform-path-separator Plattformunabhängige Dateizugriffe]) |
| 42 | |
| 43 | ==== Anzeigen von Bildern ==== #images-in-squeak |
| 44 | |
| 45 | Folgender Code zeichnet das Bild <Squeak-Image>/Contents/Resources/anImage.jpg in einen `ImageMorph`: |
| 46 | |
| 47 | {{{ |
| 48 | ImageMorph new |
| 49 | image: (Form fromFileNamed: 'anImage.jpg'); |
| 50 | openInHand. |
| 51 | }}} |
| 52 | |
| 53 | Wenn das Bild in einem Unterordner liegt, ermöglicht die Klasse `FileDirectory` plattformunabhängige Dateipfade ("\" für Windows, "/" für Linux und OS X) |
| 54 | |
| 55 | {{{ |
| 56 | ImageMorph new |
| 57 | image: (Form fromFileNamed: (FileDirectory uri: 'folder/anImage.jpg') fullName); |
| 58 | openInHand |
| 59 | }}} |
| 60 | |
| 61 | Der Dreh- und Angelpunkt ist hier die Klasse `Form`. Die Basis von `Form` ist die "Squeak Canvas", eine Bitmap, die Bilder enthält, oder auf der gezeichnet werden kann. Diese Objekte können dann in einem `ImageMorph` verwendet werden. |
| 62 | |
| 63 | Es gibt in Squeak den `ImageReadWriter` als abstrakte Klasse und dazu verschiedene Implementierungen für z.B. BMP und PNG (`PNGReadWriter`, `BMPReadWriter`). Auf Klassenseite von `ImageReadWriter` findet sich dann auch `ImageReadWriter class>>formFromFileNamed:`. |
| 64 | |
| 65 | {{{ |
| 66 | ImageMorph new |
| 67 | image: (ImageReadWriter formFromFileNamed: (FileDirectory uri: 'folder/anImage.jpg') fullName); |
| 68 | openInHand |
| 69 | }}} |
| 70 | |
| 71 | |
| 72 | ==== Speichern und Austauschen von Bildern ==== |
70 | | Das Stepping Model von Morphic ist relativ einfach und basiert auf einem Prozess, welcher alle stepping Methoden ausführt, wenn ihre `Morph>>stepTime` abgelaufen ist. Im Umkehrschluss heißt das aber auch je mehr `Morph>>step` Methoden je häufiger aufgerufen werden, desto mehr Zeit wird zwischen einzelnen Schritten benötigt (da mehr berechnet wird). Die `#stepTime` gibt dabei einen Wunschwert an, nach dem die `#step` Methode wieder aufgerufen werden soll. Nun kann es aber sein, dass die `#step` Methoden soviel zu tun haben (oder andere Prozesse), dass die Überprüfung nur alle 50 ms ausgeführt wird und somit kann eine Zeit von 33 ms nicht garantiert werden. Allerdings wird durch die beschriebene Bewegung eine explizite `#runStepMethods Message an die Welt gesendet, welcher die Abarbeitung aller steps auslöst. Das heißt der UI Prozess löst bei seiner Reaktivierung eine neu Berechnung aus. |
| 97 | Das Stepping Model von Morphic ist relativ einfach und basiert auf einem Prozess, welcher alle stepping Methoden ausführt, wenn ihre `Morph>>stepTime` abgelaufen ist. Im Umkehrschluss heißt das aber auch je mehr `Morph>>step` Methoden je häufiger aufgerufen werden, desto mehr Zeit wird zwischen einzelnen Schritten benötigt (da mehr berechnet wird). Die `#stepTime` gibt dabei einen Wunschwert an, nach dem die `#step` Methode wieder aufgerufen werden soll. Nun kann es aber sein, dass die `#step` Methoden soviel zu tun haben (oder andere Prozesse), dass die Überprüfung nur alle 50 ms ausgeführt wird und somit kann eine Zeit von 33 ms nicht garantiert werden. Allerdings wird durch die beschriebene Bewegung eine explizite `#runStepMethods` Message an die Welt gesendet, welcher die Abarbeitung aller steps auslöst. Das heißt der UI Prozess löst bei seiner Reaktivierung eine neu Berechnung aus. |
131 | | Bei größeren oder vielen Bildern ist `Form` interessant. Eine Datei lässt sich in eine `Form` mit `Form class>>importImage` laden. |
132 | | Ähnliches findet sich auch auf den Klassenseiten von den Klassen `PNGReadWriter`, `JPEGReadWriter`, `GIFReadWriter` und weitere für spezielle Bildformate. |
133 | | |
134 | | |
135 | | Mit Klassen wie `FileDirectory` oder `FileUrl` kann im Dateisystem navigiert werden. |
136 | | Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich |
137 | | sein können (/ oder \, ). Für Plattformunabhängigkeit könnt ihr `GRPlatform>>pathSeparator` benutzen. |
138 | | |
139 | | |
140 | | Wenn Bilder in Methoden (Was nicht unbedingt zu empfehlen ist) |
141 | | und damit im Image gespeichert werden sollen, können Array-Repräsentationen |
142 | | gewonnen werden, indem das Bild, wie oben beschrieben, in eine Form geladen wird |
143 | | und aus dieser dann das Array (z.B. `Form>>storeOn`). |
| 158 | Wenn Bilder in Methoden und damit im Image gespeichert werden sollen, können Array-Repräsentationen gewonnen werden, indem das Bild, wie oben beschrieben, in eine Form geladen wird und aus dieser dann das Array (z.B. `Form>>storeOn`). |
329 | | Unabhängige Trennzeichen bekommt ihr mit den Methoden: `#separator`, `#pathSeparator`, `#separatorString`. |
330 | | Ebenso kapselt die Klasse URI alle notwendigen Plattform-Mappings. |
| 345 | Mit der Klasse `FileDirectory` kann im Dateisystem navigiert werden. Weil verschiedene Betriebssysteme verschiedene Pfad-Trennzeichen ("\" auf Windows, "/" bei Linux und OS X) verwenden, sollte die Methode `FileDirectory>>slash` verwendet werden. |
| 346 | |
| 347 | Das Pfad-Problem tritt jedoch nicht bei `FileDirectory-Objekten auf, denn sie übersetzen einen "/" im Pfad bereits in den betriebssystemspezifischen Pfad `<Squeak-Image>/Contents/Resources/folder/anImage.jpg` bzw. `<Squeak-Image>\Contents\Resources\folder\anImage.jpg` auf Windows. |
| 348 | |
| 349 | {{{ |
| 350 | FileDirectory uri: 'folder/anImage.jpg' |
| 351 | }}} |