| 100 | |
| 101 | === Wie können Formen/Bilder skaliert werden? === |
| 102 | |
| 103 | {{{ImageMorph}}}s lassen sich zwar nicht skalieren, jedoch {{{Form}}}s. Hierfür würde man die folgenden Methoden verwenden: |
| 104 | {{{ |
| 105 | Form >> #scaledToSize: |
| 106 | Form >> #scaledToSize:smoothing: |
| 107 | Form >> #scaledIntoFormOfSize: |
| 108 | Form >> #scaledIntoFormOfSize:smoothing: |
| 109 | Form >> #magnifyBy: |
| 110 | }}} |
| 111 | |
| 112 | Damit kann, verzerrt oder die Größe von Forms geändert werden: |
| 113 | {{{ |
| 114 | (ActiveWorld imageForm scaledToSize: 64@64 smoothing: 8) |
| 115 | asMorph openInHand. |
| 116 | |
| 117 | (ActiveWorld imageForm scaledIntoFormOfSize: 64@64 smoothing 8) |
| 118 | asMorph openInHand. |
| 119 | |
| 120 | (ActiveWorld imageForm magnifyBy: (64@64) / ActiveWorld extent) |
| 121 | asMorph openInHand. |
| 122 | }}} |
| 123 | |
| 124 | === Wie können Imagemorphs skaliert werden? === |
| 125 | |
| 126 | {{{ |
| 127 | form := ImageMorph defaultForm. |
| 128 | form := form |
| 129 | magnify: form boundingBox |
| 130 | by: 2@7 |
| 131 | smoothing: 2. |
| 132 | form asMorph openInWorld. |
| 133 | }}} |
| 134 | |
| 135 | === Warum habe ich Lücken zwischen meinen ThumbnailImageMorphs? |
| 136 | |
| 137 | Wenn ThumbnailImageMorphs in einem Schachbrettmuster angeordnet werden, dann kann Folgendes passieren: |
| 138 | 1.) Layouting |
| 139 | Das Layouting versucht anhand der Spezifikation die zum Beispiel durch die Frames gegeben wurden die Morphs passend zu positionieren und zu skalieren. Dabei kommen manchmal auch Gleitkommazahlen für die konkreten Bounds der einzelnen Morphs heraus. Da am Ende alles auf Pixel abgebildet wird werden diese Werte aber auf Ganzahlen gerundet. Das ist erst einmal nicht weiter schlimm, da damit eure Spezifikation bis auf einen kleinen Fehler eingehalten wird. Der Fehler ist auch nicht für jede Zelle wieder plötzlich neu sondern zum Beispiel alternierend zwischen Reihen. |
| 140 | |
| 141 | 2.) Anpassen der Morphs |
| 142 | Für normale Morphs ist ersichtlich, dass alles bündig liegt. Das liegt daran, dass die Morphs die neue Größe die vom Layout vorgegeben wurde einfach akzeptieren und sich so zeichnen. Die ThumbnailImageMorphs sind eigentlich für eben genau das gedacht: Thumbnails. Darum versuchen sie so lange wie möglich ihr Seitenverhältnis beizubehalten (bis zu einem Verhältnis von 3), dann wird doch gestaucht. Das führt dazu, dass ihr, wenn ihr zwei verschieden hohe Reihen habt, die ThumbnailImageMorphs in diesen Reihen auch unterschiedliche Breiten haben werden. |
| 143 | |
| 144 | |
| 145 | === Ein Morph hat einen Rahmen, weil er KeyboardFocus hat; wie bekomme ich diesen weg? === |
| 146 | |
| 147 | Hierfür gibt es die Morphic Property indicateKeyboardFocus. |
| 148 | Mann kann diesen entfernen entweder mit |
| 149 | {{{ |
| 150 | aMorph setProperty: #indicateKeyboardFocus toValue: #never |
| 151 | }}} |
| 152 | setzen, oder die Nachricht {{{indicateKeyboardFocus}}} |
| 153 | in der benutzerdefinierten Morphklasse muss überschrieben werden (diese muss dann false |
| 154 | zurückgeben). |
| 155 | |
| 156 | === Wie kann ich Text in einem Textmorph zentrieren? === |
| 157 | {{{ |
| 158 | TextMorph new |
| 159 | contents: 'Hallo'; |
| 160 | wrapFlag: true; |
| 161 | width: 300; |
| 162 | centered; |
| 163 | lock; |
| 164 | openInWorld. |
| 165 | }}} |
| 166 | |
| 167 | |
| 168 | |
| 169 | === Wie passt man die Schrft in einem Textmoph an? === |
| 170 | |
| 171 | {{{ |
| 172 | "String + TextAttribute = Text" |
| 173 | text := 'Hello, World' asText. |
| 174 | text addAttribute: TextEmphasis bold. |
| 175 | text addAttribute: TextEmphasis bold from: 1 to: 5. |
| 176 | text asMorph openInHand. |
| 177 | |
| 178 | "... bold, italic, colorful, fonts, ..." |
| 179 | TextAttribute browseHierarchy. |
| 180 | |
| 181 | "Fonts" |
| 182 | FontImporterTool open. "Install new fonts into Squeak." |
| 183 | StrikeFont actualFamilyNames. "Browse and explore" |
| 184 | TextStyle fontSizeSummary. "Browse and explore" |
| 185 | |
| 186 | "Fonts are queriesd by family name, point size, and emphasis code" |
| 187 | font := StrikeFont familyName: 'Bitmap DejaVu Sans' pointSize: 17. |
| 188 | font := StrikeFont familyName: 'Bitmap DejaVu Sans' pointSize: 17 emphasized: TextEmphasis italic emphasisCode. |
| 189 | |
| 190 | "Note: While emphasis (bold, italic, underlined) can be *in* the font, color is only attached to fonts via text attributes to be used in font-rendering code." |
| 191 | |
| 192 | "Change/override the font for all characters in the text." |
| 193 | text addAttribute: (TextFontReference toFont: font). |
| 194 | |
| 195 | "Configure text (attributes) through text morphs. Not really recommended." |
| 196 | tm := TextMorph new. |
| 197 | tm contents: 'Hello, World!'. |
| 198 | tm beAllFont: (StrikeFont familyName: 'Bitmap DejaVu Sans' pointSize: 17). |
| 199 | tm openInHand. |
| 200 | }}} |
| 201 | |
| 202 | === Wie finde ich die Schriftgröße, sodass ein Morph ohne Zeilenumbruch befüllt wird? === |
| 203 | {{{ |
| 204 | TextMorph beAllFont: aFontFamily scaledToWidth: targetWidth |
| 205 | | font | |
| 206 | (Interval from: 200 to: 1 by: -1) detect: [:pointSize | |
| 207 | font := TTCFont familyName: aFontFamily pointSize: pointSize emphasis: (text emphasisAt: 0). |
| 208 | (font widthOfString: text) <= targetWidth]. |
| 209 | self beAllFont: font |
| 210 | }}} |
| 211 | Wenn das obige zu langsam ist, kann auch {{{#findBinary:}}} verwendet werden für ein laufzeitoptimierte Variante. |
| 411 | |
| 412 | |
| 413 | |
| 414 | |
| 415 | |
| 416 | |
| 417 | == Smalltalk als Programmiersprache == |
| 418 | |
| 419 | === Was ist der Unterschied zwischen Arrays und literal Arrays? === |
| 420 | |
| 421 | Mit den geschweiften Klammern ist die allgemeinere Art ein Array zu erzeugen. In den Klammern stehen durch Punkte getrennt Statements, also wirklich Code-Teile. Das können direkt Zahlen/Strings/etc sein, aber auch tatsächlich Logik. |
| 422 | |
| 423 | Array - {{{ {1. 2. 3} }}} |
| 424 | |
| 425 | |
| 426 | zum Beispiel würde |
| 427 | |
| 428 | {{{ |
| 429 | { 1 + 1. 1 + 2.} |
| 430 | }}} |
| 431 | |
| 432 | zu einem Array mit 2 und 3 drin führen. |
| 433 | |
| 434 | Weil es sich um Code handelt, der ausgeführt werden muss, steht der Inhalt des Arrays erst zur Laufzeit (also wenn der Code ausgeführt wird) fest. Der Code kann deswegen auch andere Objekte enthalten, welche erst zur Laufzeit feststehen, wie Variablen. |
| 435 | |
| 436 | |
| 437 | Zum Beispiel führt |
| 438 | |
| 439 | {{{ |
| 440 | myNumber := 41. |
| 441 | { 'foo'. 1 + myNumber} |
| 442 | }}} |
| 443 | |
| 444 | zu einem Array mit 'foo' und 42. |
| 445 | |
| 446 | |
| 447 | Bei literal Arrays kann kein Code übergeben werden, sondern nur Literale. Dadurch steht der Inhalt immer fest, nicht erst zur Laufzeit. Die Werte werden durch Leerzeichen getrennt und werden auch leicht anders erzeugt: |
| 448 | |
| 449 | {{{ |
| 450 | #(1 2 3) |
| 451 | }}} |
| 452 | |
| 453 | Wenn "Text" drin steht ohne als String ('a') oder Symbol (#a) markiert zu sein, wird er automatisch zu Symbolen umgewandelt. So wird |
| 454 | {{{ |
| 455 | #(hallo welt 42) |
| 456 | }}} |
| 457 | |
| 458 | zu einem Array mit #hallo #welt und 42. Wie Code wird es nicht ausgewertet und Variablen können deshalb auch nicht hineingegeben werden. Deshalb führt |
| 459 | {{{ |
| 460 | myNumber := 41. |
| 461 | #( 1 + myNumber) |
| 462 | }}} |
| 463 | zu einem Array mit 1 und #+ und #myNumber |
| 464 | |
| 465 | |
| 466 | |
| 467 | |
| 468 | |
| 469 | |