Wenn Aktionen Auswahl oder Bezug ändern

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

Beim Arbeiten mit Variablen, denen das selection-Objekt zugewiesen wurde, kann auch die Änderung der Auswahl durch eine Script-Aktion oder aber die Änderung ihres Bezugs eine Falle stellen.

Folgende Script-Varianten gehen davon aus, dass ein Rechteck ausgewählt ist.

Variante 1

tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     make new rectangle at before Auswahl with data {50, 100, 150, 300}
     set color of Auswahl to {cyan:10, magenta:50, yellow:80, black:5}
end tell

Variante 2

tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     make new rectangle at before Auswahl with data {50, 100, 150, 300}
     set color of selection of window 1 to {cyan:10, magenta:50, yellow:80, black:5}
end tell

In Variante 1 wird das neu angelegte Rechteck orange gefärbt, in Variante 2 das ausgewählte. Grund: Die Variable Auswahl enthält eine Referenz auf das Rechteck nach Index. Dadurch, das vor dem ausgewählten Rechteck ein neues angelegt wurde, hat dieses neue Rechteck den Index, den vorher das ausgewählte hatte. “Auswahl� zeigt deshalb jetzt auf das neue Rechteck.

Besonders bei Texten kann sich die Auswahl von Buchstaben durch Hinzufügen oder Löschen ändern. Ein Beispielscript soll vor und nach der Auswahl einen Bindestrich einfügen.

tell application "RagTime 6.5"-- Unerwartetes Resultat
     set Auswahl to selection of window 1
     set insertion point before Auswahl to "-"
     set insertion point after Auswahl to "-"
end tell

Durch das Einfügen des ersten Bindestrichs hat sich die Anzahl der Buchstaben verändert. Der zweite wird deshalb einen Buchstaben zu früh eingefügt.

In einen Fehler läuft auch die naheliegende Idee, direkt auf selection zu arbeiten:

tell application "RagTime 6.5"-- Fehlerhaftes Beispiel
     set insertion point before selection of window 1 to "-"
     set insertion point after selection of window 1 to "-"
end tell

Einer der Fälle, in denen sich der direkte und der indirekte Zugriff auf die Auswahl unterscheiden.

Eine Lösungsmöglichkeit ist, in der ersten Variante die Auswahl erneut abzufragen:

tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     set insertion point before Auswahl to "-"
     set Auswahl to selection of window 1
     set insertion point after Auswahl to "-"
end tell

In Fällen wie diesem, in dem die Aktion die Anzahl der Buchstaben auf jeden Fall vergrößert, kann man natürlich auch einfach die Reihenfolge beim Einsetzen ändern und von hinten nach vorn arbeiten:

tell application "RagTime 6.5"
     set Auswahl to selection of window 1
     set insertion point after Auswahl to "-"
     set insertion point before Auswahl to "-"
end tell