Archiv ‘ActionScript’ kategorie

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation

Sobota, Květen 9th, 2009

Po delší době strávené na stavbě jsem se dostal zase k práci a hned mě u jednoho projektu přivítala tahle klasická hláška, která se objevuje v okamžiku, kdy načítáme data z jiné domény a není to povoleno přes crossdomain.xml.  Jaké bylo ale moje překvapení, když se hláška objevila při načítání dat ze stejné úrovně - domény. Žádný háček v podobě subdomény nebo nadřazeného adresáře zde nebyl.

Situace byla ale zajímavější, než se zdálo. Externímy daty byl PHP soubor, jehož cesta byla brána relativně vůči SWF souboru aplikace, tento PHP soubor byl umístěn v podadresáři. Načítání fungovalo pouze v IE, Mozilla hlásila uvedenou chybu. Po zpěšném zapátrání v Googlu jsem nic rozumného nenašel, nicméně jsem při testování zkusil uvést úplnou cestu k PHP souboru. A ejhle, zafungovalo to! Takže místo relativní cesty pomohlo uvedení absolutní cesty. Snad se časem dopátrám důvodu, proč se tak stalo.

BatchLoader pro textové soubory

Pátek, Duben 10th, 2009

Poměrně často se setkávám s nutností stahování většího množství souborů najednou, jehož řešením je postupné načítání souborů jeden po druhém. Bylo by tedy určitě dobré mít nějakou třídu, která se o načtení souborů postará například v této podobě:

//instance objektu
var bLoader:BatchLoader = new BatchLoader(pole_souboru);
//načtení souborů z předaného pole
bLoader.load();
//doplnění listenerů
bLoader.addEventListener(BatchEvent.ALL_COMPLETE,loadCompl);
bLoader.addEventListener(BatchEvent.IO_ERROR,err);
function loadCompl(evt:Event):void{
  var pole_nactenych:Array = bLoader.getLoadedArray();
}

Jednoduchou třídu, která toto splňuje nalezneme v detailu článku.

(more...)

Včerejší a zítřejší den

Úterý, Duben 7th, 2009

Po delší době jsem opět použil při práci s kalendářem malou třídu, která vrací předchozí a následující den:

package
{
public class TimeUtil
{
private static var oneDayMs:uint = (1000*60*60*24);
public static function yesterday():Date{
var today:Date = new Date();
var yest:Date = new Date();
yest.setTime(today.getTime()-oneDayMs);
return yest;
}
public static function tomorrow():Date{
var today:Date = new Date();
var tom:Date = new Date();
tom.setTime(today.getTime()+oneDayMs);
return tom;
}
}
}

Použití je snadné:

var vcera:Date = TimeUtil.yesterday();

Ve spojení s komponentou DateChooser pak můžeme omezit výběr starších dnů:

var yest:Date = TimeUtil.yesterday();
calendarComp.disabledRanges = [{rangeEnd:yest}];

Otáčení mimo střed objektu

Neděle, Březen 15th, 2009

Třída MatrixTransformer je poměrně užitečná, pokud potřebujeme například manipulovat s objekty (měnit velikost, zkosení, rotaci apod.)  přes Matrix třídu. Jednou z výborných metod je pak rotateAroundExternalPoint, která nám umožňuje rotaci objektu podle libovolného bodu na scéně. Běžná rotace totiž probíhá přesně podle souřadnicového středu objektu, což může být občas prolém. Následující skript ukazuje využití této metody (po kliknutí se objekt bude otáčet podle nového bodu):

import fl.motion.MatrixTransformer;
var xPoint:int = 200;
var yPoint:int = 200;
var angle:int = 5;
function changeTrasnfPoint(evt:Event):void {
    xPoint = this.stage.mouseX;
    yPoint = this.stage.mouseY;
}
function rotate(evt:Event):void {
    var matrix:Matrix = obj_mc.transform.matrix;
    MatrixTransformer.rotateAroundExternalPoint(matrix,
xPoint,yPoint,angle);
    obj_mc.transform.matrix = matrix;
}
this.addEventListener( Event.ENTER_FRAME,rotate);
this.stage.addEventListener(MouseEvent.MOUSE_DOWN,
changeTrasnfPoint);

Hromadná oprava XML

Pondělí, Březen 9th, 2009

Při práci s XML daty v ActionScriptu 3.0 se moc nezapotíme (vyjma opomenutí data binding, ale o tom jindy). Pokud porovnám práci (spíše trápení) s XMLkem v AS2, tak v AS3 je to doslova hraní.

V případě, že do vstupních XML dat aplikace může zasáhnout lidský faktor, může se stát, že některé hodnoty nedostaneme v požadované formě, jak očekáváme.  Klasickým příkladem může být zadávání nepovolených znaků, textu místo čísel a někdy vadí i nesprávné kombinování velkých a malých písmen.

Pokud potřebujeme překontrolovat vstupní data, jednou z možností je odfiltrování konkrétního elementu následujícím způsobem:

var pomList:XMLList = dataXML..xmlElement;

Do XMLList objektu se vloží pouze elementy xmlElement ze zdrojového xml objektu dataXML. Nezáleží, kde jsou umístěné, pomocí dvoutečkové syntaxe získáme zpět opravdu všechny, které se v XML datech vyskytují.

V dalším kroku už stačí projít prvky XMLListu a provést s nimi požadovanou kontrolu. Protože jsou do prvků XMLListu vloženy přímé reference na zdrojové XML elementy, změna se projeví ve zdrojovém XML objektu. Zmíněné zvětšení vstupních dat na velká písmena pak může vypadat takto:

var pomList:XMLList = dataXML..xmlElement;
for (var s:uint=0; s<pomList.length(); s++) {
if (String(pomList[s]).length>0) {
pomList[s] = String(pomList[s]).toUpperCase();
}
}