Changes between Version 3 and Version 4 of squeak_faq


Ignore:
Timestamp:
10/14/2013 01:53:47 PM (11 years ago)
Author:
willi.mueller
Comment:

Escaped CamelCase, shortened too long headings

Legend:

Unmodified
Added
Removed
Modified
  • squeak_faq

    v3 v4  
    44== Wie werden Grafiken im Image verwendet? ==
    55
    6 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 ImageMorphs 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. Mit Klassen wie FileDirectory oder FileUrl kann im Dateisystem navigiert werden. Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich sein können (/ oder \). Bilder können auch im Image gespeichert werden. Das hat den Vorteil, das ihr die Bilder über Monticello verwalten könnt und so alle Teammitglieder über das Repository die aktuellen Bilder bekommen. Der große Nachteil ist, dass ihr die Größe des Images aufbläht. Wenn trotz ihr trotz dieses Nachteils Bilder in Methoden und damit im Image speichern wollt, könnt ihr Array-Repräsentationen gewinnen. Dazu laded ihr das Bild, wie oben beschrieben, zuerst in eine Form und aus dieser erzeugt ihr dann das Array (siehe. z.B. Form>>storeOn). 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 >>formFromFileNamed: fileName, was in der konkreten Implementierung genutzt werden kann.
     6Der 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 ImageMorphs 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. Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden. Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich sein können (/ oder \). Bilder können auch im Image gespeichert werden. Das hat den Vorteil, das ihr die Bilder über Monticello verwalten könnt und so alle Teammitglieder über das Repository die aktuellen Bilder bekommen. Der große Nachteil ist, dass ihr die Größe des Images aufbläht. Wenn trotz ihr trotz dieses Nachteils Bilder in Methoden und damit im Image speichern wollt, könnt ihr Array-Repräsentationen gewinnen. Dazu laded ihr das Bild, wie oben beschrieben, zuerst in eine Form und aus dieser erzeugt ihr dann das Array (siehe. z.B. Form>>storeOn). 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 >>formFromFileNamed: fileName, was in der konkreten Implementierung genutzt werden kann.
    77
    88
     
    1414== Können ImageMorph bzw. deren enthaltene Form mit Alphatranparenz umgehen? Wie können ganze Morphs ausgeblendet werden? ==
    1515
    16 Verwendet die Methode hide, um einen Morph sofort ohne Fade Out zu verstecken. Denkt bitte daran, dass ausgeblendete Morphs dennoch im Speicher verbleiben. Eine Squeak-Methoden-Suche nach "alpha" (eine Nachricht, die wahrscheinlich Konstrukte haben wird, bei denen man eine Transparenz einstellen kann) liefert eine Klasse namens: AnimAlphaBlendingCanvas.
     16Verwendet die Methode hide, um einen Morph sofort ohne Fade Out zu verstecken. Denkt bitte daran, dass ausgeblendete Morphs dennoch im Speicher verbleiben. Eine Squeak-Methoden-Suche nach "alpha" (eine Nachricht, die wahrscheinlich Konstrukte haben wird, bei denen man eine Transparenz einstellen kann) liefert eine Klasse namens: !AnimAlphaBlendingCanvas.
    1717
    1818
     
    2929== Hilfe, ich habe hunderte Morphs die alle eine falsche Methode steppen. Was kann ich sie stoppen? ==
    3030
    31 1.) Wenn es sich um eine einzige Methode handelt, könntest du versuchen diese mit einem "User Interrupt" zu unterbrechen: strg/alt und . (Windows/Linux) bzw. cmd und . (Mac)
    32 
    33 
    34 2.) Du kannst in Squeak jeder Klasse >>allInstances senden und bekommst dann eine Liste, die alle Objekte der Klasse enthält. An diese Liste können dann mit dem Collection Protocol (z.B. do:) Nachrichten an alle Objekte geschickt werden. Somit kannst du die Objekte bearbeiten oder mittels stopStepping zum Stillstand bringen.
     311.) Wenn es sich um eine einzige Methode handelt, könntest du versuchen diese mit einem "User Interrupt" zu unterbrechen: strg/alt und . (!Windows/Linux) bzw. cmd und . (Mac)
     32
     33
     342.) Du kannst in Squeak jeder Klasse #allInstances senden und bekommst dann eine Liste, die alle Objekte der Klasse enthält. An diese Liste können dann mit dem Collection Protocol (z.B. #do:) Nachrichten an alle Objekte geschickt werden. Somit kannst du die Objekte bearbeiten oder mittels stopStepping zum Stillstand bringen.
    3535
    3636
    3737== Wie schaffe ich es, dass ein Morph nicht mehr verschiebbar ist? ==
    3838
    39 Werft einen Blick auf die Methode Morph>>lock...
     39Werft einen Blick auf die Methode Morph>>lock.
    4040
    4141
     
    4747}}}
    4848
    49 Allgemein lohnt sich ein Blick auf die SoundSystem Klassen, z.B. BaseSoundSystem und die ganze Sound-Synthesis Kathegorie.
     49Allgemein lohnt sich ein Blick auf die !SoundSystem Klassen, z.B. !BaseSoundSystem und die ganze Sound-Synthesis Kathegorie.
     50
     51
     52== Gibt es eine Möglichkeit Soundeffekte aus Dateien zu laden und abzuspielen? ==
     53
     54Die gibt es:
     55{{{
     56(SampledSound fromWaveFileNamed: 'daffyduck1.wav') play
     57}}}
     58Interessante Klassen sind hier !SoundSystem default (bzw !BaseSoundSystem und die ganze Sound-Synthesis Kathegorie)
    5059
    5160
     
    6372== Wie wird Text formatiert? ==
    6473
    65 In Squeak gibt es auch für Text einen bestimmten Morph. Den TextMorph. Der hat auch weitere Halos, die einem erlauben mögliche Kombinationen aus Schriftarten und Schriftgrößen zu betrachten.
     74In Squeak gibt es auch für Text einen bestimmten Morph. Den !TextMorph. Der hat auch weitere Halos, die einem erlauben mögliche Kombinationen aus Schriftarten und Schriftgrößen zu betrachten.
    6675
    6776Ein Beispiel für sehr großen Text:
     
    125134== Wie bindet man das eigene Projekt in den Objects Explorer ein? ==
    126135
    127 1.) ObjectsTool erstellt die angezeigten Kategorien in dem es einfach alle Morphklassen nach einem bestimmten Selektor durchsucht und nur diese hinzufügt. Man benötigt also einen Morph und zwar den Morph, der das Spiel darstellt (z.B. BlyPacmanApp).
    128 2.) Auf der Klassenseite des Morphs wird eine Kategorie "parts bin" benötigt und in dieser eine Methode #descriptionForPartsBin. Das ist der Hook für ObjectsTool.
     1361.) !ObjectsTool erstellt die angezeigten Kategorien in dem es einfach alle Morphklassen nach einem bestimmten Selektor durchsucht und nur diese hinzufügt. Man benötigt also einen Morph und zwar den Morph, der das Spiel darstellt (z.B. !BlyPacmanApp).
     1372.) Auf der Klassenseite des Morphs wird eine Kategorie "parts bin" benötigt und in dieser eine Methode #descriptionForPartsBin. Das ist der Hook für !ObjectsTool.
    129138
    130139{{{
     
    138147
    139148Dabei kann mit einem vierten Parameter auch ein Beispielbild angegeben werden (siehe z.B. AudioChatGUIdescriptionForPartsBin, self ... sampleImageForm:). Ansonsten wird ein kleines Icon automatisch erstellt.
    140 3.) Damit sollte der Morph in dem ObjectsTool erscheinen. Allerdings kann es sein, dass der Morph nicht richtig initialisiert wird (z.B. das Extent nicht stimmt).
    141 
    142   Wenn man ein Objekt aus dem ObjectsTool zieht, wird der jeweiligen Klasse #newStandAlone als Nachricht gesendet. Die Methode dazu sieht wie folgt aus.
     1493.) Damit sollte der Morph in dem !ObjectsTool erscheinen. Allerdings kann es sein, dass der Morph nicht richtig initialisiert wird (z.B. das Extent nicht stimmt).
     150
     151Wenn man ein Objekt aus dem !ObjectsTool zieht, wird der jeweiligen Klasse #newStandAlone als Nachricht gesendet. Die Methode dazu sieht wie folgt aus.
    143152{{{
    144153newStandAlone
     
    147156}}}
    148157
    149 Während Morph #initializeToStandAlone einfach auf #initialize zurückführt, überschreiben andere Morphs die Methode (z.B. PasteUpMorph) und setzen z.B. die Größe. Falls das der Fall ist, kann man die #initializeToStandAlone einfach überschreiben:
     158Während Morph #initializeToStandAlone einfach auf #initialize zurückführt, überschreiben andere Morphs die Methode (z.B. !PasteUpMorph) und setzen z.B. die Größe. Falls das der Fall ist, kann man die #initializeToStandAlone einfach überschreiben:
    150159
    151160{{{
     
    166175
    167176
    168 == Wie kann man einem SystemWindow ein Icon geben? ==
    169 
    170 Schau dir mal die "initialization" Kategorie bei den SystemWindow Methoden an: Dort wirst du die labelArea finden, die u.a. auch für die Buttons und den Titel verantwortlich ist. Der labelArea kannst du auch Morphs hinzufügen. Einfach mal im Explorer (Alt+Shift+I auf "SystemWindow new openInWorld") ausprobieren.
     177== Wie kann man einem !SystemWindow ein Icon geben? ==
     178
     179Schau dir mal die "initialization" Kategorie bei den !SystemWindow Methoden an: Dort wirst du die labelArea finden, die u.a. auch für die Buttons und den Titel verantwortlich ist. Der labelArea kannst du auch Morphs hinzufügen. Einfach mal im Explorer (Alt+Shift+I) auf
     180{{{
     181!SystemWindow new openInWorld
     182}}}
    171183
    172184
     
    178190
    179191
    180 == Hat Squeak einen integrierten Eventhandler für Netzwerkevents? Gibt es
    181 also die Möglichkeit, dass eine Methode, die nicht blockierend prüft, ob
    182 Pakete empfangen wurden, irgendeine Methode aufruft, sobald Daten
     192== Hat Squeak einen integrierten Eventhandler für Netzwerkevents? Wie kann man eine Methode aufrufen, sobald Daten
    183193angekommen sind? ==
    184194
     
    189199Um das Warten zu realisieren, schaut euch die Klasse Delay an.
    190200Es gibt aber noch weiter Synchronisationsprimitiven, insbesondere wenn ihr Sockets benutzt:
    191 Je nachdem ob ihr Socket oder SocketStream verwendet, gibt es entsprechende Methoden die sich schlafen legen bis Daten verfügbar sind, z.B. Socket>>#waitForData (siehe Kommentar).
     201Je nachdem ob ihr Socket oder !SocketStream verwendet, gibt es entsprechende Methoden die sich schlafen legen bis Daten verfügbar sind, z.B. Socket>>#waitForData (siehe Kommentar).
    192202
    193203Die Netzwerkfähigkeit wäre zwar sicher ein schönes Feature ist aber ohne entsprechende Vorkenntnisse in dem Bereich nicht ganz einfach. Überlegt es euch daher vielleicht, ob ihr dies wirklich implementieren möchtet.
     
    228238
    229239
    230 == Ich würde gerne Objekte wie z.B. Forms so kodieren, dass ich sie als
    231 "normalen Text" so ähnlich wie base64 klassenseitig abspeichern kann. ==
     240== Objekte als Text klassenseitig abspeichern ==
    232241
    233242Zum Serialisieren von Objekten gibt es in Squeak die Methoden #storeOn: bzw #readFrom:
     
    243252
    244253
    245 == State und Strategy scheinen äußerst ähnliche Patterns zu sein.
    246 Wo ist denn genau der Unterschied? ==
    247 
    248 Die Strukturen der beiden Muster sind schon sehr ähnlich aber was sie wesentlich unterscheidet ist ihre Intention. Beim State Pattern geht es darum einen Zustand abzubilden und mit diesem verschiedenes Verhalten zu erzeugen. Die Verhaltensvariation unterliegt also der Zustandsklasse und der Client setzt hauptsächlich seinen Zustand und nutzt diesen. Beim Strategy Muster entscheidet der Client aber bewusst ein anderes Verhalten zu benutzen und kennt daher dessen Umsetzung, Vor- und Nachteile. Im GoF Buch gibt es für State das Beispiel der TCP Connection, welche je nach Zustand zwar die selben
    249  Nachrichten versteht aber unterschiedlich reagiert. Hingegen beim Strategy
    250  Muster wurde ein Compositor zur Ausgabe von Text gewählt, hier entscheid
    251 et der Client ganz bewusst die Ausgabe in TeX oder normalen Text zu rendern
     254== State und Strategy Pattern – Was ist der Unterschied? ==
     255
     256Die Strukturen der beiden Muster sind schon sehr ähnlich aber was sie wesentlich unterscheidet ist ihre Intention. Beim State Pattern geht es darum einen Zustand abzubilden und mit diesem verschiedenes Verhalten zu erzeugen. Die Verhaltensvariation unterliegt also der Zustandsklasse und der Client setzt hauptsächlich seinen Zustand und nutzt diesen. Beim Strategy Muster entscheidet der Client aber bewusst ein anderes Verhalten zu benutzen und kennt daher dessen Umsetzung, Vor- und Nachteile. Im GoF Buch gibt es für State das Beispiel der TCP Connection, welche je nach Zustand zwar die selben Nachrichten versteht aber unterschiedlich reagiert.Hingegen beim Strategy
     257Muster wurde ein Compositor zur Ausgabe von Text gewählt, hier entscheidet der Client ganz bewusst die Ausgabe in TeX oder normalen Text zu rendern
    252258.
    253259über die Häufigkeit des Austauschens würde ich jedoch keine Aussage treffen wollen, da dies sehr vom Anwendungsfall abhängt.
    254 Der Zustand der Strategy Algorithmen sollte keinen direkten Einfluss auf den Zustand des Clients haben. Beim State kann das jedoch der Fall sein, z.B.
    255  ist die TCPConnection abgebrochen und der Client zeigt eine Fehlermeldung
     260Der Zustand der Strategy Algorithmen sollte keinen direkten Einfluss auf den Zustand des Clients haben. Beim State kann das jedoch der Fall sein, z.B. ist die TCPConnection abgebrochen und der Client zeigt eine Fehlermeldung
    256261durch diesen neuen Zustand.
    257262
    258263
    259 == Soweit ich Polymorphie und Late Binding verstehe, ist doch letzteres
    260 das Mittel, um Polymorphie zu erreichen, und hat ohne diesen
    261 eigentlich keine wirkliche Funktion? ==
    262 
    263 Polymorhpie kann auch ohne späte Bindung erreicht werden. Zum Beispiel in C++ stehen polymorphe Methoden schon zur Übersetzungszeit fest, wenn sie nicht mit dem Schlüsselwort "virtual" markiert sind. Late binding ermöglicht polymorphe Methoden auf Objekten, deren Klasse erst zur Laufzeit bestimmt werden kann.
    264 
    265 Vererbung und Polymorphie sind nicht notwendig, um objektorientierte Abstraktion zu ermöglichen; Sie werden jedoch aus praktischen Gründen in OO-Sprachen sehr gerne eingesetzt. Die Darstellung von OOP zieht oft fälschlicherweise diese beiden Konzepte als zentral und unabdingbar heran. Sprachen wie z. B. JavaScript und Self nutzen Delegation an Stelle von Vererbung. Sie sind objektorientiert, kommen aber auch ohne Klassen aus.
     264== Ist Late Binding das Mittel, um Polymorphie zu erreichen und hat ohne diesen keine Funktion? ==
     265
     266Polymorhpie kann auch ohne späte Bindung erreicht werden. Zum Beispiel in C++ stehen polymorphe Methoden schon zur Übersetzungszeit fest, wenn sie nicht mit dem Schlüsselwort "virtual" markiert sind [http://en.wikipedia.org/wiki/Late_binding#Late_binding_in_C.2B.2B Dynamic Dispatch in C++]. Late binding ermöglicht polymorphe Methoden auf Objekten, deren Klasse erst zur Laufzeit bestimmt werden kann.
     267
     268Vererbung und Polymorphie sind nicht notwendig, um objektorientierte Abstraktion zu ermöglichen; Sie werden jedoch aus praktischen Gründen in OO-Sprachen sehr gerne eingesetzt. Die Darstellung von OOP zieht oft fälschlicherweise diese beiden Konzepte als zentral und unabdingbar heran. Sprachen wie z. B. !JavaScript und Self nutzen Delegation an Stelle von Vererbung. Sie sind objektorientiert, kommen aber auch ohne Klassen aus.
    266269
    267270
     
    274277
    275278
    276 == Wir benötigen für unser Seaside-System "clean" URLs, also URLs ohne _s und _k , wie zum Beispiel bei Squeaksource (etwa: http://www.squeaksource.com/UffnKoppConference) um auch einen direkten Link zu einer Unterseite angeben zu können.
    277 Wie lässt sich das bewerkstelligen? ==
     279== In Seaside "clean" URLs (ohne _s und _k) ==
    278280
    279281Schaut euch einmal den Teil des Tutorials an:
    280282[http://www.hpi.uni-potsdam.de/hirschfeld/seaside/tutorial?chapter=3D12 Model Overview]
    281283
    282 Unter dem Punkt static Urls solltet ihr fündig werden. Sollte es nicht mehr funktionieren (wegen der neuen Seaside Version) so sagt mir noch einmal Bescheid.
     284Unter dem Punkt static Urls solltet ihr fündig werden.
    283285
    284286
    285287== Gibt es in Squeak so etwas wie eine FileDialog Klasse? ==
    286288
    287 Helfen kann euch hier die Klasse FileList.
     289Helfen kann euch hier die Klasse !FileList.
    288290
    289291
     
    310312
    311313
    312 == Ich möchte einige Farben in einem Array speichern und die nach belieben
    313 einer Variablen zuweisen, die für die Hintergrundfarbe eines Morphs
    314 zuständig ist. Wie kann man das am besten erreichen? ==
     314== Wie kann man einige Farben in einem Array speichern, und diese einer Variablen zuweisen, die für die Hintergrundfarbe eines Morphs
     315zuständig ist?==
    315316
    316317Das ColorArray scheint seiner Implementierung zu Folge etwas speicherfreundlicher zu sein als ein normales Array mit Color Objekten. Diese besondere Art kodiert Farben in ihre 32 Bit Repräsentation und speichert diese ab also genau 4 Byte. Beim näheren betrachten der Color Class fällt allerdings auf, dass Farben durchaus mehr Speicher in Anspruch nehmen können (durch cache Mechanismen usw.). Daher kann es in bestimmten Situation sinnvoll sein (wenn viele Farben benötigt werden z.B. in einem Bitmap oder einer Colorform) diese in nur 4 Byte abzulegen. Vermutlich kann hier auch die VM etwas optimieren, wenn grundsätzlich 4 Byte pro Element festgelegt sind.
    317318
    318319
    319 == Es gibt in Squeak scheinbar zwei Möglichkeiten klassenseitige Variablen anzulegen: Einmal indem man auf Instanzseite in der Klassendefinition unter
    320 "classVariableNames:" die gewünschten Variablen beginnend mit einem Großbuchstaben einträgt oder auf Klassenseite unter "instanceVariableNames:" entsprechend mit einem Großbuchstaben. Welche ist denn die "richtige" Art? ==
     320== Was ist die richtige Art, Klassenvariablen anzulegen? Auf Instanzseite in ``classVariableNames:`` oder auf Klassenseite in ``instanceVariableNames:``? ==
    321321
    322322Dafür ist die instanzseitige Klassenvariable die richtige Wahl. Die klassenseitige Instanzvariable existiert nur auf Grund der Tatsache, dass Squeak ein Metaobjectprotocol besitzt und somit Klassen selbst wieder Instanz einer anderen Klasse sind. Daher besitzen sie auch Instanzvariablen. Allerdings sind die Instanzvariablen auch nur für die Klasse und nicht für Ihre Instanzen einsehbar.
     
    357357
    358358
    359 == Gibt es eine gute Möglichkeit in Squeak/Morphic mit Vektorgraphikenzu arbeiten? Am besten wäre natürlich SVG. ==
    360 
    361 Squeak hat von Haus aus keinen SVG Support. Es gibt aber die SVGMorph Package
    362 von Gary Chambers, die ihr euch einfach per Installation der entsprechenden .mcz
    363 in des Image holen könnt.
    364 Finden könnt ihr diese Package hier:
    365 
    366 [http://map1.squeakfoundation.org/package/7318c055-ce88-4a98-8d4d-2b8cf92e1920/autoversion/4 SVGMorph]
     359== Gibt es eine gute Möglichkeit in !Squeak/Morphic mit Vektorgraphikenzu arbeiten? Am besten wäre natürlich SVG. ==
     360
     361Squeak hat von Haus aus keinen SVG Support. Es gibt aber das [http://map1.squeakfoundation.org/package/7318c055-ce88-4a98-8d4d-2b8cf92e1920/autoversion/4 SVGMorph Package] von Gary Chambers, das ihr euch per Installation der entsprechenden .mcz in des Image holen könnt.
    367362
    368363
     
    370365als Ressource? Oder kann man Bilder nur aus Dateien laden? ==
    371366
    372 Die Klasse SystemWindow besitzt eine Reihe von Class-methods, die allesamt auf *Image enden. (z.B. SystemWindow>>menuBoxImage)
     367Die Klasse !SystemWindow besitzt eine Reihe von Class-methods, die allesamt auf *Image enden. (z.B. SystemWindow>>menuBoxImage)
    373368Diese Methoden geben Arrays zurück, die die Bildinformationen enthalten aus denen dann Form-Objekte erzeugt werden.
    374369Form ist die "Squeak's Canvas". Eine Bitmap, die Bilder enthalten kann oder auf der gezeichnet
    375 werden kann. Diese Objekte können dann in ImageMorphs verwendet werden (Der dazu ähnliche SketchMorph ist veraltet).
     370werden kann. Diese Objekte können dann in !ImageMorphs verwendet werden (Der dazu ähnliche !SketchMorph ist veraltet).
    376371
    377372
    378373Bei größeren oder vielen Bildern lohnt ein Blick auf die Klassenseite von Form.
    379374Da gibt es eine Methode, die aus einer Datei direkt ein Form-Objekt lädt.
    380 Ähnliches findet sich auch auf den Klassenseiten von den Klassen PNGReadWriter, JPEGReadWriter, GIFReadWriter und weitere für spezielle Bildformate.
    381 
    382 
    383 Mit Klassen wie FileDirectory oder FileUrl kann im Dateisystem navigiert werden.
     375Ähnliches findet sich auch auf den Klassenseiten von den Klassen !PNGReadWriter, !JPEGReadWriter, !GIFReadWriter und weitere für spezielle Bildformate.
     376
     377
     378Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden.
    384379Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich
    385380sein können (/ oder \, ). Für Plattformunabnhängigkeit könnt ihr GRPlatform>>pathSeparator.
     
    406401[http://wiki.squeak.org/squeak/792#Morphic Morphic-Wiki]
    407402
    408 Zum Einstieg in Squeak/Smalltalk sind viele gute Bücher kostenlos
     403Zum Einstieg in !Squeak/Smalltalk sind viele gute Bücher kostenlos
    409404verfügbar. Eine gute Übersicht bietet:
    410405[href="http://stephane.ducasse.free.fr/FreeBooks.html Free Books]
    411406
    412407
    413 == Gibt es eine Möglichkeit Soundeffekte aus Dateien zu laden und abzuspielen? ==
    414 
    415 Die gibt es:
    416 {{{
    417 (SampledSound fromWaveFileNamed: 'daffyduck1.wav') play
    418 }}}
    419 Interessante Klassen sind hier SoundSystem default (bzw BaseSoundSystem und die ganze Sound-Synthesis Kathegorie)
    420 
    421 
    422408== Wie stellt man am Besten Text in Squeak dar? ==
    423409
    424410In Squeak gibt es auch für Text einen bestimmten Morph.
    425 Den TextMorph. Der hat auch weitere Halos, die einem
     411Den !TextMorph. Der hat auch weitere Halos, die einem
    426412erlauben mögliche Kombinationen aus Schriftarten und Schriftgrößen
    427413zu betrachten..
     
    436422
    437423Anzumerken ist, dass der von Textmorphs enthaltene Text direkt auf diesem verändert werden kann.
    438 Dabei ist die Eingabe in TextMorphs durchaus gewollt. Wenn ihr dies verhindern wollt, müsst ihr sie locken. Weiterhin brechen diese Morphs automatisch den Text um, wenn der Platz (definiert durch die Bounds) nicht ausreichend ist. Das so genannte Word Wrapping kann aber auch deaktiviert werden (siehe TextMorph #wrapOnOff Methode). Wenn in einer Zeile mehr als nur 3-4 Zeichen geschrieben werden sollen, so muss man ihm eben mehr Platz geben also vergrößern. Beide Eigenschaften lassen sich auch mit dem vorgefertigten TextMorph über Halos und Menüs implementieren.
    439 
    440 
    441 == Wie fügt man Strings zusammen? ==
     424Dabei ist die Eingabe in !TextMorphs durchaus gewollt. Wenn ihr dies verhindern wollt, müsst ihr sie locken. Weiterhin brechen diese Morphs automatisch den Text um, wenn der Platz (definiert durch die Bounds) nicht ausreichend ist. Das so genannte Word Wrapping kann aber auch deaktiviert werden (siehe TextMorph>>wrapOnOff). Wenn in einer Zeile mehr als nur 3-4 Zeichen geschrieben werden sollen, so muss man ihm eben mehr Platz geben also vergrößern. Beide Eigenschaften lassen sich auch mit dem vorgefertigten !TextMorph über Halos und Menüs implementieren.
     425
     426
     427== Wie konkateniert man Strings? ==
    442428
    443429Das geht mit dem Komma-Operator.
     
    501487== Welche Streams verwendet man zum Dateien schreiben auf Gemstone? ==
    502488
    503 Dateibehandlung findet in Gemstone mit Hilfe der Klasse GsFile statt.
    504 In GemStone gibt es immer die Unterscheidung, ob etwas auf dem Client
    505 (also, GemTools oder seaside-gem) oder Server (also stone) passiert.
     489Dateibehandlung findet in Gemstone mit Hilfe der Klasse !GsFile statt.
     490In Gemstone gibt es immer die Unterscheidung, ob etwas auf dem Client
     491(also, !GemTools oder seaside-gem) oder Server (also stone) passiert.
    506492Darauf beziehen sich dann die entsprechenden *onClient* und *onServer*-
    507 methoden auf Klassenseite von GsFile.
     493methoden auf Klassenseite von !GsFile.
    508494
    509495