忍者ブログ
 >admin |  >entry |  yukku++Blog 
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

cookieのようにローカルに値を保存して、次回アクセス時に読み出せるオブジェクトを扱うクラス。
SharedObject
ローカル Shared Object とは

SharedObjectのdataに動的にプロパティをセットする。
FlashPlayer終了時にデータが保存されるが、即時に書き込む時は flush() を使う。
次回の.swfアクセス時には'mySO'が読み込まれる。

var so:SharedObject = SharedObject.getLocal('mySO'); // 自動的にファイルが生成される

if(so.data.test == true){
trace('so.test:True');
so.clear(); // SharedObject.data の内容をクリアする
}else{
so.data.test = true; // dataプロパティに動的にセットする
// so.setProperty("test", true); setPropertyメソッドでもセットできる。
so.flush(); // 明示的にデータを書き込む
trace('so.test:False');
}

PR

[SWF (backgroundColor="#FFFFFF", frameRate="60", width="640", height="480")]

package 内のクラス定義直前に挿入することで、ドキュメントプロパティを設定できる。
コンパイラオプションを指定するよりカンタン(FlashDevelop頼りだからあんまりやらないけど)
他にも指定できる値があるようだけど、Flex専用だったりとあまり意識しなくてよさそう。
記述する順番は決まってない。

backgroundColor

背景色。整数指定

frameRate

フレームレート。整数指定

width

横幅。整数指定

height

高さ。整数指定


メタデータタグ
ASDoc の使用
後で見たときにも、公開するとき(あんまりないけど)にもドキュメントが整ってた方がカッコイイよね。
仕事でも使うかもしれないし、書き方くらいはチェキチェキ。
http://www.adobe.com/jp/devnet/flash/articles/ac3_performance.html
FLASH OOP for ActionScript 3.0を読んでいたら、
AVM(Actionscript Virtual Machine)上で最適化されるコードの書き方なぞがあったのでメモ。
公式にはより詳細な情報があった。
なるほどー、基本的には配列アクセス演算子は使わない方が良いね。
ただ文字列でアクセスしたい場合は使うしかない。使わないような設計もテクニックってことか?

そこで、少し面倒でもそのためのクラスを定義すると、プロパティのデータ型が指定できます。さらに、型指定により処理が最適化されるので、プロパティへのアクセスは速くなります。

確かに動的に割り当てた Object のプロパティは型指定できないからリンク先で言う弱参照になる。
よほどの数の変数でなきゃそれ専用の値格納用クラスを作ったほうがいいかも。
でも連想配列とか書きづらくなるなぁ。
Yahoo! APIで取得したXMLをXMLオブジェクトにしたのにXML演算子でアクセスしようとしても
値が存在しないとエラーになってしまった。
アクセス方法も間違ってないし、XMLもちゃんと読み込めてるのになぁと調べると
名前空間が指定されている場合はそれも考慮してアクセスする必要があるとのこと。
んで、三つの方法があるようだ。

  1. 名前空間オブジェクト経由(この方法)

  2. default xml namespace でディフォルト名前空間の書き換え

  3. 名前空間の指定(xmlns="hoge")を削除する


1.だと階層が深くなると面倒そう。子の取り出し方次第で工夫できそうだけど。
2.がアクセスが楽になるし、XMLソースに影響与えないから一番使いやすいかな。
3.は強引な手だけど、干渉さえしないなら問題無。ソースの書き換えがどうかはあるけど。
webとの連携で名前空間の処理は必須なことを学べた。
ってかこれに引っかかってぜんぜん進めなかったorz。

// --- 省略 ---
var urn:Namespace = new Namespace('urn:yahoo:jp:auc:search'); // XML中の名前空間オブジェクト作成
_xml = _y.resultSet.urn::Result.urn::Item[0].urn::Title; // 検索結果のタイトル

見ればわかるようにいちいち名前空間経由でアクセスする必要があるので冗長になりがち。

2.の方法
default xml namespace ディレクティブ

default xml namespace = new Namespace('urn:yahoo:jp:auc:search'); // XML中の名前空間オブジェクト作成
_xml = _y.resultSet.urn::Result.urn::Item[0].urn::Title; // 検索結果のタイトル

何故かサンプルのように、Namespaceオブジェクト作ってからやると変数が定義されていないって出る。
何か勘違いしてるかなぁ。とりま今回はおkとしておく。

3.の方法
Remove Annoying XML Namespaces in Flex/AS3

_xml = removeNs(_xml);
public function removeNs(_xml:XML):XML {
var _smlStr:String = _xml.toString().replace(new RegExp("(xmlns|xsi)[^\"]*\"[^\"]*\"", "gi"), "");
return new XML(_smlStr);
}

