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