Changes between Version 53 and Version 54 of squeak_faq


Ignore:
Timestamp:
04/03/2019 04:54:15 PM (5 months ago)
Author:
patrick.rein
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • squeak_faq

    v53 v54  
    55
    66== Dokumentation ==
    7 
    87
    98
     
    3938[https://www.hpi.uni-potsdam.de/hirschfeld/trac/SqueakCommunityProjects/wiki/squeak_screencasts Screencasts] über Squeak gibt es ebenfalls.
    4039
     40
     41
     42
     43
     44
     45
     46
    4147== Grafik und Morphic ==
    4248
     
    9298
    9399Werft einen Blick auf die Methode `Morph>>lock`.
     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{{{
     105Form >> #scaledToSize:
     106Form >> #scaledToSize:smoothing:
     107Form >> #scaledIntoFormOfSize:
     108Form >> #scaledIntoFormOfSize:smoothing:
     109Form >> #magnifyBy:
     110}}}
     111
     112Damit kann, verzerrt oder die Größe von Forms geändert werden:
     113{{{
     114(ActiveWorld imageForm scaledToSize: 64@64 smoothing: 8)
     115asMorph openInHand.
     116
     117(ActiveWorld imageForm scaledIntoFormOfSize: 64@64 smoothing 8)
     118asMorph openInHand.
     119 
     120(ActiveWorld imageForm magnifyBy: (64@64) / ActiveWorld extent)
     121asMorph openInHand.
     122}}}
     123
     124=== Wie können Imagemorphs skaliert werden? ===
     125
     126{{{
     127form := ImageMorph defaultForm.
     128form := form
     129        magnify: form boundingBox
     130        by: 2@7
     131        smoothing: 2.
     132form asMorph openInWorld.
     133}}}
     134
     135=== Warum habe ich Lücken zwischen meinen ThumbnailImageMorphs?
     136
     137Wenn ThumbnailImageMorphs in einem Schachbrettmuster angeordnet werden, dann kann Folgendes passieren:
     1381.) Layouting
     139Das 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
     1412.) Anpassen der Morphs
     142Fü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
     147Hierfür gibt es die Morphic Property indicateKeyboardFocus.
     148Mann kann diesen entfernen entweder mit
     149{{{
     150aMorph setProperty: #indicateKeyboardFocus toValue: #never
     151}}}
     152setzen, oder die Nachricht {{{indicateKeyboardFocus}}}
     153in der benutzerdefinierten Morphklasse muss überschrieben werden (diese muss dann false
     154zurückgeben).
     155
     156=== Wie kann ich Text in einem Textmorph zentrieren? ===
     157{{{
     158TextMorph 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"
     173text := 'Hello, World' asText.
     174text addAttribute: TextEmphasis bold.
     175text addAttribute: TextEmphasis bold from: 1 to: 5.
     176text asMorph openInHand.
     177
     178"... bold, italic, colorful, fonts, ..."
     179TextAttribute browseHierarchy.
     180
     181"Fonts"
     182FontImporterTool open. "Install new fonts into Squeak."
     183StrikeFont actualFamilyNames. "Browse and explore"
     184TextStyle fontSizeSummary. "Browse and explore"
     185
     186"Fonts are queriesd by family name, point size, and emphasis code"
     187font := StrikeFont familyName: 'Bitmap DejaVu Sans' pointSize: 17.
     188font := 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."
     193text addAttribute: (TextFontReference toFont: font).
     194
     195"Configure text (attributes) through text morphs. Not really recommended."
     196tm := TextMorph new.
     197tm contents: 'Hello, World!'.
     198tm beAllFont: (StrikeFont familyName: 'Bitmap DejaVu Sans' pointSize: 17).
     199tm openInHand.
     200}}}
     201
     202=== Wie finde ich die Schriftgröße, sodass ein Morph ohne Zeilenumbruch befüllt wird? ===
     203{{{
     204TextMorph 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].
     209self beAllFont: font
     210}}}
     211Wenn das obige zu langsam ist, kann auch {{{#findBinary:}}} verwendet werden für ein laufzeitoptimierte Variante.
    94212
    95213
     
    135253
    136254Wenn ihr das Spiel auf dem XO in Vollbild laufen lassen wollt, dann solltet ihr eine etwas höhere Auflösung einplanen. Der XO-1 hat eine Auflösung von 1200x900 [http://laptop.org/en/laptop/hardware/specs.shtml XO Specs]
     255
     256
     257
     258=== Wie ist es möglich die Größe eines Morphs auf die Größe der World zu setzen (selbst wenn diese sich ändert)? ===
     259
     260Es gibt aktuell keine Benachrichtigung, wenn sich die Fläche des von Squeak bemalten Bereichs verändert. Morphic's Hauptschleife schaut in jedem Durchlauf explizit nach und passt gegebenenfalls die Dimension der Welt (also: Instanz von PasteUpMorph) an. Siehe {{{WorldState >> #doOneCycleNowFor:}}} und {{{DisplayScreen class >> checkForNewScreenSize}}}. Im Endeffekt landet das in {{{Project >> #displaySizeChanged}}} beziehungsweise {{{PasteUpMorph >> #restoreMorphicDisplay}}}. Allerdings gibt es keinen Weg für euer ein Spiel, dies elegant einzubinden.
     261
     262Daher sollte der Morph steppen und in jedem {{{#step}}} wird die Größe neu gesetzt:
     263{{{
     264step
     265  self isInWorld ifTrue: [
     266    self extent: self world extent]
     267}}}
     268beziehungsweise
     269{{{
     270step
     271  self owner ifNotNil: [:owner |
     272    self extent: owner extent]
     273}}}
     274
     275Das ist kein spürbarer Mehraufwand zur Laufzeit, wie ihr in {{{Morph >> #extent:}}} nachschauen könnt.
     276
     277Das allgemeine Konzept, seine eigene Größe automatisch an den Owner anzupassen -- also LayoutPolicy -- wird hier nicht benutzt. PasteUpMorph's haben keine LayoutPolicy.
     278
    137279
    138280
     
    267409
    268410
     411
     412
     413
     414
     415
     416
     417== Smalltalk als Programmiersprache ==
     418
     419=== Was ist der Unterschied zwischen Arrays und literal Arrays? ===
     420
     421Mit 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
     423Array - {{{ {1. 2. 3} }}}
     424
     425
     426zum Beispiel würde
     427
     428{{{
     429{ 1 + 1. 1 + 2.}
     430}}}
     431
     432zu einem Array mit 2 und 3 drin führen.
     433
     434Weil 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
     437Zum Beispiel führt
     438
     439{{{
     440myNumber := 41.
     441{ 'foo'. 1 + myNumber}
     442}}}
     443
     444zu einem Array mit 'foo' und 42.
     445
     446
     447Bei 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
     453Wenn "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
     458zu 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{{{
     460myNumber := 41.
     461#( 1 + myNumber)
     462}}}
     463zu einem Array mit 1 und #+ und #myNumber
     464
     465
     466
     467
     468
     469
    269470== Image ==
     471
     472=== Wie fügt man eine Method zu einer Klasse hinzu? ===
     473
     474Hierfür muss zuerst mit dem Browser in die Klasse navigiert werden, in der eine neue Methode erstellt werden soll. Hat diese Klasse bereits Methoden, wird eine neue Methode angelegt, indem man den Methodennamen ändert und dann speichert. Das ist am Anfang etwas ungewöhnlich aber spart einen extra Button. Noch einfach ist es alles zu markieren (ctrl+a) und dann einfach mit dem schreiben der Methode anzufangen.
     475
     476Hat die Klasse noch keine Methoden ist beim Auswählen des Klassenamens ein Methodentemplate zusehen. Dieses muss dann nur noch ausgefüllt werden.
     477
     478
    270479
    271480=== Wie erreiche ich Nebenläufigkeit in Squeak? ===
     
    381590
    382591
    383 === Wie können mehrere Schritte rückgängig gemacht werden? ===
    384 
    385 In den Einstellungen findet sich die Option "multipleTextUndo". Aktiviert diese und ihr könnt mehrere Schritte rückgängig machen. Mittels Strg + Z bzw cmd + Z könnt ihr die letzte Änderung rückgängig machen. Mehrmals zurück geht lediglich über Squeaks changes. Klickt dazu im Browser auf versions und wählt eure letzte Änderung aus.
     592=== Welche Keyboard shortcuts gibt es in Squeak? Kann ich selbst welche hinzufügen? ===
     593
     594Im Editor und den Unterklassen (vor allem TextEditor) in den initialize* Methoden findet man verschiedene Tabellen um Shortcuts anzupassen. Da diese Tabellen als Zustand auf Klassenseite gehalten werden muss dann die #initialize Methode der Klasse (also z.B. TextEditor initialize) noch einmal aufrufen werden.
     595
     596Allgemein natürlich der Hinweis auf Help > Keyboard Shortcuts für eine allgemeine Übersicht.
    386597
    387598
     
    479690 
    480691[[Image(profiler.jpg)]]
     692
     693=== Gibt es ein Tool in Squeak, das einem hilft besseren Code zu schreiben? ===
     694
     695Wie für viele Programmiersprachen gibt auch in Squeak einen sogenannten Linter, der dabei unterstützen soll schönen Code zu schreiben. Dieser analysiert euren Code und weist auf "unsaubere" Abschnitte hin. Solche Stellen können sowohl mögliche Fehlerquellen sein, als auch Codeabschnitte, die nicht Idiomen entsprechen.
     696
     697SWALint, wie das Tool heißt, wurde über Jahre in SWT Vorlesungen entwickelt und refactored. Ihr findet es im Apps Menü. Eine genauere Erklärung bietet der folgende Screencast (wenn auch für eine etwas ältere Version): https://www.hpi.uni-potsdam.de/hirschfeld/trac/SqueakCommunityProjects/wiki/squeak_screencasts#SwaLintstaticcodeanalysisandmetrics).
     698
     699(Die SwaLint-Tests sind sehr umfangreich und nicht alle immer ein hundertprozentiger Indikator für ein Problem. Ihr könnt sie gerne auch ausführen, um noch Hinweise auf potentielle Probleme zu finden, alle diese Tests zu bestehen sollte aber kein Ziel für euch sein.)
     700
    481701
    482702=== Ich habe meine WorldMainDockingBar kaputt gemacht. Wie kann ich sie zurücksetzen? ===