こんな感じでとにかく xmlns="hoe" とか xsi="hau" を消してしまえばよいだけ。
private に設定したプロパティに対して、外部から代入や取得を行いたい場合、

private var _foo:int = 128;
private var _bar:int = 256;

// foo の値を返すメソッド
public function getFoo():int {
return this._foo;
}

// bar の値に引数を代入するメソッド
public function setBar(_val:int):int {
this._bar = _val;
}

のように直接変数にアクセスしないでメソッド経由で行うようにするのがOOPのお作法。
JAVAなんかはこの書き方を推奨している。

as3では getter / setter キーワードが用意されている。

private var _foo:int = 128;
private var _bar:int = 256;

// foo の値を返すメソッド
public function get foo():int {
return this._foo;
}

// bar の値に引数を代入するメソッド
public function set bar(_val:int):int {
this._bar = _val;
}

function の後ろに set / get を付け加えただけです。
これで外部からは foo / bar を使って public感覚でアクセスできる。
上記が記述されているクラスhoeがあったとして、

var hoe:Hoe = new Hoe();

// get/set が無ければ private なのでアクセスできない
trace(hoe.foo); // 128

Hoe.bar = 512; // private の _bar に代入される

コレでアクセサーメソッドをpublic変数にアクセスするような方法で使える。
引数の数が決まらない(複数の引数を渡す場合がある)ような場合に可変長引数が使える。


hoge('ま', 'み', 'む', 'め', 'も');

function hoge(...args:*):void {
// argsに各値はArray型に格納される
for each(var _s:String in args){
trace(_s);
}
}


入ってくる型が甘くなるからIS演算子等でうまいことやってあげたほうがよさそう。
引数の数で挙動がわかるオーバーロード風にも出来るし。
as3ってjavaみたくはオーバーロードできないのね。ってことも今回知った。
http://developer.yahoo.co.jp/
Flexが思いのほか便利すぎるのと、趣味と実益を兼ねて色々やってみる。
最終的にはAIRでYahoo! Auction管理ソフトに仕上げることを目標に、
アプリケーションを一本作ってみる。出来るころには色々と学んでると信じて。

とりあえず手順は以下のとおり。XMLを返してくれるので指定のAPIのURLにアクセスするだけ。

  1. リクエスト用URLを構成

  2. URLLoaderでリクエスト

  3. 返ってきたXMLを格納


アプリケーションIDというのを取得する必要があるので、以下で取得してコード中に記述する。
http://e.developer.yahoo.co.jp/webservices/register_application
あとはお好きなようにXMLをいじくり倒すだけ。

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;

/**
* http://developer.yahoo.co.jp/webapi/auctions/auction/v2/search.html
*/

public class Main extends Sprite
{
private var _urlReq:URLRequest;
private var _urlLoader:URLLoader;
private var _reqUrl:String = 'http://auctions.yahooapis.jp/AuctionWebService/V2/search';
private var _appId:String = '-----'; // アプリケーションIDを取得して、ココにセットする。

private var _params:Object = {
query:'windows',// 検索文字列
type :'all', // 指定検索の種類 all, any
category:'', // カテゴリID
page:'1', // ページ番号
sort:'end', // ソート項目 end, img, bids, cids, bidorbuy
order:'a', // ソートの順番 a, d
store:'0' // 商品の出品区分 0, 1, 2
// ------省略
};

private var _xml:XML;

public function Main():void
{
// パラメータ付きリクエストURL生成
_reqUrl += '?appid=' + _appId;
for (var s:String in _params ) {
if (_params[s] == '') { continue; }
_reqUrl += '&' + s + '=' + _params[s]
}
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(ev:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
_urlReq = new URLRequest(_reqUrl);
_urlReq.method = URLRequestMethod.POST;
_urlLoader = new URLLoader(_urlReq);
_urlLoader.addEventListener(Event.COMPLETE, onLoadedXML);
}

private function onLoadedXML(ev:Event = null):void {
_xml = new XML(_urlLoader.data);
trace(_xml);
}
}
}

とりあえずXMLを吐かせるだけ。ココまでは簡単だったんだけど…。
このXMLを適当にデータグリッドにぶち込めばどうにかなるかと思ったけどうまくいかない。
ちょっと小細工が必要みたい。
HOME  | 次のページ >>  | 
[1]  [2]  [3]  [4
プロフィール
Name :
yukku
カレンダー
05 2024/06 07
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
ブログ内検索
Twitter
Ads
アクセス解析
忍者ブログ [PR]