Klembordgegevensindelingen

Flash Player 10 of hoger, Adobe AIR 1.0 of hoger

Klembordindelingen beschreven de gegevens die in een klembordobject zijn geplaatst. Flash Player of AIR zet de standaard gegevensindelingen automatisch om van ActionScript-gegevenstypen in systeemklembordindelingen, en omgekeerd. Bovendien kunnen toepassingsobjecten worden overgebracht binnen en tussen ActionScript-toepassingen met behulp van toepassingsspecifieke indelingen.

Een klembordobject kan dezelfde informatie in meerdere indelingen bevatten. Een klembordobject dat een sprite representeert, kan bijvoorbeeld een referentie-indeling bevatten voor gebruik in dezelfde toepassing, een geserialiseerde indeling voor gebruik door een andere toepassing die wordt uitgevoerd in Flash Player of AIR, een bitmapindeling voor gebruik door een grafische editor en een bestandenlijstindeling, mogelijk met uitgestelde rendering om een PNG-bestand te coderen, voor het kopiëren of slepen van een representatie van de sprite naar het bestandssysteem.

Standaard gegevensindelingen

De constanten die de standaard indelingsnamen definiëren, staan in de klasse ClipboardFormats:

Constante

Beschrijving

TEXT_FORMAT

Gegevens met tekstindeling worden omgezet in de ActionScript-klasse String, en omgekeerd.

HTML_FORMAT

Tekst met HTML-markeringen.

RICH_TEXT_FORMAT

RTF-gegevens worden omgezet in de ActionScript-klasse ByteArray, en omgekeerd. De RTF-markeringen worden op geen enkele manier geïnterpreteerd of omgezet.

BITMAP_FORMAT

(Alleen AIR) Gegevens met bitmapindeling worden omgezet in de ActionScript-klasse BitmapData, en omgekeerd.

FILE_LIST_FORMAT

(Alleen AIR) Gegevens met bestandenlijstindeling worden omgezet in een array van ActionScript File-objecten, en omgekeerd.

URL_FORMAT

(Alleen AIR) Gegevens met URL-indeling worden omgezet in de ActionScript-klasse String, en omgekeerd.

Tijdens het kopiëren en plakken van gegevens als reactie op een copy -, cut -, of paste -gebeurtenis in HTML-inhoud van een AIR-toepassing, moeten MIME-typen worden gebruikt in plaats van de ClipboardFormat-tekenreeksen. De volgende MIME-typen zijn geldig voor gegevens:

MIME-type

Beschrijving

Tekst

"text/plain"

URL

"text/uri-list"

Bitmap

"image/x-vnd.adobe.air.bitmap"

Bestandenlijst

"application/x-vnd.adobe.air.file-list"

Opmerking: RTF-gegevens zijn niet beschikbaar via de eigenschap clipboardData van het gebeurtenisobject dat is verzonden als reactie op een paste- gebeurtenis in HTML-inhoud.

Aangepaste gegevensindelingen

U kunt toepassingsspecifieke, aangepaste indelingen gebruiken om objecten als verwijzingen of geserialiseerde kopieën over te brengen. Referenties zijn alleen geldig binnen dezelfde toepassing. Geserialiseerde objecten kunnen tussen twee toepassingen worden overgedragen, maar kunnen alleen worden gebruikt met objecten die geldig blijven wanneer deze zijn geserialiseerd en gedeserialiseerd. Objecten kunnen doorgaans worden geserialiseerd als hun eigenschappen van een eenvoudig type zijn of als de objecten serialiseerbaar zijn.

Om een geserialiseerd object aan een Klembordobject toe te voegen, stelt u de parameter serializable in op true wanneer u de Clipboard.setData() -methode aanroept. De naam van de indeling kan die van een standaardindeling zijn, of een willekeurige tekenreeks die door uw toepassing wordt gedefinieerd.

Overdrachtsmodi

Wanneer een object naar het klembord wordt geschreven met behulp van een aangepaste gegevensindeling, kunnen de objectgegevens van een klembord worden gelezen als een referentie of als een geserialiseerde kopie van het originele object. Er zijn vier overdrachtmodussen die bepalen of objecten worden overgedragen als referenties of als geserialiseerde kopieën:

Overdrachtsmodus

Beschrijving

ClipboardTransferModes.ORIGINAL_ONLY

Er wordt alleen een verwijzing geretourneerd. Als er geen verwijzing beschikbaar is, wordt een nulwaarde geretourneerd.

ClipboardTransferModes.ORIGINAL_PREFERRED

Als er een verwijzing beschikbaar is, wordt deze geretourneerd. Als dat niet het geval is, wordt een geserialiseerde kopie geretourneerd.

