Foto: Uwe Pirr
Informatik
|
|
Schon
seit der ersten Markteinführung im August 1987 war HyperCard ein beliebtes
Werkzeug, um Hypertexte zu erstellen. Dabei waren die Möglichkeiten in den
ersten HyperCard-Versionen noch begrenzt. Links, d.h. Sprünge zu anderen
Textstellen, wurden in der Regel so realisiert, daß man hinter den Text
einen durchsichtigen Button legte, der dann das Skript für den Sprung zum
Zieltext enthielt. Diese Methode hatte jedoch einen schwerwiegenden Nachteil:
Wurde der Text verändert, saß der Button nicht mehr an seiner
richtigen Stelle. "Lebendiger Hypertext", der vom Benutzer nahezu beliebig
veränderbar ist, ließ sich damit nicht realisieren.
Doch seit dem Release 2.0 hat sich dies geändert. HyperCard bietet nun die
Möglichkeit Text "anklickbar" zu machen. Die Option "grouped Text"
faßt einen Text zu einer Einheit (einem Chunk) zusammen. Und die Funktion
the clickChunk liefert bei gruppiertem Text den vollen Text
zurück. Ein Beispiel: Nehmen Sie an, im letzten Satz sei "the clickChunk"
gruppiert. Wenn sie dann mit der Maus auf das Wort "the" klicken und diesen
Klick abfragen, erhalten Sie als Ergebnis "the clickChunk". Im anderen Fall,
also bei ungruppiertem Text, hätten sie nur das Wort "the" erhalten. Doch
wozu das Ganze?
Ein "normaler" Text wird linear, d.h.. von vorne nach hinten gelesen (falls Sie
nicht zu denjenigen gehören, die bei einem Krimi immer erst hinten
nachlesen, wer denn nun der Mörder sei). Bei Hypertexten hingegen wird der
Text auf kleine Einheiten (in HyperCard sinnvollerweise auf einzelne Karten)
verteilt, von denen Sprünge zu anderen Einheiten (anderen Karten)
möglich sind. Hypertext entspricht in etwa den Verweisen in einem Lexika
oder den (manchmal ausufernden) Fußnoten in philosophischen Texten. Die
lineare Struktur herkömmlicher Texte wird somit aufgebrochen, Hypertexte
können in verschiedenen Reihenfolgen gelesen werden. Es sind sogar
Hypertext Romane mit mehreren verschiedenen Enden möglich. Je nachdem,
für welche Verzweigung Sie sich entscheiden, ist im Hypertext-Krimi der
Mörder entweder der Gärtner oder die Gräfin.
Die Domäne von Hypertexten ist zur Zeit aber noch der Sachtext-Bereich:
Lexika und ähnliche Bücher bieten sich für eine Realisierung als
Hypertext-Dokument geradezu an. Literarische Hypertext-Produkte sind dagegen
noch selten und kaum über das Experimentierstadium hinausgekommen.
Die Idee des Hypertextes ist übrigens älter und nicht mit der
Entwicklung von HyperCard oder Personalcomputern verbunden. Schon 1957 stellte
Vannessar Bush in einem Artikel "As may we think" die grundlegenden
Hypertext-Ideen vor. Und das gigantischste Hypertext-Projekt unserer Tage - das
den Ideen von Bush wohl auch am nächsten kommt - ist das World Wide Web
mit seinen Millionen von vernetzten Einträgen, die alle über
Hypertext-Links miteinander verbunden sind.
Wir wollen jedoch kleiner anfangen und ein einfaches kleines
Hypertext-Autoren-Werkzeug in HyperTalk konstruieren, das uns erlaubt, eigene
Links innerhalb eines Stacks zu erstellen und zu pflegen. Wir erweitern dazu
den Notiz-Stack aus der ersten Folge unseres Kurses. Generell jedoch ist das
Stack-Skript, das wir in diesem Kurs gemeinsam erstellen so allgemein gehalten,
das es ohne Änderung als Hypertext-Werkzeug in jedem Stack läuft.
(Ich verdanke diese Idee dem Buch von Coulouris und Thimbly [1], das - obwohl
leider nur in englisch erhältlich - in keiner Bibliothek eines ernsthaften
HyperCard-Programmierers fehlen sollte.)
Ich möchte dieses Werkzeug jedoch zu einem Hypermedia-Autorentool
erweitern. Nicht nur Links zu Texten sind möglich, sondern beim Klicken
auf entsprechend preparierte Textstellen sollen auch Bilder und sogar
Quicktime-Filme zu sehen sein.
Wir führen dazu verschiedene Formen von Links ein. Einmal öffnet sich
bei Klick auf gruppierten Text ein Pop Up Feld, das kürzere Anmerkungen
aufnehmen kann, zum anderen können wir einen "echten" Sprung zu einer
anderen Karte realisieren. Dieser wird dadurch symbolisiert, daß ein
Button erscheint (Abb. 1). Falls in diesen geklickt wird, wird der Sprung
ausgeführt - wird die Maus jedoch von dem Button wegbewegt, verschwindet
er wieder. Sie haben also so die Möglichkeit, sich doch noch einmal anders
zu entscheiden.
Abb. 1: Die verschiedenen möglichen Links oder: Man kann Hypertext
auch übertreiben
Ähnlich verhält es sich mit den anderen beiden Links. Auch bei
Ihnen erscheint zuerst ein Button, dessen Icon jeweils die Art des Links
symbolisiert. Nach einem erneuten Klick in eben diese Button erscheint dann
entweder ein Bild oder ein QuickTime-Film in einem separaten Fenster. Die
Bilder dürfen entweder im PICT oder im MacPaint-Format vorliegen. Diese
Links können nur durch Betätigung des Schließknopfes Ihres
Fensters wieder geschlossen werden. Die Fenster sind beweglich, wenn sie
wichtige Textstellen verdecken, werden sei einfach zur Seite geschoben. Sie
sind dabei nicht an die Größe des HyperCard-Stapels gebunden, sie
dürfen, wie jedes echte Fenster, auch auf dem Desktop abgelegt werden.
In der derzeitigen Version müssen Bilder und Filme im gleichen Ordner
liegen, in dem auch der Stack liegt. Dies läßt sich jedoch leicht
ändern, wenn man im Skript auch eine Variable für den gesamten
Pfadnamen extrahiert und mit an die entsprechenden Handles übergibt.
Die Pop-Up-Felder entsprechen eher den herkömmlichen Fußnoten, die
"echten" Links zu anderen Karten den Verweisen in einem Lexikon oder
Wörterbuch.
Da HyperCard seine Hypertextfähigkeiten leider nur voll ausspielt, wenn
die Texteingabe blockiert ist (the lockText is TRUE), fügen wir
zwei Hintergrundknöpfe ein, die als Radiobuttons ausgeführt und einer
Familie zugewiesen werden. Diese machen nichts anderes, als the
lockText für die Textfelder entweder ein- oder auszuschalten. Mehr
kosmetischen Zwecken dient die Checkbox Show Groups (ebenfalls als
Hintergrundknopf realisiert). Gruppierter Text wird in HyperCard auf Wunsch
grau unterstrichen ausgegeben. Dies halte ich einerseits zwar für
vernünftig, da es oft wenig sinnvoll ist, dem Benutzer auf Geratewohl im
Text herumklicken zu lassen (außer in Abenteuerspielen), andererseits
stören die grauen Strich meinen Lesefluß. Daher die
Möglichkeit, die Anzeige des gruppierten Textes auf Wunsch auszublenden.
Da HyperCard den Zustand leider nicht abspeichert, ist ein kleines
openCard-Skript notwendig, das den Show-Groups-Button abfragt und
gegebenenfalls den Befehl ausführt.
Einen Sinn bekommt nun auch der Hintergrundknopf mit dem gebogenen Pfeil. Er
enthält als kurzes Skript eigentlich nur den Befehl
go recent card
mit dem auf die zuletzt benutzte Karte zurückgesprungen wird. So
kann man von einem Link wieder auf die Karte. von der dieser Link ausging,
zurückgelangen. Dies ist eine erste Hilfe, um nicht im Hyperspace
verlorenzugehen.
Das (Hintergrund-) Feld Schlagworte bekommt ebenfalls einen über
das gesamte Feld gehenden transparenten Background Button verpaßt. Das
Programm hierzu ist das Goodie dieser Folge und wird am Schluß des
Artikels erläutert.
Der Trick, der unser Hypertext-Autoren-Werkzeug so universal macht, ist
folgender: Wir legen die ganzen Skripte dafür im Stack selber ab und
fangen jedes mouseUp, das nicht von einem anderen,
darüberliegenden Skript "verbraucht" wurde, ab. Neue Links werden
angelegt, indem wir den zu gruppierenden Text von links nach rechts
markieren und gleichzeitig die Apfeltaste drücken. Außerdem legen
wir fest, daß bei gleichzeitigem Niederdrücken der Apfeltaste
und der Umschalttaste ein Link gelöscht werden soll. Die Struktur
unseres Programms ist daher folgende:
on mouseUp
if "Klick in ein Feld" then
if "Apfeltaste" then
-- Benutzer ist "Autor"
if "Umschalttaste" then
"lösche Link"
else
"neuer Link"
end if
end if
-- Benutzer ist "Leser"
if "Klick auf 'grouped Text'" then
"Hypertext Link ausführen"
else
"alle Pop Ups schließen"
end if
else
"alle Pop Ups schließen"
end if
end mouseUp
Die darauffolgenden Unterprogramme sind etwas komplexer, vor allem,
weil sie darauf achten müssen, daß jeder gruppierte Text nur maximal
einen Link enthält. Eine weitere Schwierigkeit besteht darin, daß
wir es bei der Erstellung neuer Links mit markiertem Text zu tun haben, der
noch nicht gruppiert ist. Der Befehl the clickChunk liefert uns nur
ein Ergebnis in der Form:
char 55 to 127 of bg fld 5
Daher müssen Sie immer den value()-Befehl benutzen, wenn
Sie den Textinhalt bekommen wollen. Und zur Überprüfung und
erstmaligen Festlegung benutzen wir eine wenig bekannte Eigenschaft von
HyperCard: Wird nämlich beim Markieren von Text gleichzeitig die
Apfeltaste gedrückt, erscheint die Messagebox und der markierte Text wird
in die Messagebox kopiert
Das Erstellen von Links zu anderen Karten führen wir in zwei Schritten
aus. Im ersten wird ein Button angelegt, der das Programm für den Link
enthält. D.h. im Moment seines Anlegens enthält er nur einen
Platzhalter (beep). Wir wollen nämlich, daß der Benutzer
mit den normalen Navigationsknöpfen (previous, next)
festlegen kann, wohin der Link gehen soll. Daher legen wir als zweite Neuheit
ein Menü mit dem Namen "Neuer Link" an und die Quellkarte wird mit pop
Card auf einem Stack abgelegt. Das Menü enthält die Punkte "Link
zu dieser Karte" und "Abbruch" und bleibt solange bestehen, bis - in einem
zweiten Schritt - der Benutzer entweder einen Link festlegt oder "Abbruch"
wählt. Selbsterstellten Menüs in HyperCard können Handle
zugeordnet werden, die wie andere Handle auch mit Skripten der Struktur
on <Menü-Handle>
"tue irgend etwas"
end <Menü-Handle>
abgearbeitet werden. In unserem Fall wird bei erfolgreichem Link das
Skript das Card-Buttons vervollständigt, so daß es nun so
aussieht:
on mouseUp
doCardLink <nnnn>
end mouseUp
Dabei ist <nnnn> die Nummer der Zielkarte. Danach oder
wenn der Benutzer "Abbruch" gewählt hat, wird das Menü "Neuer Link"
wieder gelöscht und mit push Card wieder zur Ausgangskarte
zurückgesprungen.
Das Ablegen auf einen Stack und das Zurückspringen via pop Card
und push Card ist ein bißchen mit Vorsicht zu verwenden. Wenn
irgendein anderes Skript zwischenzeitlich ebenfalls Karten auf den Stack ablegt
und diese noch nicht wieder zurückgeholt hat, bevor unser Skript push
Card aufruft, geraten wir vermutlich ganz woanders hin, nur nicht dahin,
wohin wir wollten. Im unserem Falle ist jedoch nicht zu erwarten, daß
zwischen der Entscheidung, einen Link anzulegen und der endgültigen
Auswahl der Zielkarte andere Skripte des Stacks mit pop Card und
push Card irgendwelche Schweinereien anstellen.
Wie Sie an diesem Skripten sehen, ist es mit HyperTalk möglich und sogar
sehr einfach, selbstmodifizierende Skripte per Programm zu erstellen. Diese an
sich mächtige Eigenschaft bietet viele Möglichkeiten, jedoch auch
einige Gefahren, vor allem, da ein Skript nicht nur der die Skripte des eigenen
Stack, sondern auch den Home Stack oder andere Stacks verändern kann
(Viren!). Fremde HyperCard-Stacks, die in Skripten "rumfummeln", sollten daher
immer mit äußerster Vorsicht behandelt werden. (Tatsache ist, der
einzige Macintosh-Virus, der mir in meiner beruflichen Laufbahn bisher
untergekommen ist, war ein HyperCard-Virus.)
Die weiteren Einzelheiten der Implementierung entnehmen Sie bitte den
Listings.
Ich habe sie (hoffentlich) ausgiebig kommentiert, so daß Ihnen das
Verstehen der - zugegeben teilweise etwas trickigen - Skripte gelingen sollte.
Zum Anzeigen der Filme und der Bilder benutzen wir zwei externe Kommandos,
deren Skripte wir ebenfalls programmgesteuert erstellen. Während das
picture-Kommando normalerweise in HyperCard als XCMD schon eingebaut
ist, müssen wir das movie-Kommando aus dem Stack "QuickTime
Tools" (gehört zum Lieferumfang von HyperCard) per ResEdit importieren.
Ich habe mit Bedacht zur Darstellung der Bilder das picture-External
ausgewählt und nicht addColor, das seit der Version 2.3 ebenfalls
zum Lieferumfang von HyperCard gehört. addColor ist m.E. nicht
nur zu langsam. Es verlangsamt auch die sonstige
Ausführungsgeschwindigkeit von HyperCard. Farbe ist daher leider immer
noch kein integrativer Bestandteil von HyperCard und Sie sollten sich gut
überlegen, wann und wo Sie in Ihren Stacks Farbe benutzen.
Zum Schluß nun das oben angekündigte Goodie für diese Folge.
Wie Ihnen vielleicht auch schon häufig aufgefallen ist, ist das
größte Problem von Schlagwortlisten ihre Inkonsistenz.
Schlagwörter werden versehentlich nicht einheitlich ausgewählt,
anders buchstabiert oder man hat sich schlicht vertippt. So stehen zum Beispiel
"Hypertext" und "HT" in der Schlagwortliste und beide meinen das Gleiche. Eine
(elektronische) Suche nach Schlagwörtern wird dadurch unnötig
erschwert. Viel schöner wäre es doch, wenn Schlagwörter in einer
vorher festgelegte Liste nur noch angeklickt werden müßten und dann
in das Schlagwortfeld übernommen werden:
Abb 2: Schlagwortliste
Die Power Tools, die zum Entwicklerpaket von HyperCard gehören,
halten hierzu eine "externe Funktion (XFCN)" bereit, die genau dies erledigt.
Wenn Sie - entweder mit Hilfe der Power Tools oder mit ResEdit - dieses XFCN in
Ihren Stack kopiert haben, steht Ihnen folgende Funktion zu Verfügung
showList (<Liste>, <Text>, <multSelect>, <keySelect>,~
"<Button 1 bis max. 4>", <hilited>, [left, top]
Diese Funktion haben wir auch schon weiter oben verwendet, um den
Benutzer die verschiedenen Links auswählen zu lassen. Dort haben wir
multSelect auf FALSE gesetzt. Hier hingegen sieht das in
unserem Beispielstack so aus:
on mouseUp
put return & ~
"Bitte Schlagwörter mit Apfeltaste auswählen"~
into prompt
put schlagworte() into list
get showList(list, prompt, TRUE, TRUE,"OK, Cancel", 0) <...>
end mouseUp
Dabei liefert Schlagworte die Liste von Schlagwörtern, getrennt
durch return:
function schlagworte
return ~
"3D" & return & ~
Agenten" & return & ~
<...>
"Zelluläre Automaten"
end schlagworte
Ich habe die Funktion "Schlagworte" in einem separaten Stack
"Schlagworte" untergebracht. Mit
on openStack
start using "Schlagworte"
end openStack
kann sie daher verschiedenen Stacks zugänglich gemacht werden. In
meiner Implementierung benutze ich sie für den HyperText-Notizstack, den
wir in dieser Folge angelegt haben und für einen Stack, in dem ich
Literaturverweise sammle. So habe ich in beiden Stacks immer die gleiche
konsistente Sammlung von Schlagwörtern.
Natürlich ist es möglich, das Skript zu dem Hypertext-Werkzeug so zu
verändern, daß Links ebenfalls über mehrere, verschiedene
Stacks möglich sind. Dazu müßte nicht nur die Card ID, sondern
auch der Name des Stacks in den Link-Button übernommen werden. Da
HyperCard es seit einiger Zeit auch erlaubt, mehrere Stacks gleichzeitig offen
zu halten, sind Fenster unterschiedlicher Größe denkbar, die
verschiedene Informationen offerieren. So könnten Sie sich ein Netzwerk
unterschiedlicher Stacks schaffen, die alle miteinander über Links
verbunden sind. Anregungen dafür liefert Hermann [5] in seinem
Rowohlt-Bändchen, das ich ebenfalls allen ernsthaft an HyperCard
Interessierten empfehlen möchte.
Auch müssen Links nicht immer nur von Texten ausgehen. Bilder könnten
ebenfalls Quellen von Links sein. Hierzu müßten Sie das
rect des Bildes abfragen, in das geklickt wurde und einen
transparenten Button in dieser Größe anlegen, der das Skript
für den Link enthält.
Ein weiterer Schritt wäre, HyperCard eine Karte des Stack-Netzwerkes
automatisch generieren zu lassen, die auf Wunsch anzeigt, an welcher Stelle der
Benutzer sich gerade befindet, um dem "Lost in Hyperspace"-Syndrom zu entgehen.
Auch hier bietet die Literatur (speziell [5], [6] und [7]) entsprechende
Anregungen und Ideen.
[1] George Coulouris, Harold Thimbleby: HyperProgrtamming. Building
interactive programs with HyperCard, Wokingham, England (Addison Wesley)
1992
[2] Sueann Ambron and Kristina Hooper, Apple Computer, Inc. (Eds.): Learning
with Interactive Multimedia. Developing and Using Multimedia Tools in
Education, Redmont (Microsoft Press) 1990
[3] Rainer Kuhlen: Hypertext. Ein nicht-lineares Medium zwischen Buch und
Wissensbank, Berlin (Springer Verlag) 1991
[4] Jakob Nielsen: Hypertext and Hypermedia, Cambridge, MA (Academic
Press) 1993
[5] Volker Hermann: HyperCard. Anwendungen für Einsteiger, Reinbek
(rororo 8196) 1992
[6] Tony Stanley: HyperTalk - HyperText. Programmierung mit Apples
HyperCard, Hannover (Verlag Heinz Heise) 1993
[7] Peter A. Gloor: Hypermedia-Anwendungsentwicklung. Eine Einführung
mit HyperCard-Beispielen, Stuttgart (Teubner) 1990
|