Yeah, me

Foto: Uwe Pirr

Informatik


previous Page home toc next Page

Programmieren in HyperTalk I

Was ist HyperCard?

HyperCard ist eine Art Multitalent. Ursprünglich war es wohl geschaffen worden, um auf den Apple-Macintosh-Computern einen Ersatz für das bis dahin auf allen Personalcomputern übliche BASIC zu schaffen. Das BASIC auf den Computern der Apple-II-Reihe war zu Recht sehr beliebt. Aufgrund seines völlig neuartigen Konzepts und seiner damals ungewöhnlichen Architektur war es von Anfang an mehr als nur eine Programmiersprache für Anfänger. HyperCard war und ist je nach Betrachtungsweise:

  • eine Datenbank,
  • eine Programmierumgebung und
  • ein Multimedia-Autorensystem.

Während früher eine HyperCard-Vollversion zum Lieferumfang eines jeden Macintoshs gehörte, wird seit einigen Jahren leider nur noch ein HyperCard-Player mitgeliefert. Dieser erlaubt es immerhin, fertige HyperCard-Applikationen abzuspielen. Entwickler müssen allerdings für die Vollversion ca. DM 200,-- hinblättern. Dafür erhalten Sie aber neben dem eigentlichen HyperCard-Programm noch zahlreiche Entwicklerwerkzeuge und Beispiel-Stacks.

Datenbank

HyperCard bildet in seiner einfachsten Form einen einfachen Karteikasten nach, der mit Karteikarten gefüllt ist. Die Grundeinheit von HyperCard, der Stack, symbolisiert dies: Mit Stack ist ein (Kartei-) Kartenstapel gemeint. Hier können Informationen in nahezu beliebieger Form (Bild, Text, Quick-Time-Filme und Töne) abgelegt werden. Ein in HyperCard eingebauter leistungsfähiger Suchalgorithmus sorgt dafür, daß diese Informationen schnell wieder aufgefunden werden können. Der mit HyperCard mitgelieferte Adress-Stack zeigt sehr anschaulich die Leistungsfähigkeit von Datenbanken in HyperCard. Wir werden im Rahmen dieses Kurses einen einfachen Karteikarten-Ersatz und einen etwas komplexeren Stapel zur Literaturverwaltung erstellen.

Multimedia-Autorensystem

Schon sehr bald erkannte man, daß man mit HyperCard ein sehr leistungsfähiges Multimedia-Autorensystem hatte. Insbesondere im Schulbereich wurden in HyperCard sehr früh CBT-Programme entwickelt (CBT = Computer Based Training; Computerunterstütztes Lernen). Eine weitere Möglichkeit von HyperCard, die Schaffung von Links, wurde sehr bald auch zur Entwicklung von Hypertext-Systemen genutzt. Links sind Verbindungen von einer Stelle im Stapel zu einer ganz anderen. Ein Doppelklick auf die Ursprungsstelle bringt den Anwender zu der anderen Stelle. Dies ist ungefähr den Verweisen in einem Lexikon vergleichbar. Zwar unterstütze HyperCard in seinen ersten Versionen die Möglichkeit von Hypertext-Links nur sehr unvollkommen, dies wurde aber erkannt und ist seit der Version 2.0 behoben.

Auch wir werden im Laufe dieses Kurses auf die Multimedia-Fähigkeiten von HyperCard eingehen und ein wenig mit ihnen spielen.

Programmiersprache

Der eigentliche Clou für viele ist aber die in HyperCard eingebaute Programmiersprache Hypertalk. Diese ermöglicht es, nahezu jede denkbare Anwendung in HyperCard zu programmieren. Und Hypertalk ist weit mehr als BASIC. Zwar ist es auch eine Interpreter-Sprache, aber sie ist (in Grenzen) objektorientiert und weit umfangreicher, als jeder bekannte BASIC-Dialekt. Alles, was man in HyperCard interaktiv mit Maus und Tastatur erstellen kann, kann man in Hypertalk auch programmieren.

Hypertalk ist der Stammvater einer ganzen Reihe von Programmiersprachen, die auf dem gleichen Konzept beruhen: Supertalk, die Programmiersprache von SuperCard und Lingo, die Programmiersprache des Multimedia-Autorensystems Director von Macromedia sind die bekanntesten davon. Das Erlernen von Hypertalk ist daher auch eine gute Grundlage für den künftigen Multimedia-Entwickler.

Hello World

Jede gute Einführung in eine Programmiersprache fängt mir einem "Hello-World"-Programm an:

Abb. 1: Hello World!

