Hallo Liste, neben der neuen Rubrik Eulerprobleme habe ich eine weiteren Bereich ins Leben gerufen. "Smalltalk-Idiome erklärt" Es geht also um Dinge, die man in Smalltalk immer wieder und meistens auf die gleiche Art und Weise erledigt. Den "Terse guide to Squeak" http://wiki.squeak.org/squeak/5699 würde ich übersetzen und auch da mit einordnen. Wer also schöne Beispielidiome hat ... immer her damit :) Enno |
Die Idee finde ich sehr gut.
Gib doch bitte mal ein Musterbeispiel für ein solches Idiom an! Gruß R. Baumann |
"R. Baumann" <[hidden email]> writes:
Hallo Rüdeger, > Die Idee finde ich sehr gut. > Gib doch bitte mal ein Musterbeispiel für ein solches Idiom an! Wie hole ich Daten aus einem File. Dazu steht schon was unter Idioms auf der Homepage. Ein weiteres wäre: Wie kann der Benutzer Daten eingeben? answer := FillInTheBlank request: 'Wie ist dein Name?'. Enno |
Hallo Enno,
Ein Idiom, das ich gerne wüßte: Wie bringe ich ein Bild, z.B. ein jpg, das ich auf das Etoys-Fenster ziehe, per Smalltalk ins System, etwa als defaultForm eines ImageMorphes? Ziel wäre, daß das Bild Bestandteil etwa meines Monticello-Paketes bzw. des Smalltalk-Images wird, nicht des Datesystems. Markus |
Markus Schlager <[hidden email]> writes:
Hallo Markus, ich weiss nicht, ob ich dich richtig verstanden habe. Aber ich kann mal kurz zeigen, wie ich bei diesen Dingen vorgehe, wenn ich so etwas noch nie gemacht habe. Du hast den ImageMorph bereits angesprochen. Wenn ich nicht weiss, welche Klasse ich benutzen kann rufe ich zuerst den Method finder auf. Da suche ich dann nach Methoden, die picture: oder image: beinhalten. Ich finde unter anderem ImageMorph image: Das klingt vielversprechend. Dann sehe ich mir den Klassenkommentar an. Dort gibt es zwei Codebeispiele. ImageMorph new openInWorld; grabFromScreen Das kopiert einen Bildausschnitt und zeigt ihn an. (Form fromFileNamed: 'myGraphicsFileName') asMorph openInWorld Das öffnet ein externes Bild. Ich denke damit ist dir geholfen. Enno > Ein Idiom, das ich gerne wüßte: > > Wie bringe ich ein Bild, z.B. ein jpg, das ich auf das Etoys-Fenster > ziehe, per Smalltalk ins System, etwa als defaultForm eines > ImageMorphes? Ziel wäre, daß das Bild Bestandteil etwa meines > Monticello-Paketes bzw. des Smalltalk-Images wird, nicht des > Datesystems. > > Markus |
In reply to this post by Markus Schlager-2
On 14.11.2010, at 10:44, Markus Schlager wrote: > Hallo Enno, > > Ein Idiom, das ich gerne wüßte: > > Wie bringe ich ein Bild, z.B. ein jpg, das ich auf das Etoys-Fenster ziehe, per Smalltalk ins System, etwa als defaultForm eines ImageMorphes? Ziel wäre, daß das Bild Bestandteil etwa meines Monticello-Paketes bzw. des Smalltalk-Images wird, nicht des Datesystems. > > Markus Wenn es nicht das effizienteste sein muss, nimm #storeString. Das erzeugt Code für die meisten (relativ einfachen) Objekte. - Bert - |
In reply to this post by Enrico Schwass-2
Hallo Enno,
2010/11/13 Enrico Schwass <[hidden email]>: > Wer also schöne Beispielidiome hat ... immer her damit :) die Sammlung von Klimas et al. gibt auch einiges her: http://stephane.ducasse.free.fr/FreeBooks/WithStyle/SmalltalkWithStyle.pdf Viele Grüße, Michael |
In reply to this post by Enrico Schwass-2
On Sun, 14 Nov 2010, Enrico Schwass wrote:
> (Form fromFileNamed: 'myGraphicsFileName') asMorph openInWorld > > Das öffnet ein externes Bild. Danke Enno, aber genau das möchte ich vermeiden bzw. nur einmal tun müssen. Dann möchte ich das Bild im Image bzw. zumindest im Monticello-Paket haben. Konkret zwei Fragen: 1. Wenn ich so etwas wie "Form fromFileNamed: 'myGraphicsFileName'" im Smalltalk-Code einer Klasse stehen habe und dann mein Werk mit Monticello exportiere und später in ein anderes Image importiere, ist dann die Datei myGraphicsFileName mit dabei und am Zielsystem an der richtigen Stelle? 2. Was ich eigentlich will: ImageMorph kennt eine Klassenvariable 'DefaultForm' (oder auch 'DefaultImage' bei AlphaImageMorph). Das einzige was ich für diese aufbekomme, ist ein Inspektor. Bei pharo ist sie ein 1x1-Pixel, bei Etoys ein Bild mit Kleinkinderhänden. Meine Schüler sollen Spiele oder Animationen programmieren, bei denen beispielsweise irgendwelche Figuren vorkommen sollen, die ein nettes Kostüm brauchen. Das ganze sollen sie später mit Monticello bei mir abgeben können. Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph abzuleiten und mit einer anderen DefaultForm auszustatten. Nun ist die erste Frage die, wo/wie ich die DefaultForm überhaupt im Smalltalk-Image finde und sie ggf. verändere. Die zweite Frage ist die, ob ein Verändern überhaupt sinnvoll ist, nachdem sich DefaultForm doch nach recht globaler Variable anhört. Was ich haben möchte, wäre eben so etwas wie DefaultForm, letztlich also wohl die Definition einer konkreten 'Form' (im Sinne der Smalltalk-Klasse) meineDefaultForm, die ich benutzen kann, um damit ImageMorph>>defaultImage im Sinne von MeinImageMorph>>defaultImage "Answer the default image for the receiver." ^ meineDefaultForm überschreiben kann. Mit Hilfe von Berts #storeString habe ich das jetzt geschafft: (Form fromFileNamed: 'myGraphicsFileName') storeString Drucken und in #defaultImage einfügen. 3. Doch noch eine Frage: Wenn ich in pharo etwa ein jpg-Bild auf das pharo-Image ziehe, öffnet sich ein Popup-Menü, das mir erlaubt, das Bild in einem Fenster zu öffnen, als Hintergrund zu benutzen, oder eben 'read graphic into ImageImports'. Was passiert da und wo/wie kann ich dann auf das Bild zugreifen? Herumsuchen in Inspektoren brachte mich zu Form(class)>>serviceImageImports bzw. Form(class)>>importImage: fullName "Import the given image file and store the resulting Form in the default Imports. The image is named with the short filename up to the first period, possibly with additions from the directory path to make it unique." Imports default importImageFromFileNamed: fullName. Wenn die Datei z.B. /Pfad/zu/meinBild.jpg war, kann ich die erzeugte Form höchstwahrscheinlich als Imports default imports at: 'meinBild' ansprechen. Überlebt das z.B. einen Monticello-Export? Markus |
On 14.11.2010, at 20:39, Markus Schlager wrote:
> Überlebt das z.B. einen Monticello-Export? Monticello speichert derzeit ausschließlich Quelltext. - Bert - |
In reply to this post by Markus Schlager-2
Markus Schlager <[hidden email]> writes:
Hallo Markus, > Danke Enno, aber genau das möchte ich vermeiden bzw. nur einmal tun > müssen. Dann möchte ich das Bild im Image bzw. zumindest im > Monticello-Paket haben. Wenn du das Bild geladen hast und das Image abspeicherst, bleibt das Bild ja erhalten. Der komplette Zustand des Images bleibt erhalten. Aber es geht dir vielmehr um den Import/Export von Daten > Konkret zwei Fragen: > 1. Wenn ich so etwas wie "Form fromFileNamed: 'myGraphicsFileName'" > im Smalltalk-Code einer Klasse stehen habe und dann mein Werk mit > Monticello exportiere und später in ein anderes Image importiere, ist > dann die Datei myGraphicsFileName mit dabei und am Zielsystem an der > richtigen Stelle? Nein. Monticello ist hauptsächlich für Sourcecode gedacht. Hier hat Bert das schon einmal ausgeführt http://lists.squeakfoundation.org/pipermail/beginners/2010-April/007002.html > 2. Was ich eigentlich will: ImageMorph kennt eine Klassenvariable > 'DefaultForm' (oder auch DefaultImage' bei AlphaImageMorph). Das > einzige was ich für diese aufbekomme, ist ein Inspektor. Bei pharo ist ImageMorph class->initialize "ImageMorph initialize" | h p d | DefaultForm := (Form extent: 80@40 depth: 16). h := DefaultForm height // 2. 0 to: h - 1 do: [:i | p := (i * 2)@i. d := i asFloat / h asFloat. DefaultForm fill: (p corner: DefaultForm extent - p) fillColor: (Color r: d g: 0.5 b: 1.0 - d)]. self registerInFlapsRegistry. Das wird irgendwo erstmalig aufgerufen. Sollte eigentlich nicht automatisch passieren. Bert?? > sie ein 1x1-Pixel, bei Etoys ein Bild mit Kleinkinderhänden. Meine > Schüler sollen Spiele oder Animationen programmieren, bei denen > beispielsweise irgendwelche Figuren vorkommen sollen, die ein nettes > Kostüm brauchen. Das ganze sollen sie später mit Monticello bei mir > abgeben können. Monticello ist dafür meines Wissens nicht geeignet. Man kann auch das Ergebnis von storeString kopieren und in eine Methode zur Initialisierung einfügen. Das wird aber recht schnell recht gross. RectangleMorph new storeString liefert '(RectangleMorph basicNew instVarAt: 1 put: (0@0 corner: 50@40); instVarAt: 2 put: nil; instVarAt: 3 put: #(); instVarAt: 4 put: nil; instVarAt: 5 put: (Color r: 0.613 g: 0.903 b: 1.0); instVarAt: 6 put: nil; instVarAt: 7 put: 2; instVarAt: 8 put: (Color r: 0.0 g: 0.0 b: 0.0); yourself)' Das kann man noch in eine Methode schreiben, anderes dann eher nicht :) > Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph > abzuleiten und mit einer anderen DefaultForm auszustatten. Nun ist die > erste Frage die, wo/wie ich die DefaultForm überhaupt im > Smalltalk-Image finde und sie ggf. verändere. Die zweite Frage ist > die, ob ein Verändern überhaupt sinnvoll ist, nachdem sich DefaultForm > doch nach recht globaler Variable anhört. Warum können Sie nicht einfach ein jpg per eMail schicken? Der Dateiname könnte ja auf die Verwendung hindeuten, was den Import dann erleichtert. HemdVonName.jpg HoseVonName.jpg .. etc > Was ich haben möchte, wäre eben so etwas wie DefaultForm, letztlich > also wohl die Definition einer konkreten 'Form' (im Sinne der > Smalltalk-Klasse) meineDefaultForm, die ich benutzen kann, um damit > ImageMorph>>defaultImage im Sinne von > MeinImageMorph>>defaultImage > "Answer the default image for the receiver." > ^ meineDefaultForm > überschreiben kann. > Mit Hilfe von Berts #storeString habe ich das jetzt geschafft: > (Form fromFileNamed: 'myGraphicsFileName') storeString > Drucken und in #defaultImage einfügen. Verdammt, zu spät gelesen. Da hätte ich mir ja die Erklärung oben sparen können :) > 3. Doch noch eine Frage: > Wenn ich in pharo etwa ein jpg-Bild auf das pharo-Image ziehe, öffnet > sich ein Popup-Menü, das mir erlaubt, das Bild in einem Fenster zu > öffnen, als Hintergrund zu benutzen, oder eben 'read graphic into > ImageImports'. > Was passiert da und wo/wie kann ich dann auf das Bild zugreifen? Bei Pharo muss ich passen. Vielleicht mal in HandMorph gucken. Oder PasteUpMorph Ich denke, Bert wird dir da ausführlicher antworten. Enno |
In reply to this post by Markus Schlager-2
On 14.11.2010, at 20:39, Markus Schlager wrote:
> Meine Schüler sollen Spiele oder Animationen programmieren, bei denen beispielsweise irgendwelche Figuren vorkommen sollen, die ein nettes Kostüm brauchen. Das ganze sollen sie später mit Monticello bei mir abgeben können. > > Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph abzuleiten und mit einer anderen DefaultForm auszustatten. Du brauchst keine Unterklassen. Und die DefaultForm ist genau das - das Bild, was genommen wird, wenn du kein anderes setzt. Also setze einfach das Bild, was du magst, nachdem du eine Instanz von ImageMorph erzeugt hast. > Nun ist die erste Frage die, wo/wie ich die DefaultForm überhaupt im Smalltalk-Image finde und sie ggf. verändere. > Die zweite Frage ist die, ob ein Verändern überhaupt sinnvoll ist, nachdem sich DefaultForm doch nach recht globaler Variable anhört. Du willst die nicht verändern. Und gefunden hast du sie schon, im Browser. > Was ich haben möchte, wäre eben so etwas wie DefaultForm. Nein. Was du willst ist ein ImageMorph, der eine bestimmte Form anzeigt. Da du auf Monticello bestehst, mach einfach eine Ressourcen-Klasse, die alle Bilder, Töne, usw. hält. Am besten in einem Dictionary als Klassenvariable. So etwas gibt es zwar schon (z.B. als ScriptingSystem formDictionary) aber da du ja auch Pharo verwenden willst, ist nicht sicher, dass das nicht bald entfernt wird (falls es noch existiert). Ist auch "sauberer" das selbst zu machen, wenn auch mit mehr Arbeit verbunden. - Bert - |
In reply to this post by Michael Haupt-3
Michael Haupt <[hidden email]> writes:
Hallo Michael, >> Wer also schöne Beispielidiome hat ... immer her damit :) > die Sammlung von Klimas et al. gibt auch einiges her: > http://stephane.ducasse.free.fr/FreeBooks/WithStyle/SmalltalkWithStyle.pdf Stimmt. Das Buch hatte ich vor einiger Zeit auch gelesen, ich gucks nochmal durch. Danke für den Hinweis Enno |
In reply to this post by Bert Freudenberg
Hallo Bert und Enno,
Erst schon einmal vielen Dank für die ausführliche Hilfe! On Mon, 15 Nov 2010, Bert Freudenberg wrote: >> Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph abzuleiten und mit einer anderen DefaultForm auszustatten. > > Du brauchst keine Unterklassen. Und die DefaultForm ist genau das - das > Bild, was genommen wird, wenn du kein anderes setzt. Also setze einfach > das Bild, was du magst, nachdem du eine Instanz von ImageMorph erzeugt > hast. Unterklassen brauche ich vielleicht aus anderen Gründen. Ich möchte den Schülern das Leben nicht zu schwer machen und verzichte daher evtl. auf eine saubere Trennung von View und Model. >> Was ich haben möchte, wäre eben so etwas wie DefaultForm. > > Nein. Was du willst ist ein ImageMorph, der eine bestimmte Form anzeigt. Genau. > Da du auf Monticello bestehst,... Falls das nicht sinnvoll ist, lasse ich mir gerne zu Alternativen raten. Ich habe nur den Eindruck gewonnen, daß Monticello derzeit der übliche Weg ist, Daten zu im-/exportieren. Das konkrete Szenario besteht darin, daß die Schüler ihre Werke bei mir abgeben sollen, ich aber eigentlich nicht von jedem um die 25MB image samt dessen sonstiger Werke haben möchte. Unter Etoys lasse ich mir Projekte (.pr) abgeben, aus Smalltalk-Sicht scheint das aber ja nicht ganz so gut zu sein - abgesehen davon geht das in pharo gar nicht. Markus |
On 15.11.2010, at 20:56, Markus Schlager wrote: > Hallo Bert und Enno, > > Erst schon einmal vielen Dank für die ausführliche Hilfe! > > On Mon, 15 Nov 2010, Bert Freudenberg wrote: > >>> Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph abzuleiten und mit einer anderen DefaultForm auszustatten. >> >> Du brauchst keine Unterklassen. Und die DefaultForm ist genau das - das Bild, was genommen wird, wenn du kein anderes setzt. Also setze einfach das Bild, was du magst, nachdem du eine Instanz von ImageMorph erzeugt hast. > > Unterklassen brauche ich vielleicht aus anderen Gründen. Ich möchte den Schülern das Leben nicht zu schwer machen und verzichte daher evtl. auf eine saubere Trennung von View und Model. Aber eine Klasse pro angezeigtem Bild finde ich zu viel des Guten. Es gibt so schon viel zu viele Morphklassen ;) >>> Was ich haben möchte, wäre eben so etwas wie DefaultForm. >> >> Nein. Was du willst ist ein ImageMorph, der eine bestimmte Form anzeigt. > > Genau. > >> Da du auf Monticello bestehst,... > > Falls das nicht sinnvoll ist, lasse ich mir gerne zu Alternativen raten. Ich habe nur den Eindruck gewonnen, daß Monticello derzeit der übliche Weg ist, Daten zu im-/exportieren. Nicht für generelle Daten. Nur Code. Ein MCZ ist zwar auch nur eine Zip-Datei, aber bisher haben wir es vermieden, die für anderes als Code zu missbrauchen (obwohl es schon mal eine Erweiterung gab, die das implementierte). > Das konkrete Szenario besteht darin, daß die Schüler ihre Werke bei mir abgeben sollen, ich aber eigentlich nicht von jedem um die 25MB image samt dessen sonstiger Werke haben möchte. Unter Etoys lasse ich mir Projekte (.pr) abgeben, aus Smalltalk-Sicht scheint das aber ja nicht ganz so gut zu sein - abgesehen davon geht das in pharo gar nicht. > > Markus Naja, in einem "echten" Projekt hätte man einen schön versionierten Ressourcenordner mit der ganzen Artwork. Solange du erwähnst wie man das "wirklich" macht, kannst du aber aus pragmatischen Gründen durchaus Bilder in Methoden abgeben lassen :) - Bert - |
Hallo Bert,
On Mon, 15 Nov 2010, Bert Freudenberg wrote: > > Aber eine Klasse pro angezeigtem Bild finde ich zu viel des Guten. Es gibt so schon viel zu viele Morphklassen ;) > Ich werde mir das zu Herzen nehmen. :) Vielleicht mache ich es ja doch "richtig", erbe von Objekt und benutze ImageMorph. Mal sehen. Danke jedenfalls Markus |
Free forum by Nabble | Edit this page |