Fehlende Ziel-Angabe

Von Jürgen Schell. | 9 April, 2008 - 10:21
Beschreibung:

Änderungen in AppleScript haben leider dazu geführt, dass sich das sogenannte "Default Targeting" unterschiedlich verhält, abhängig davon, ob das Script im Programm selbst läuft oder aber es von außen (Script Editor) steuert. Mit "Default Targeting" ist gemeint, welches Ziel in einem Programm benutzt wird, wenn eine klare Zielangabe fehlt. In vielen Fällen wird dann die bestehende Auswahl ausgewertet. Die für das Programm gültige Auswahl steht aber nicht mehr zur Verfügung, wenn RagTime im Hintergrund ist.

Gehen wir von folgender Situationsannahme aus:

In RagTime ist ein Dokument mit mehreren Seiten geöffnet. Auf einer der Seiten ist ein Grafik-Objekt angeklickt, oder aber, es wurde zuletzt in den leeren Seitenbereich geklickt.

In RagTime 6.5 funktioniert dann folgendes Script:

make new rectangle with data {100, 100, 200, 300}

(Das »tell application "RagTime 6.5"« kann innerhalb von dem RagTime-Script-Editor natürlich fehlen. Das Script ist so vollständig.)

Ohne irgend eine Angabe, wo in einem Dokument dieses Rechteck angelegt werden soll, bestimmt die aktuelle Auswahl das Ziel. Das Rechteck wird auf der Zeichenfläche angelegt, die (oder in der) gerade die aktuelle Auswahl steht. Das ist zum Beispiel die Seite oder Zeichnung, in deren leeren Bereich zuletzt geklickt wurde. Oder aber die Seite / Zeichnung, in der gerade ein beliebiges Grafikobjekt ausgewählt ist.

Vom AppleScript Editor aus funktioniert diese Technik nur, wenn RagTime zuerst in den Vordergrund geholt wird:

tell application "RagTime 6.5"
     activate
     make new rectangle with data {100, 100, 200, 300}
end tell

Lässt man das »activate« weg, führt das Script in eine Fehlermeldung.

Um diese Technik noch etwas weiter zu illustrieren: Folgendes Script zieht Hilfslinien genau durch den Mittelpunkt des ausgewählten Objekts:

tell application "RagTime 6.5"
     activate
     set {X, Y} to position of selection
     make new vertical guide with data X
     make new horizontal guide with data Y
end tell

(Wiederum würde innerhalb von RagTime folgendes Script dasselbe tun:

set {X, Y} to position of selection
make new vertical guide with data X
make new horizontal guide with data Y
)

Im ersten Schritt wird die Position des Auswahl-Objekts ausgelesen. Da die Anweisung an RagTime geht (und nicht etwa an window 2 u.ä.) ist dies immer die Auswahl im aktuellen Dokument.

Die beiden folgenden Anweisungen legen Hilfslinien in der gerade benutzten Zeichnungsumgebung an. Das ist immer die Umgebung, in der das Objekt gerade ausgewählt ist.

Kriterium dafür, dass die Zielangabe fehlt, ist die fehlende “at�-Klausel. Selbst, wenn der “make new...�-Ausdruck in einem tell-Block steht, wird er als “Ohne Zielangabe� behandelt, wenn das “at� fehlt. Folgende Beispiele

tell application "RagTime 6.5" -- Fehlerbeispiel
     activate
     make new rectangle with data {100, 100, 200, 300} at beginning
end tell

Das Script führt bei Ausführung in eine Fehlermeldung. Wenn die “at�-Klausel vorhanden ist, muss das Ziel vollständig gegeben sein.

Für das nächste Beispiel wieder eine Situationsannahme: Sie haben ein Layout mit drei Seiten vor sich und ein Objekt auf Seite 3 angeglickt:

tell application "RagTime 6.5"
     tell page 1 of layout 1 of document 1
          activate
          make new rectangle with data {100, 100, 200, 200}
          make new rectangle with data {100, 100, 350, 350} at beginning
     end tell
end tell

Bei dem ersten (kleineren) Rechteck fehlt die “at�-Klausel. Die Anweisung geht an die aktuelle Zeichnungsumgebung und das Rechteck erscheint auf der angeklickten Seite 3 trotz des umgebenden “tell�.

Das zweite Rechteck hat eine “at�-Klausel und der umgebende tell-Block gibt das Ziel vollständig an. Das Rechteck wird auf Seite 1 erzeugt.

Selbst, wenn in dem “tell� ein “of document 2� stünde, würde das erste Rechteck in Dokument 1 angelegt werden, das zweite aber in Dokument 2. Deutlich sieht man den Unterschied, wenn man sich im AppleEvent Log ansieht, wie die Kommunikation mit RagTime abläuft:

tell application "RagTime 6.5" -- Ausschnitt aus AppleEvent Log
     activate page 1 of layout 1 of document 1
     make new rectangle with data {100, 100, 200, 200}
     --> rectangle 1 of page 3 of layout "Layout 1" of document id 1
     make new rectangle with data {100, 100, 350, 350} at beginning of page 1 of layout 1 of document 1
     --> rectangle 1 of page 1 of layout "Layout 1" of document id 1
end tell