In Hypertalk reicht es nicht, einige Kommandos der Sprache in einen Editor zu tippen, sondern wir müssen erst die Objekte erstellen, auf die unsere Hypertalk-Kommandos Einfluß nehmen sollen. Dazu rufen wir HyperCard auf und sagen im File-Menü, das wir einen neuen Stack erstellen wollen. Wir nennen diesen neuen Stack "Hello World.HC". Wenn wir es bei allen Default-Einstellungen belassen, haben wir anschließend ein Fenster in der Größe des Classic-Bildschirms vor uns, das aus einer weißen Fläche besteht. Dies ist unsere erste Karte eines Stapels.

Als nächstes schauen wir uns das Tools-Menü an: Dieses können wir abreißen und als Palettenfenster irgendwo günstig auf dem Bildschirm plazieren. (Falls das Tools-Menü nicht sichtbar sein sollte: Apfel-M drücken, in das kleine Message-Fenster "set userlevel to 5" eintippen und "Enter" drücken. Danach sollte das Menü auch den "Tool"-Eintrag zeigen.) Das Tool-Fenster zeigt in der ersten Reihe von links nach rechts das "Browse-Tool", das "Button-Tool" und das "Field-Tool".

Das "Browse-Tool" ist die Standardeinstellung für den Anwender. Wenn dieses Tool aktiviert ist, kann der Anwender mit einem zum Zeigefinger mutierten Cursor auf Buttons (Knöpfe) klicken und so durch den Stack navigieren. Mit dem Button-Tool werden Knöpfe erstellt und bearbeitet und mit dem Field-Tool natürlich Textfelder.

Die Werkzeuge darunter sind Zeichenwerkzeuge, ähnlich wie in MacPaint. Wir werden später darauf zurückkommen.

Als nächsten wählen wir - wiederum im Objects-Menü - den Befehl "New Button". Diesen neuen Knopf verschieben wir als erstes ungefähr dahin, wo er auch auf der obigen Abbildung zu sehen ist. Gleichzeitig nehmen wir zur Kenntnis, daß nun das mittlere der Werkzeuge in der Tool-Palette aktiviert ist. Eine Dialogbox, um die Eigenschaften des Knopfes festzulegen, öffnen wir wiederum mit einem Doppelklick auf den Knopf. Wir geben dem Knopf den Namen "Start" und achten darauf, daß "Show Name" und "Enabled" angekreuzt sind, nicht jedoch "Auto Hilite". Dann aber klicken wir in den Knopf "Script...". Ein neues Fenster erscheint. Hier dürfen wir endlich unser HyperTalk-Programm eintippen:

on mouseUp
  if the hilite of me is TRUE then
    put empty into cd field "Hello"
    set the hilite of me to FALSE
  else
    put "Hello World" into cd field "Hello"
    set the hilite of me to TRUE
  end if
end mouseUp

Wenn wir dies alles richtig eingetippt haben, dann schließen wir das Fenster durch Drücken des Schließknopfes. Während HyperCard sonst alle Änderungen automatisch sichert, werden wir hier noch einmal gefragt, ob wir die Änderungen im Skript übernehmen wollen. Wir bestätigen dies und landen wieder auf unserer Karte.

Jetzt aktivieren wir das Browse-Werkzeug und befinden uns somit im Anwendermodus. Wenn wir nun alles richtig abgetippt haben und dann in den Knopf "Start" mit der Maus klicken, passiert folgendes: Der Knopf selber wird negativ dargestellt, d.h. er bekommt ein "Highlight", das die Amerikaner in ihrer Praxismentalität "Hilite" buchstabieren. Und in dem Textfeld erscheint "Hello World" in der von uns ausgewählten Schriftart und Größe. Wenn wir noch einmal in den Knopf "Start" klicken, wird das Hilite zurückgenommen und das Textfeld ist wieder leer. Genau dies haben wir in unserem HyperTalk-Programm auch gesagt:

on mouseUp

Dies ist die Botschaft, das Handle, auf die das Skript warten soll, bevor es reagiert: Erst wenn ein Mausklick innerhalb des Buttons losgelassen wird, wird das Skript angestoßen. Wir hätten natürlich auch auf mouseDown hin das Skript starten können, bei mouseUp haben wir aber noch die Möglichkeit, bei einem versehentlichen Klick in einen Knopf oder ein Feld, dieses bei gedrückt gehaltener Maustaste wieder zu verlassen, ohne das etwas passiert. Daher ist mouseUp so etwas wie das Standard-Handle, mit dem in Regelfalle die Reaktion auf einen Mausklick eingeleitet wird.

if the hilite of me is TRUE then

