2005年11月18日 星期五

Macromedia Flash 編譯器遺失 Pop Op Code Bug   [+/-]

Ticore's Blog

最近MMUG上有人發現一個奇怪的問題....

仔細研究之後,發現是Macromedia編譯的Bug
當一個AS 2.0的Class繼承MovieClip
在其成員函式內呼叫stop、play、.....等函式
又未明確指定對象this時候

Macromedia的編譯器會自動替該函式呼叫加上this
但是卻會漏失一個Op Code - POP
導致執行的時候會有一個多餘的資料殘存在Stack內
間接引起回傳值接收錯誤

用Flash 7、8編譯都會發生此錯誤
至於最新的Flex 2.0 Builder Alpha 1則沒有發現,可能是因為編譯器是用Java重新寫的
所以沒有繼承到IDE編譯器的Bug

倘若連續下兩個stop
理論上會有兩個資料殘存
接著連續作三次指定的動作
結果會發現有兩個變數都沒有得到資料

以下是Demo程式
fla frame 1 AS:
var v1;
var v2;
var v3;
var mc:Test = new Test();
v1 = v2 = v3 = mc.echo();
trace("v1 : " + v1);
trace("v2 : " + v2);
trace("v3 : " + v3);

// output:
// v1 : undefined
// v2 : undefined
// v3 : echo

Test.as Class:
//要繼承MovieClip
class Test extends MovieClip {
 public function echo():String {
  //
  // 以下函式皆會造成編譯時缺少 pop op code
  // 導致執行時 Stack 內有多餘的資料無法清除
  //
  // play();
  // stop();
  // gotoAndPlay(1);
  // gotoAndStop(1);
  // nextFrame();
  // prevFrame();
  //
  // startDrag(this);
  // stopDrag();
  //
  // unloadMovie(null);
  //
  // getURL("http://www.google.com", "_blank");
  // loadVariables("http://www.google.com", "_root");
  //
  stop();
  stop();
  return "echo";
 }
}
// Ticore's Blog - http://ticore.blogspot.com/
Read more...

2005年11月14日 星期一

Flex 2.0 AS3 使用 Remoting 的方式   [+/-]

Ticore's Blog

Flex 2.0 DataService 的部份以後可能會被獨立成一個新的產品
不少人擔心以後可能無法直接在 Flex 2.0 內使用 Remoting 之類的功能
我倒是覺得還好~

Enterprise Service 的重心主要應該是在 Server 端,不是在 Client 端
Flex 2.0 DateService 內頂多只有幾個輕量級的 Tag 標籤

真正做事的還是內建在 Flash Player 8.5 內底層 Class
就算 MM 不提供那些標籤,也會有人寫出來分享
再不然,自己用 AS 3.0 去銜接也可以

翻了一下 AS 3.0 Api
找出 AS 3.0 Remoting 的作法
與之前 AS 2.0 直接使用 NetConnection 的作法還真是像

ActionScript 2.0

/*
  Ticore's Blog
  http://ticore.blogspot.com/
*/
var nc:NetConnection = new NetConnection();
var url:String = "http://localhost:8000/gateway.aspx";
nc.onResult = function(data) {
 trace("onResult : " + data);
};
nc.onStatus = function(info) {
 trace("onStatus : " + info);
 for (var i in info) {
  trace("info[" + i + "] : " + info[i]);
 }
};
nc.connect(url);
nc.call("FlashRemoting.EchoTests.EchoClass.echoString", nc, "134");

ActionScript 3.0

/*
  Ticore's Blog
  http://ticore.blogspot.com/
*/
import flash.net.*;
var nc:NetConnection = new NetConnection();
nc.objectEncoding = ObjectEncoding.AMF0;
var url:String = "http://localhost:8000/gateway.aspx";

var onResult:Function = function(data:Object) {
 trace("onResult : " + data);
};
var onStatus:Function = function(info:Object) {
 trace("onStatus : " + info);
 for (var i:Object in info) {
  trace("info[" + i + "] : " + info[i]);
 }
};
var obj:Responder = new Responder(onResult, onStatus);
nc.connect(url);
//nc.call("FlashRemoting.EchoTests.EchoClass.echoString", obj);
nc.call("FlashRemoting.EchoTests.EchoClass.echoString", obj, "134");

PS.只是因為碰巧有人問我Remoting .NET怎麼裝,所以才順便接上去測試了

Read more...