Yeah, me

Foto: Uwe Pirr

Informatik


previous Page home toc next Page

Programmieren in HyperTalk, Teil VI

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?

Was ist eigentlich Hypertext?

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.

Ein Hypertext/Hypermedia-Autoren-Werkzeug

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.


Nicht benutzte Mausklicks abfangen

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

Menüs und Skripte per Programm erstellen

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.

Externe Kommandos benutzen

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.

Schlagworte vereinheitlichen

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.

Wie weiter?

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.

Literaturliste

[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


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:32 Uhr
email:joerg@kantel.de
This page is best viewed with a computer and a monitor

Site Meter