HyperTalk kennt wie jede andere algorithmische Programmiersprache auch die wenn -> dann Bedingung: Wenn der Knopf die Eigenschaft hilite hat, also schon mal gedrückt worden war, dann

put empty into cd field "Hello"

soll das Kartenfeld "Hello", das wir angelegt hatten, geleert werden und

set the hilite of me to FALSE

die Eigenschaft hilite soll wieder zurückgenommen werden.

else

sonst (der Knopf hat nicht die Eigenschaft hilite, daraus folgt, daß auch das Kartenfeld "Hello" leer ist):

put "Hello World" into cd field "Hello"

Daher schreiben wir erst einmal "Hello World" in das leere Kartenfeld.

set the hilite of me to TRUE

Außerdem wird die hilite-Eigenschaft dem Knopf "Start" (me) zuerkannt.

end if

mit end if wird die Wenn-Dann-Klammer wieder geschlossen und mit

end mouseUp

das Ende des Skripts gekennzeichnet. Hypertalk ist übrigens nicht Case-Sensitiv, das heißt mouseUp, MouseUp und mouseup oder sogar mOUSEuP sind für Hypertalk dasselbe. Die Groß- und Kleinschreibung dient nur der besseren Lesbarkeit.

Gratuliere. Damit haben Sie Ihr erstes Programm in Hypertalk geschrieben. Als Ergebnis können wir festhalten:

1. HyperTalk-Programme sind Objekten zugeordnet und reagieren auf Nachrichten (handle), die sie erhalten.

2. Die Objekte werden in der Regel interaktiv erstellt, d.h. sie werden nicht per Programmcode erzeugt.

Die letzte Eigenschaft macht HyperCard zu einem idealen Instrument das rapid prototyping. Testversionen von Programmen können in HyperCard erstellt und getestet werden, bevor sie in C oder einer anderen Compilersprache endgültig umgesetzt werden.

Die Objekte in Hypertalk

Doch was sind nun die Objekte in HyperCard. Zwei haben wir schon kennengelernt, die Knöpfe (buttons) und die Textfelder (fields). Wie schon oben erwähnt und auch aus dem Menü Objects ersichtlich, ist die Anzahl von Objekten beschränkt. Objekte in HyperCard sind Knöpfe, Felder, Hintergründe (backgrounds), Karten (cards), Stapel (stacks) und HyperCard selber. Diese Objekte können Nachrichten empfangen und darauf reagieren. Wenn ein Objekt eine Nachricht empfangen hat und darauf reagieren kann, weil es das entsprechende onMessage-Handle besitzt, ist diese Nachricht aufgebraucht, sie wird nicht weiter durch die Message-Hierarchie gereicht. (Es sei denn, dies wird mit einem pass-Befehl explizit gefordert.) Ansonsten geht jede Message einen genau vorgeschriebenen Weg und sucht nach einem für sie zuständigen Handle, bis sie endlich HyperCard selber erreicht. Wird sie auch da nicht abgefangen, ist sie für immer verschwunden. Die folgende Abbildung zeigt den Pfad, den eine Message durch einen (einfachen) Stapel nimmt:

Abb. 2: Der "Message"-Pfad in HyperCard

Werden mehrere Stapel zu einer Applikation zusammengestellt, kann der Message-Path komplizierter aussehen. Wir werden im Rahmen dieses Lehrganges noch darauf zurückkommen. Zur Zeit aber bestehen unser HyperCard-Programm nur aus einem einzigen Stapel - genauer sogar nur aus einer einzigen Karte - und da folgen die Befehle dem Pfad so, wie in der Zeichnung angegeben.

Zu klären ist jetzt aber noch, warum und mit welchen Eigenschaften das Objekt background existiert. Um dies zu klären wollen wir einen neuen Stack anlegen.

Eine einfache Datenbank

Unser neuer Stack soll einen einfachen Karteikasten ersetzen. Darauf soll eine Überschrift Platz finden, ein Feld, im dem wir beliebigen Text eintragen können und ein Feld für Stichwörter sollte ebenfalls vorhanden sein. Das bedeutet, daß die Felder (und auch die Knöpfe) nicht mehr, wie im vorigen Beispiel, auf einer einzigen Karte erscheinen sollen, sondern auf allen Karten eines Stapels. Um dies zu ermöglichen, kennt HyperCard die Hintergrundfelder und -Knöpfe. Um diese anzulegen, rufen wir erneut im File-Menü den Befehl "New Stack" auf. Wir nennen den neuen Stack "Ideen & Notizen", können sonst aber alles wieder in der Default-Einstellung lassen. Wieder legen wir die Werkzeugpalette strategisch günstig auf unserem Monitor ab. Dann allerdings drücken wir entweder "Apfel-B" (für Background) oder wählen den Background im "Edit-Menü" aus. Eine gestrichelte Linie rund um die Menüleiste deutet auch visuell an, daß wir uns in einem anderen Modus befinden. Alles, was wir in diesem Modus anlegen, wird auf allen Karten des Stapels mit dem gleichen Background erscheinen. Die letzte Einschränkung ist wichtig, da ein Stapel auch mehrere Hintergründe enthalten kann.

