Datenformate in der Zwischenablage

Flash Player 10 und höher, Adobe AIR 1.0 und höher

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>