ClipboardTransferModes.CLONE_ONLY

Er wordt alleen een geserialiseerde kopie geretourneerd. Als er geen geserialiseerde kopie beschikbaar is, levert dit een nulwaarde op.

ClipboardTransferModes.CLONE_PREFERRED

Als er een geserialiseerde kopie beschikbaar is, wordt deze geretourneerd. Als dat niet het geval is, wordt een verwijzing geretourneerd.

Aangepaste gegevensindelingen lezen en schrijven

Wanneer u een object naar een klembord schrijft, kunt u elke tekenreeks gebruiken die niet begint met de gereserveerde voorvoegsels air: of flash: voor de parameter format . Gebruik dezelfde tekenreeks als indeling voor het lezen van het object. De volgende voorbeelden illustreren hoe u objecten leest van en schrijft naar het klembord:

public function createClipboardObject(object:Object):Clipboard{ 
    var transfer:Clipboard = Clipboard.generalClipboard; 
    transfer.setData("object", object, true); 
} 

Om een geserialiseerd object van het klembordobject te extraheren (na verslepen of plakken gebruikt u dezelfde indelingsnaam en de overdrachtmodussen CLONE_ONLY of CLONE_PREFFERED .

var transfer:Object = clipboard.getData("object", ClipboardTransferMode.CLONE_ONLY); 

Er wordt altijd een verwijzing toegevoegd aan het klembordobject. Om de referentie uit het klembordobject te extraheren (na slepen of plakken in plaats van de geserialiseerde kopie gebruikt u de overdrachtmodussen ORIGINAL_ONLY of ORIGINAL_PREFFERED :

var transferredObject:Object =  
    clipboard.getData("object", ClipboardTransferMode.ORIGINAL_ONLY); 

Referenties zijn alleen geldig als het Klembordobject van de huidige toepassing komt. Gebruik de overdrachtmodus ORIGINAL_PREFFERED om de referentie te openen wanneer deze beschikbaar is en de geserialiseerde kloon wanneer de referentie niet beschikbaar is.

Uitgestelde rendering

Als het maken van een gegevensindeling de processor zwaar belast, kunt u uitgestelde rendering toepassen door een functie in te stellen die de gegevens op aanvraag levert. De functie wordt alleen aangeroepen als een ontvanger van de actie slepen of kopiëren gegevens opvraagt in de uitgestelde indeling.

De renderfunctie wordt met de methode setDataHandler() aan een klembordobject toegevoegd. De functie moet de gegevens in de juiste indeling retourneren. Als u bijvoorbeeld setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) hebt opgeroepen, moet de functie writeText() een tekenreeks retourneren.

Als een gegevensindeling van hetzelfde type aan een klembordobject wordt toegevoegd met de setData() -methode, krijgen die gegevens prioriteit boven de uitgestelde versie (de renderfunctie wordt niet aangeroepen). Als dezelfde klembordgegevens een tweede keer worden benaderd, wordt de renderfunctie mogelijk (opnieuw) opgeroepen.

Opmerking: In Mac OS X werkt uitgestelde rendering alleen met aangepaste gegevensindelingen. Met standaard gegevensindelingen wordt de renderfunctie onmiddellijk opgeroepen.

Tekst plakken met behulp van uitgestelde rendering

Het volgende voorbeeld illustreert hoe u uitgestelde rendering toepast.

Wanneer de gebruiker op de knop Copy klikt, wist de toepassing het systeemklembord om te zorgen dat er geen gegevens van vorige klembordbewerkingen meer aanwezig zijn. De setDataHandler() -methode stelt vervolgens de renderData() -functie in als klembordrenderer.

Wanneer de gebruiker de opdracht Plakken selecteert in het contextmenu van het doelveld, opent de toepassing het klembord en stelt de doeltekst in. Aangezien de tekstgegevensindeling op het klembord is ingesteld met een functie in plaats van een tekenreeks, roept het klembord de functie renderData() op. De functie renderData() retourneert de tekst in de brontekst, waarna deze aan de doeltekst wordt toegewezen.

Let op: als u brontekst bewerkt voordat u op de knop Paste klikt, worden de bewerkingen opgenomen in de geplakte tekst, zelfs als de bewerking plaatsvindt nadat u op de knop Copy hebt geklikt. De renderfunctie kopieert de brontekst namelijk pas nadat op de knop Paste is geklikt. (Wanneer u uitgestelde rendering in een echte toepassing gebruikt, kunt u het best de brongegevens opslaan of vergrendelen om dit probleem te voorkomen.)

Flash-voorbeeld

 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-voorbeeld

<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>