Wir wollen aber jetzt unseren Hintergrund wie folgende Abbildung gestalten:

Abb. 3: So legt man das Layout fest.

Als ersten legen wir drei Felder an. Das obere schmale bekommt den Namen "Titel" und den Stil Rectangle. Das mittlere, große Feld bekommt den Namen "Textfeld" und den Stil Scrolling. Dadurch verhält sich dieses Feld wie ein scrollbares Fenster und kann bis zu 32 kByte Text aufnehmen. Das sind ca. 8 Seiten und dürfte für eine Karteikarte genügen. Das untere Feld schließlich bekommt den Namen "Schlagworte" und ebenfalls den Stil Rectangle. Die Texteigenschaften können Sie beliebig wählen. Ich gab dem Titelfeld eine 14 Punkt große, fette Geneva, dem Textfeld eine 12 Punkt große New York und die Schlagworte sind ebenfalls eine 12 Punkt große New York, zur Unterscheidung allerdings kursiv gesetzt. Alle Felder haben darüberhinaus die Eigenschaft linksbündig.

Um diese drei Felder habe ich zur optischen Auflockerung einen Rahmen gezogen. Wir achten darauf, daß wir uns immer noch im Hintergrundmodus befinden. Dann klicken wir in der Werkzeugpalette das Rahmensymbol an. Das ist das mittlere Symbol in der vierten Reihe. Mit unserem zu einem Kreuz gewandelten Cursor ziehen wir nun mit gedrückter Maustaste einen Rahmen um die drei Felder. Anschließend doppelklicken wir in den Farbeimer, in unserer Werkzeugpalette das linke Symbol in der fünften Reihe. Eine weitere Palette mit Füllmustern erscheint. Ich habe das dritte Muster in der zweiten Reihe durch Einfachklick ausgewählt. Unser Cursor müßte immer noch aus dem Farbeimer-Symbol bestehen. Wenn nicht, klicken wir noch einmal einfach in den Farbeimer der Werkzeugpalette. Ein Klick in den Rand der Karte außerhalb des Rahmens füllt diesen nun mit dem ausgewählten grauen Muster.

Jetzt legen wir die fünf Knöpfe mit den Symbolen an, die sich im unteren Rand der Karte befinden. Dabei gehen wir immer nach dem gleichen Schema vor: Als erstes vergewissern wir uns, daß wir uns immer noch im Hintergrundmodus befinden (Wichtig!). Dann wählen wir New Button im Menü Objects. Ein neuer Knopf erschient in der Mitte der Karte. Mit einem Doppelklick öffnen wir die Dialogbox und benennen die Knöpfe: Wir werden sie (von links nach rechts) prev, recent, new Card, quit und next nennen. Danach achten wir darauf, daß "Show Name" nicht angekreuzt ist und der Stil auf Transparent gesetzt wird. Mit einem Doppelklick auf den "Icon..."-Button innerhalb der Dialogbox wählen wir dann ein Symbol für den jeweiligen Knopf aus, also den Pfeil nach links für den linken Knopf usw. Mit "OK" verlassen wir wieder die Dialogbox. Unser Button sieht nun noch etwas komisch aus. Mit der Maus ziehen wir ihn in die richtige Größe und schieben ihn dann an die Stelle des Hintergrunds, wo wir ihn haben wollen.

Wenn wir dies erledigt haben, haben wir fünf Hintergrundknöpfe, aber noch kein einziges HyperTalk-Programm geschrieben. Ein Klick auf die Symbole bewirkt noch gar nichts. Das wollen wir als nächstes ändern. Hierzu dürfen wir auch wieder in den Vordergrund gehen (dies wird durch erneutes Brücken der Tasten "Apfel-B" erreicht), müssen aber noch nicht.

