Mit den Zwischenablageformaten werden die Daten, die in ein Clipboard-Objekt platziert wurden, beschrieben. Die Standarddatenformate werden von Flash Player bzw. AIR automatisch zwischen ActionScript-Datentypen und Formaten für die Zwischenablage des Systems übersetzt. Außerdem können Anwendungsobjekte innerhalb und zwischen ActionScript-basierten Anwendungen mithilfe von anwendungsdefinierten Formaten übertragen werden.
Ein Clipboard-Objekt kann Darstellungen derselben Informationen in unterschiedlichen Formaten enthalten. Beispielswise könnte ein Clipboard-Objekt, dass ein „Sprite“ darstellt, Folgendes enthalten: ein Verweisformat zur Verwendung in derselben Anwendung, ein serialisiertes Format für eine andere in Flash Player oder AIR ausgeführte Anwendung, ein Bitmapformat für ein Bildbearbeitungsprogramm und ein Dateilistenformat, möglicherweise mit verzögerter Darstellung zur Kodierung einer PNG-Datei, um eine Darstellung des „Sprite“ in das Dateisystem kopieren oder ziehen zu können.
Standarddatenformate
Die Konstanten für die Definition von Standardformatnamen werden durch die ClipboardFormats-Klasse bereitgestellt:
Konstante
|
Beschreibung
|
TEXT_FORMAT
|
Daten im Textformat werden in die und aus der String-Klasse von ActionScript übersetzt.
|
HTML_FORMAT
|
Text mit HTML-Code.
|
RICH_TEXT_FORMAT
|
Daten im Rich-Text-Format werden in die und aus der ByteArray-Klasse von ActionScript übersetzt. Der RTF-Code wird nicht interpretiert oder übersetzt.
|
BITMAP_FORMAT
|
(Nur AIR) Daten in diesem Format werden in die und aus der ActionScript-BitmapData-Klasse übersetzt.
|
FILE_LIST_FORMAT
|
(Nur AIR) Daten in diesem Format werden in die und aus der ActionScript-File-Klasse übersetzt.
|
URL_FORMAT
|
(Nur AIR) Daten in diesem Format werden in die und aus der ActionScript-String-Klasse übersetzt.
|
Wenn Daten in Reaktion auf ein
copy
-,
cut
- oder
paste
-Ereignis in HTML-Inhalt, der in einer AIR-Anwendung gehostet wird, kopiert und eingefügt werden, müssen anstelle der ClipboardFormat-Strings MIME-Typen verwendet werden. Folgende MIME-Typen sind für die Daten gültig:
MIME-Typ
|
Beschreibung
|
Text
|
"text/plain"
|
URL
|
"text/uri-list"
|
Bitmap
|
"image/x-vnd.adobe.air.bitmap"
|
File list
|
"application/x-vnd.adobe.air.file-list"
|
Hinweis:
Daten im Rich-Text-Format werden nicht über das Ereignis
clipboardData
des Ereignisobjekts, das infolge eines
paste
-Ereignisses in HTML-Inhalten ausgelöst wurde, zur Verfügung gestellt.
Benutzerdefinierte Datenformate
Sie können eigene anwendungsdefinierte Formate verwenden, um Objekte als Referenzen oder als serialisierte Kopien zu übertragen. Verweise sind nur innerhalb derselben Anwendung gültig. Serialisierte Objekte können zwischen Anwendungen übertragen werden, können jedoch nur mit Objekten verwendet werden, die gültig bleiben, wenn sie serialisiert und deserialisiert werden. Objekte können in der Regel serialisiert werden, wenn ihre Eigenschaften einfache Typen oder serialisierbare Objekte sind.
Um einem Clipboard-Objekt ein serialisiertes Objekt hinzuzufügen, stellen Sie den
serializable
-Parameter auf
true
ein, wenn Sie die
Clipboard.setData()
-Methode aufrufen. Der Formatname kann auf eines der Standardformate verweisen oder ein willkürlicher, von Ihrer Anwendung festgelegter String sein.
Übertragungsmodi
Wenn ein Objekt in einem benutzerdefinierten Datenformat in die Zwischenablage geschrieben wird, können die Objektdaten als Verweis oder als serialisierte Kopie des Originalobjekts aus der Zwischenablage gelesen werden. Es gibt vier Übertragungsmodi, durch die festgelegt wird, ob Objekte als Verweise oder serialisierte Kopien übertragen werden:
Übertragungsmodus
|
Beschreibung
|
ClipboardTransferModes.ORIGINAL_ONLY
|
Es wird nur eine Referenz zurückgegeben. Stehen keine Referenzen zur Verfügung, wird ein Null-Wert zurückgegeben.
|
ClipboardTransferModes.ORIGINAL_PREFFERED
|
Wenn verfügbar, wird eine Referenz zurückgegeben. Wenn nicht, wird eine serialisierte Kopie zurückgegeben.
|
ClipboardTransferModes.CLONE_ONLY
|
Es wird nur eine serialisierte Kopie zurückgegeben. Steht keine serialisierte Kopie zur Verfügung, wird ein Null-Wert zurückgegeben.
|
ClipboardTransferModes.CLONE_PREFFERED
|
Wenn verfügbar, wird eine serialisierte Kopie zurückgegeben. Wenn nicht, wird eine Referenz zurückgegeben.
|
Lesen und Schreiben von benutzerdefinierten Datenformaten
Wenn Sie ein Objekt in die Zwischenablage schreiben, können Sie einen beliebigen String, der nicht mit den reservierten Präfixen
air:
oder
flash:
beginnt, für den
format
-Parameter verwenden. Verwenden Sie denselben String wie für das Format, um das Objekt zu lesen Im folgenden Beispiel wird gezeigt, wie Objekte in die Zwischenablage geschrieben und aus dieser gelesen werden:
public function createClipboardObject(object:Object):Clipboard{
var transfer:Clipboard = Clipboard.generalClipboard;
transfer.setData("object", object, true);
}
Verwenden Sie denselben Formatnamen und den Übertragungsmodus
CLONE_ONLY
oder
CLONE_PREFFERED
, um ein serialisiertes Objekt (nach einem Zieh- oder Einfügevorgang) aus dem Clipboard-Objekt zu extrahieren.
var transfer:Object = clipboard.getData("object", ClipboardTransferMode.CLONE_ONLY);
Dem Clipboard-Objekt wird immer eine Referenz hinzugefügt. Um statt des serialisierten Objekts den Verweis aus dem Clipboard-Objekt zu extrahieren (nach einem Drop- oder Einfügevorgang), verwenden Sie den
ORIGINAL_ONLY
- oder
ORIGINAL_PREFFERED
-Übertragungsmodus.
var transferredObject:Object =
clipboard.getData("object", ClipboardTransferMode.ORIGINAL_ONLY);
Verweise sind nur gültig, wenn das Clipboard-Objekt aus der aktuellen Anwendung stammt. Greifen Sie mit dem
ORIGINAL_PREFFERED
-Übertragungsmodus auf den Verweis zu, wenn er verfügbar ist, oder auf den serialisierten Klon, wenn der Verweis nicht verfügbar ist.
Zurückgestellte Wiedergabe
Wenn die Erstellung eines Datenformats eine große Rechnerleistung erfordert, können Sie die zurückgestellte Wiedergabe verwenden, indem Sie eine Funktion angeben, die die Daten bei Bedarf zur Verfügung stellt. Diese Funktion wird nur dann aufgerufen, wenn der Empfänger eines Zieh- oder Einfügevorgangs die Daten im zurückgestellten Format anfordert.
Die Wiedergabefunktion wird mit der Methode
setDataHandler()
zum Clipboard-Objekt hinzugefügt. Die Funktion muss die Daten im entsprechenden Format zurückgeben. Haben Sie zum Beispiel
setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText)
aufgerufen, dann muss die Funktion
writeText()
einen String zurückgeben.
Wird ein Datenformat desselben Typs mit der Methode
setData()
zum Clipboard-Objekt hinzugefügt, haben diese Daten Vorrang vor der zurückgestellten Version (die Wiedergabefunktion wird nie aufgerufen). Möglicherweise wird die Wiedergabefunktion aufgerufen, wenn auf dieselben Daten in der Zwischenablage ein zweites Mal zugegriffen wird.
Hinweis:
Unter Mac OS X kann die verzögerte Darstellung nur an benutzerdefinierten Datenformaten ausgeführt werden. Bei Standarddatenformaten wird die Darstellungsfunktion sofort aufgerufen.
Einfügen von Text mit zurückgestellter Wiedergabefunktion
Im folgenden Beispiel wird gezeigt, wie die Funktion für die zurückgestellte Wiedergabe eingesetzt wird.
Beim Klicken auf die Schaltfläche „Kopieren“ wird der Inhalt der Zwischenablage des Systems gelöscht, um sicherzustellen, dass keine Daten von vorherigen Vorgängen in der Zwischenablage verbleiben. Anschließend wird mithilfe der
setDataHandler()
-Methode die
renderData()
-Funktion als Darstellungsfunktion der Zwischenablage eingestellt.
Wenn der Benutzer im Kontextmenü des Zieltextfelds den Befehl „Einfügen“ auswählt, greift die Anwendung auf die Zwischenablage zu und legt den Zieltext fest. Da das Textdatenformat in der Zwischenablage nicht mit einem String sondern einer Funktion eingestellt wurde, ruft die Zwischenablage die
renderData()
-Funktion auf. Die Funktion
renderData()
gibt den Text im Quelltext zurück, der dann einem Zieltext zugeordnet wird.
Beachten Sie, das Bearbeitungsvorgänge am Quelltext vor dem Betätigen der Schaltfläche „Einfügen“ im eingefügten Text sichtbar sind, auch wenn die Änderungen nach dem Betätigen der Schaltfläche „Kopieren“ getätigt wurden. Die Wiedergabefunktion kopiert den Quelltext erst, wenn die Schaltfläche „Einfügen“ betätigt wird. (Bei Verwendung der zurückgestellten Wiedergabe in einer echten Anwendung sollten Sie daher die Quelldaten möglicherweise speichern oder schützen, um dieses Problem zu vermeiden.)
Flash-Beispiel
package {
import flash.desktop.Clipboard;
import flash.desktop.ClipboardFormats;
import flash.desktop.ClipboardTransferMode;
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldType;
import flash.events.MouseEvent;
import flash.events.Event;
public class DeferredRenderingExample extends Sprite
{
private var sourceTextField:TextField;
private var destination:TextField;
private var copyText:TextField;
public function DeferredRenderingExample():void
{
sourceTextField = createTextField(10, 10, 380, 90);
sourceTextField.text = "Neque porro quisquam est qui dolorem "
+ "ipsum quia dolor sit amet, consectetur, adipisci velit.";
copyText = createTextField(10, 110, 35, 20);
copyText.htmlText = "<a href='#'>Copy</a>";
copyText.addEventListener(MouseEvent.CLICK, onCopy);
destination = createTextField(10, 145, 380, 90);
destination.addEventListener(Event.PASTE, onPaste);
}
private function createTextField(x:Number, y:Number, width:Number,
height:Number):TextField
{
var newTxt:TextField = new TextField();
newTxt.x = x;
newTxt.y = y;
newTxt.height = height;
newTxt.width = width;
newTxt.border = true;
newTxt.multiline = true;
newTxt.wordWrap = true;
newTxt.type = TextFieldType.INPUT;
addChild(newTxt);
return newTxt;
}
public function onCopy(event:MouseEvent):void
{
Clipboard.generalClipboard.clear();
Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT,
renderData);
}
public function onPaste(event:Event):void
{
sourceTextField.text =
Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT).toString;
}
public function renderData():String
{
trace("Rendering data");
var sourceStr:String = sourceTextField.text;
if (sourceTextField.selectionEndIndex >
sourceTextField.selectionBeginIndex)
{
return sourceStr.substring(sourceTextField.selectionBeginIndex,
sourceTextField.selectionEndIndex);
}
else
{
return sourceStr;
}
}
}
}
Flex-Beispiel
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="326" height="330" applicationComplete="init()">
<mx:Script>
<![CDATA[
import flash.desktop.Clipboard;
import flash.desktop.ClipboardFormats;
public function init():void
{
destination.addEventListener("paste", doPaste);
}
public function doCopy():void
{
Clipboard.generalClipboard.clear();
Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT, renderData);
}
public function doPaste(event:Event):void
{
destination.text = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT).toString;
}
public function renderData():String{
trace("Rendering data");
return source.text;
}
]]>
</mx:Script>
<mx:Label x="10" y="10" text="Source"/>
<mx:TextArea id="source" x="10" y="36" width="300" height="100">
<mx:text>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.</mx:text>
</mx:TextArea>
<mx:Label x="10" y="181" text="Destination"/>
<mx:TextArea id="destination" x="12" y="207" width="300" height="100"/>
<mx:Button click="doCopy();" x="91" y="156" label="Copy"/>
</mx:Application>
|
|
|