5.7 Beispiel 9: Eigenschaften-Dialogfenster zur Auswahl einer Datei

Ein Vorteil der Auswahl von Werten aus einem Auswahlmenü im Eigenschaften-Dialogfenster ist, dass Fehlereingaben fast ausgeschlossen sind. Wenn ein bestimmter Darsteller über ein Pulldown-Menü ausgewählt wird, ist sichergestellt, dass der entsprechende Darsteller auch wirklich existiert. Leider fehlt dem Director-eigenen Dialogfenster die Möglichkeit, eine externe Datei auszuwählen, beispielsweise wenn zu einem anderen Film gesprungen werden soll. Das folgende Skript realisiert eine solche Eingabe mit Hilfe des FileXtras, das standardmäßig mit Director 7 installiert wird. Die Auswahl findet in einem gewöhnlichen Datei-Öffnen-Dialog statt. So ist sichergestellt, dass die ausgewählte Datei auch tatsächlich existiert.

Wie bei einem Director-Eingabedialog müssen wir auch hier die benutzten Eigenschaften im getPropertyDescriptionList()-Handler definieren. Die Eigenschaft mMoviePath, die den Pfad des Films speichert, ist eine Zeichenkette, die auf den Anfangswert EMPTY gesetzt wird. Das eigentliche Öffnen des Datei-Fensters geschieht im runPropertyDialog()-Handler. Zuerst wird geprüft, ob der Film schon gespeichert wurde, da der ausgewählte Dateinamen als relativer Pfad zum aktuellen Film gespeichert werden soll. Auf diese Weise ist die Verknüpfung auch noch gültig, wenn das gesamte Projekt verschoben oder auf einem anderen Rechner installiert wird. Wenn noch kein Dateiname des aktuellen Films vorliegt, weist eine Warnmeldung den Benutzer darauf hin. Wurde der Film schon gespeichert, öffnet das Skript mit dem FileXtra Befehl FileOpenDialog ein Datei-Öffnen Fenster. Das angezeigte Verzeichnis wird auf das des aktuellen Filmes gesetzt, wozu die Methode pfadExtrahieren() benutzt wird. Der ausgewählte Dateiname wird dann mit der Methode generiereRelativenPfad() erzeugt, bei Klick auf den Abbrechen-Button wird der vorherige Wert übernommen. Damit die Verknüpfung auf allen Plattformen funktioniert, wird der relative Pfad mit dem @-Operator gebildet. Dadurch kann das Skript sowohl auf dem Mac wie auch unter Windows ohne Modifikation übernommen werden.

Dies ist das vollständige Skript des go to movie...-Verhaltens

-- wechselt zu einem neuen Film; die Datei des neuen
-- Films wird mit Hilfe des Datei-Öffnen-Dialogs
-- des FileXtras ausgewählt; dabei wird automatisch ein
-- relativer Pfad generiert

property mMoviePath

on exitFrame me
go to movie mMoviePath
end exitFrame

on getPropertyDescriptionList
set description = [:]
description.addProp(#mMoviePath, [ #comment: "Neuer Movie:",
#format: #string,
#default: EMPTY])
return description
end getPropertyDescriptionList

on runPropertyDialog me, propertyList
if the moviePath = EMPTY then
-- Film wurde noch nicht gespeichert
alert("Der Film muss erst gespeichert werden!")
return propertyList
else
if propertyList.mMoviePath = EMPTY then
anzuzeigenderPfad = the moviePath
else
-- den Pfad aus mMoviePath extrahieren
anzuzeigenderPfad = me.PfadExtrahieren(propertyList.mMoviePath)
end if
if the platform contains "Windows" then
ergebnis = FileOpenDialog(anzuzeigenderPfad, "Director-Film/*.dir",
"Neuen Film auswählen", FALSE, TRUE)
else
-- auf dem Mac hier den benötigten Filetype eintragen
ergebnis = FileOpenDialog(anzuzeigenderPfad, "")
end if
if (ergebnis = EMPTY) then
-- Dialog wurde abgebrochen
return propertyList
else
-- neuer Name wurde eingegeben
neuerPfad = me.generiereRelativenPfad(ergebnis, me.getMoviePath())
propertyList.mMoviePath = neuerPfad
return propertyList
end if
end if
end runPropertyDialog

on generiereRelativenPfad me, pfad, relativZu
-- gibt den Dateipfad pfad relativ zu Pfad relativZu
-- in unabhängigem Director-Format (@/.../...) zurück
tempId = the itemdelimiter
the itemdelimiter = me.trennzeichen()
if pfad.item[1] = relativZu.item[1] then
-- Pfad kann relativ angegeben werden
repeat while pfad.item[1] = relativZu.item[1]
delete pfad.item[1]
delete relativZu.item[1]
end repeat
-- ermitteln, wieviele Ordner aufwärts gegangen werden muss (..)
repeat with ebenen = 1 to (relativZu.items.count - 1)
pfad = "/" & pfad
end repeat
-- Trennzeichen durch "/" ersetzen
repeat while pfad contains me.trennzeichen()
put "/" into pfad.char[offset(me.trennzeichen(), pfad)]
end repeat
-- "@/" voranstellen
pfad = "@/" & pfad
else
-- Pfad kann nicht relativ angegeben werden
alert("Der Pfad kann nicht relativ angegeben werden!")
end if
the itemdelimiter = tempId
return pfad
end generiereRelativenPfad

on pfadExtrahieren me, dateiname
-- extrahiert aus dem angegebenen absoluten Dateinamen den Pfad
tempId = the itemdelimiter
the itemdelimiter = me.trennzeichen()
delete the last item of dateiname
the itemdelimiter = tempId
return dateiname
end pfadExtrahieren

on trennzeichen me
-- liefert das Plattformspezifische Pfadtrennzeichen zurück
if the platform contains "Windows" then
return "\"
else
return ":"
end if
end trennzeichen

on getMoviePath me
-- gibt den Moviepath zurück; es ist garantiert, dass der Pfad immer mit
-- "\" bzw. ":" aufhört!
if the last char of the moviePath = me.trennzeichen() then
return the moviePath
else
return the moviePath & me.trennzeichen()
end if
end getMoviePath

on getBehaviorDescription
return "Springt zu einem neuen Movie."& RETURN
& "Der angegebene Pfad wird relativ zum aktuellen Film gespeichert." & RETURN
& "Achtung: Das FileXtra muss sich im Director-Ordner befinden!"
end getBehaviorDescription

Quellcode des Beispiels

5.6 Eingabe von Parametern mit on getPropertyDescriptionList und on runPropertyDialog 5.8 Ermitteln des Sprites zu einem Verhalten mit the spriteNum