Im ersten Beispiel haben wir das Skriptfenster, in dem wir unsere HyperTalk-Programm eingegeben haben über die Dialogbox erreicht. Es geht aber auch kürzer. Wenn wir im Browse-Modus sind, der Cursor also die Form der Hand mit dem ausgestreckten Zeigefinger besitzt, können wir das Skriptfenster direkt erreichen, wenn wir bei einem Klick in den Button gleichzeitig die Wahl und die Apfeltaste gedrückt halten. Da bei späteren, komplizierten Programmen ein Großteil der Arbeit im Ändern von Hypertalk-Skripten besteht, ist dieser "Shortcut" eine große Erleichterung.

Wir klicken also bei gedrückter Wahl- und Apfeltaste als erstes in den left-Button und geben folgendes HyperTalk-Progrämmchen ein:

on mouseUp
  go prev card
end mouseUp

Das Programm ist, nach unserer Einführung mit dem "Hello-World"-Programm - glaube ich - selbsterklärend. Wenn diese Taste gedrückt wird, soll zu vorhergehenden Karte gesprungen werden. (Noch haben wir allerdings nur eine Karte und da HyperCard wie bei einer Rolodex die erste Karte mit der letzten verbindet, springen wir immer nur wieder auf unsere einzige Karte.)

Als nächstes nehmen wir uns den Knopf new Card vor (den Knopf recent überspringen wir, er ist für eine spätere Erweiterung vorgesehen). Wieder klicken wir bei gedrückter Wahl- und Apfeltaste auf den Knopf und geben folgendes Progrämmchen ein:

on mouseUp
  doMenu "New Card"
  click at the loc of bg fld 1       -- Titel
end mouseUp

Hier sind drei Sachen neu. Erstens rufen wir mit doMenu direkt aus Hypertalk einen Befehl aus der Menüleiste auf. Das ist in Hypertalk bis auf eine Ausnahme problemlos mit diesem Befehl möglich. Die Ausnahme ist, daß es von der HyperCard-Version 2.1 auch eine deutschsprachige Fassung gab. Diese hatte natürlich auch deutsche Menü-Befehle. Obwohl sie angeblich alle englischen Menüs von Hypertalk aus ebenfalls beherrschen sollte, gab es damit ständige Probleme. Meine Empfehlung daher ist, nur mit den englischsprachigen Versionen von HyperCard zu arbeiten.

Die zweite Neuheit sind die beiden Bindestriche vor dem Wort "Titel". Hypertalk behandelt alles, was hinter zwei Bindestrichen steht bis zum Ende der Zeile als Kommentar.

Der Befehl selber sagt nur, daß nach dem Erstellen der neuen Karte ein Klick in das Titelfeld simuliert werden soll. Dadurch ist das Feld sofort zur Eingabe frei. Die Leserin oder der Leser kann ja testhalber diesen Befehl weglassen und sehen, was dann passiert.

Im Skript des quit-Buttons wird ebenfalls wieder das doMenu-Kommando bemüht:

on mouseUp
  doMenu "Quit HyperCard"
end mouseUp

Und der next-Knopf ist analog zum ersten Knopf gestaltet:

on mouseUp
  go next card
end mouseUp

Falls nicht schon geschehen, sollten Sie spätestens jetzt wieder zum Vordergrundmodus zurückkehren (durch Drücken von "Apfel-B"). Dann geben Sie in die erste Karte etwas ein, drücken den Knopf für eine neue Karte und geben da ebenfalls etwas ein. Die neue Karte enthält genau den gleichen Hintergrund wie die erste Karte, mit den gleichen Knöpfen und Feldern. Wenn wir nun testweise wieder in den Hintergrundmodus zurückkehren, stellen wir fest, daß die Inhalte der Textfelder nicht zum Hintergrund gehören, im Hintergrundmodus scheinen alle (Hintergrund-) Textfelder leer zu sein. Die Texte selber, die Sie in diesen Feldern eingeben, gehören zu den jeweiligen Karten. Bei der Rückkehr in den Vordergrundmodus sehen Sie sie dann auch wieder.

Jetzt können Sie ein bißchen mit diesen beiden Stacks, die wir zusammen erstellt haben, herumexperimentieren. Ändern sie einfach mal die Eigenschaften der Objekte und schauen Sie nach, was passiert. Sehr interessant ist dabei die Einstellung der verschiedenen visuellen Effekte bei einem Übergang von einer Karte zur nächsten, die verschiedenen Rahmen bei Feldern usw.


previous Page home toc next Page

This pages need no frames
This site is edited with Radio UserLand, the first personal Web Application server for Windows and Macintosh. © 1996 - 2001 by Jörg Kantel
Last modified: JK, 04.09.2001; 20:33:24 Uhr
email:joerg@kantel.de
This page is best viewed with a computer and a monitor

Site Meter