|
Eigene Smart Elements

Beispiele für Nachrichten mit dem Tell-Befehl
Der tell-Befehl ist eine spezielle Erweiterung des TCL-Befehlsatzes. Er steht nur in Javanti zur Verfügung. Seine Syntax lautet:
tell zielLayer zielElement nachricht
Beispiel:
tell layer1 elementName.subName "any kind of message"
Nachrichten können Anweisungen oder Anweisungsfolgen für ein Element sein. Es kann sich dabei auch um Anfragen handeln, die ein Ergebnis zurück liefern.
Beispiel 1: Effekte
Der tell-Befehl eignet sich, um auf grafische Elemente Effekte anzuwenden. Ein typischer Effekt bei Präsentationen ist das Hereinfliegen einzelner Text- oder Bildelemente. In Javanti gibt es bereits einen Animationsbefehl ("slide"), mit dem sich solche Bewegungsabläufe festlegen lassen. Zum Beispiel läßt
slide layer1 element1.subname x -100 20 10
das Element "element1.subname" im Layer "layer1" von der x-Position -100% (also außerhalb des linken Bildschirmrandes) zur Position x=20% wandern. Dabei soll diese Bewegung 10 Zeiteinheiten dauern. Dieser Befehl läßt also ein Element vom linken Bildschirmrand kommend auf die Tafel fliegen. Der Befehl erlaubt eine genaue Konfiguration, ist jedoch auch etwas umständlich anzuwenden, da man sich stets an alle Parameter erinnern muss. Eine sinnvolle Anwendung des tell-Befehles kann es sein, dass ein Element auf Nachrichten reagiert, indem es vorkonfigurierte Animationsbefehle ausführt.
Statt des oben stehenden slide-Befehls könnte man tell-Befehle einsetzen:
tell layer1 elment1.subname flyin
Was hier passiert ist für den Durchschnittsanwender sehr viel verständlicher. Man könnte die Nachricht auch aus mehreren Einheiten bestehen lassen, um sie (optional) zu parametrisieren:
tell layer1 elment1.subname "flyin left"
tell layer1 elment1.subname "flyin right"
tell layer1 elment1.subname "flyin bottom"
tell layer1 elment1.subname "flyin top"
Beispiel 2: Operationen auf einem Element ausführen
Über den tell-Befehl läßt sich auch der interne Zustand eines Elementes verändern. So könnte der tell-Befehl verwendet werden, um ein Element sichtbar oder unsichtbar zu machen:
tell layer1 element1.subname "visible"
tell layer1 element1.subname "invisible"
Diese Beispiele stehen in direkter Konkurrenz zum setProperty-Befehl, mit dem sich ebenfalls die Eigenschaften (und damit der interne Zustand) eines Elementes setzen lassen.
Der tell-Befehl kann auch dazu benutzt werden, den Zustandsänderungen auf des Basis bisherigen Zustandes durchzuführen. Ein Beispiel wäre ein tell-Befehl, der die Farbhelligkeit eines Elementes erhöht:
tell layer1 element1.subname "lighten"
Den gleichen Effekt könnte man wiederum mit setProperty-Befehlen erreichen, jedoch wesentlich komplizierter, da die alten Eigenschaftswerte "per Hand" ausgelesen werden müssen.
setProperty layer1 element1.subName red [expr [getProperty layer1 element1.subName red] + 5]
setProperty layer1 element1.subName green [expr [getProperty layer1 element1.subName green] + 5]
setProperty layer1 element1.subName blue [expr [getProperty layer1 element1.subName blue] + 5]
Der tell-Befehl eignet sich auch zur Definition für Methoden, die auf ein Element angewendet werden können. Ein Element, das einen Inhaltsstring als Eigenschaft besitzt ("textContent") könnte zum Beispiel auf eine Nachfrage reagieren, die alle Buchstaben in Grossbuchstaben umwandelt:
tell layer1 element1.subName "uppercase"
Solche Methoden können sich auch auf markierte Teile eines Strings beziehen. Voraussetzung ist natürlich, dass das Element weitere Eigenschaften besitzt, über die die Markierung beschrieben wird. Ein Beispiel sind hier Boolsche Ausdrücke.
Eine Eigenschaft expression vom Typ könnte mit "(a and a) or b" belegt sein. Hierauf läßt sich eine Vereinfachugsoperation anwenden:
tell layer1 boolElement.subName "vereinfachungsregel"
Das Ergebnis ist ein neuer Eigenschaftswert "a or b"
Beispiel 3: Interpretation von Anweisungen
Die Nachricht des tell-Befehls kann auch eine oder mehrere Anweisungen enthalten. Ein Element kann als Interpretierer einer beliebigen Sprache eingesetzt werden. Ein Beispiel wäre ein Element, das eine Turtle-Grafik anbietet. Das Element selbst stellt die Zeichen-Turtle und die bisher gezeichneten Strecken. Über den Tell-Befehl lässt sich der nächste Zeichenschritt bzw. die nächsten Zeichenschritte festlegen:
tell layer1 turtleElement "forward 30"
tell layer1 turtleElement "left 20"
tell layer1 turtleElement "forward 30"
tell layer1 turtleElement {
forward 30
left 20
up
forward 100
down
right 90
back 20
}
Die geschweiften Klammern um das Turtle-Skript bewirken, dass der TCL-Interpreter (der ja für die Verarbeitung-des tell-Befehls zuständig ist) den gesamten Anweisungsblock als einziges Argument auffasst. Dieses Argument wird als String-Objekt der tell-Methode von TAPElement (bzw. deren Unterklassen) übergeben. Innerhalb dieser Methode haben Sie die Gelegenheit, den String wiederum auf beliebige Weise zu interpretieren. Es ist sogar möglich, diesen String wieder als TCL-Script zu verstehen und an den TCL-Interpreter von Javanti zu senden.
Ein weiteres Anwendungsbeispiel für Anweisungs-Nachrichten sind SQL-Statements. Ein SQL-Statement kann dabei als Nachricht an das Element gesendet werden. In diesem Fall ist die Nachricht eine Anfrage, die zu einem Ergebnis führt. Dieses Ergebnis kann ganz oder teilweise als Rückgabe-Wert des tell-Befehls geliefert werden. Bei komplexen Ergebnissen muss das Ergebnis evt. im Element zwischengespeichert und über weitere tell-Anfragen bereitgestellt werden. Beispiel:
tell layer1 sqlElement.sub {SELECT * FROM foodTable WHERE coffee="Starbucks"}
sql, lern-elemente, 3d, turtle-grafik
Beispiel 4: Ereignisse auslösen
In den Eigenschaftsgruppen von Javanti können Ereignisskripte definiert werden. Dabei handelt es sich um Eigenschaften vom Typ SCRIPT_TYPE, im Grunde ein einfacher String, der ein TCL-Script enthält. Diese vom Benutzer definierbaren Skripte werden ausgeführt, wenn bestimmte Ereignisse auftreten. Wenn z.B. ein Maus- oder Tastaturereignis in der Swing-Komponente auftritt, die zum Element gehört, dann wird das passende Skript an den TCL-Interpreter von Javanti gesendet. Mit Hilfe des tell-Befehls könnten Ereignisskripte manuell gestartet werden:
tell layer1 element1.subName "fire mPressed"
Hier würde dann das mPressed-Ereignisskript an den TCL-Interpreter gesendet, obwohl die Maus gar nicht in der dazugehörenden Swing-Komonente gedrückt wurde. Die Idee ist, dass man die Ereignisse eines anderen Elementes weiterleiten kann. Wenn z.B. in einem Element die Maus tatsächlich gedrückt wurde, dann könnte dessen Ereignisskript auch die Ausführung der Ereignisskripte weiterer Elemente starten.
Kurz und gut: Durch das Senden einer Nachricht an ein Element kann ein Ereignis simuliert werden. Ein weiterer Vorteil besteht nun darin, dass man weitere Ereignisse defiieren kann. Und zwar auch solche Ereignisse, die nicht durch die grafische Bedienoberfläche erzeugt werden. Ein Anwendungsbeispiel sind hier sogenannte Lernelemente. Ein Lernelement zeichnet sich dadurch aus, dass es einen Lösungsvorschlang des Benutzers bewerten kann. Der Lösungsvorschlag kann dabei im Element selbst (z.B. Texteingabe in der dazugehörigen Swing-Komponente) oder durch andere Elemente gegeben sein.Im letzteren Fall würde das Lernelement also andere Elemente überprüfen.
Die Evaluierung des Lösungsvorschlages soll natürlich erst erfolgen, wenn der Benutzer seine Lösung vollständig eingegeben hat oder eine festgelegte Bearbeitungszeit verstrichen ist. Dem Lernelement kann dann über eine Nachricht mitgeteilt werden, dass die Auswertung der Lösung begonnen werden kann:
tell layer1 lernElement.subName "startEvaluation"
Dieser tell-Befehl könnte sich z.B. im Ereignisskript "mClicked" eines Button befinden. Wenn der der Benutzer zur Laufzeit der Präsentation dann auf den Button klickt, wird das Lernelement benachrichtigt, dass die Auswertung beginnen soll.
Am Ende der Auswertung steht fest, ob die Aufgabe richtig oder falsch gelöst wurde. Nach der Auswertung gibt es daher ein z.B. ein Ereignis "correctSolution" oder "badSolution". Für diese beiden Ereignisse könnte man im Objektinspektor Ereignisskripte definieren, die dann beim Auftreten des jeweiligen Ereignissenes ausgeführt werden.
Wichiger Hinweis
Hier wurde eine Reihe verschiedener Einsatzmöglichkeiten des tell-Befehls vorgestellt. Wie und auf welche Nachrichten ein Element reagiert ist jeweils Sache des Elementes. Jedem Element bleibt es überlassen, unbekannte Nachrichten zu ignorieren oder eine Fehlermeldung auszugeben.
Der abstrakte Datentyp TAPElement sieht bereits eine Methode vor, mit der eine Reihe von Defaultnachrichten veröffentlicht werden können. Der Benutzer kann dann später per Drag & Drop aus dieser Defaultliste Nachrichten wählen und für ein Element festlegen. Im Moment wird dies jedoch noch nicht unterstützt. Die Methode heißt getTellCommands und liefert eine Enumeration über String-Objekte, die jeweils eine Defaultnachricht enthalten.
|