Feeds:
文章
留言

Archive for 2006 年 09 月

太空戰士(FFA) WOG 線上遊戲

Read Full Post »

每年夏天都會在新聞看到"登革熱"這個名詞,不過最近這個詞居然活生生的在我周遭發生,話說我住的新興區最近有人得了登革熱,天啊,那我如果最近看到蚊子是不是要趕快逃命…. 於是昨天晚上下班之後,房東就給了我幾個超級大的黑色塑膠袋 ,我想說是要我捲舖快逃嗎 @_@

他指著大門上得紅色字條說明天有人會來這裡噴藥,是要把自己的東西裝好或蓋好,我想說我的書這麼多要怎麼收啊,直到晚上11點多在百般無奈與擔心可能中毒的情況之下,把我的寶貝書籍從架上撤下來裝在黑色塑膠袋中,想到明天我又要進行反向操作我就頭痛 T_T。不過把房間的東西收了之後,頓時之間覺得房間變大了,只是也多了幾坨醜醜的黑色岩石。不過,東西都收好了,家具怎麼辦呢?如果藥劑殘留在家具上,如果我觸碰到又不小心(恩… 可能是很自然)又吃下肚,那我的親朋好友會不會在電視上看到我 ^O^

又床這麼大一張,我一睡上去,那我全身不也都沾染到藥劑,那碰到我的人豈不….咳…..幸運得很~ 不過想這麼多也沒用,到時候真吃下去再說,反正我的生命又不是掌握在我的手上,是掌握在我的天父手裡,也他覺得我在世的勞碌夠了,要我回天家休息也不錯。

想歸想,今天回來果然整棟房子都充滿著奇怪的味道,聞到我頭都暈了,房東他還拼死幫每個房客開門和窗戶讓味道散去,結果他差點暈倒,對於房東的犧牲真是太感動 …>_<…  房東說隔壁的也被藥嗆到暈倒,真是可怕的藥~ 對人我覺得是挺管用的…. 不過不知道對蚊子有沒有用… ㄏㄏ

此刻,我又將開始進行昨天的反向操作…. 唉真累~ AND 聽說這次噴完還要在噴一次, OH~ 暈 @_@

Read Full Post »

VC8 LNK2005

今天嘗試以 VC8 建立一個 Static Library,結果測試的時候出現了類似如下的 Linker Error

LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR80D.dll)

透過網路查找到一篇"從vc6升級到vc7的一些問題及解決方法" ,可惜我的情況與他的不同,修改後仍然不行,後來查到下面這篇討論文章

http://www.rawmaterialsoftware.com/juceforum/viewtopic.php?p=3565&sid=8ec678de95e24bcebd9b5b1381ad6dd9

與我的情況相同,也就是使用 Runtime Library 的編譯參數設定錯誤,我的測試是相關的 Library 和 Application 程式全部改用  /MTd 即可順利編譯和連結程式。

Read Full Post »

付費軟體替代方案

1. MS Office: 
   1.1 Word: OpenOffice Writer
   1.2 PowerPoint: OpenOffice Impress
   1.3 Access: OpenOffice Base
   1.4 Excel: OpenOffice Calc
   1.5 Fontpage: NVU
   1.6 Visio: Visual Paradigm Community EditionDia
2. 看圖軟體(ACDSee):IrfanView,除了支援影像之外也支援影片和音樂,影像也支援圖檔格式轉換
3. 程式碼編輯器:PSPad
4. 檔案下載:迅雷, FlashGet
5. 防毒軟體:Avura AntiVir Personal Edition Classic
6. 防火牆:Agnitum Outpost Fireware
7. PDF 工具:
   7.1 PDF 閱讀:Acrobat Reader
   7.2 PDF 製作:PDF Creator
   7.3 PDF 編輯工具:從缺
8. 瀏覽器:Firefox, KKman
9. 英文翻譯:Yahoo 線上字典StarDict
10. 遠端桌面連線:Ultra VNC
11. SSH 連線:Putty, SSH Secure Shell Client, WinSCP
12. 多媒體:
   12.1 音樂播放器:foobar2000
   12.2 影片播放器:K-Lite Codec Pack 
13. 
14. 郵件軟體:
   14.1 收件軟體:Outlook Express, GMail, Mozilla Thunderbird
   14.2 垃圾郵件過濾:SpamDog, SPAMfighter
15. 光碟:
   15.1 燒錄: Burn4free
   15.2 虛擬光碟:DAEMON
16. 系統工具:
  16.1 系統檔案清除、登錄檔清除:CClearner
17. 輸入法:
   17.1 注音輸入法:新酷音輸入法

Read Full Post »

Google Bookmark 研究心得

今天透過 firefox 的 "Firefox Google Bookmarks" 套件研究 Google 的 Bookmark 服務,我將他的整個流程分成下面幾個步驟:

1. 登入 Google,需要一組 Google 的帳號和密碼

這個步驟是取用 Google 服務的核心,主要目的是取得使用服務時的 Cookie ,取得 Cookie 的方式是透過 https://www.google.com/accounts/ServiceLoginAuth 以 POST 傳遞下面的參數

a. ltmpl=wsad
b. ltmplcache=2
c. continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3F
d. service=mail
e. rm=false
f. Email=Your Google ID
g. Passwd= Your Google Password

如果帳號和密碼正確,即可取得使用 Google 服務的 cookie。取得的 XML 格式如下:

<xml_api_reply version="1">
    <bookmarks>
        <bookmark>
            <title>PCHOME</title> 
            <url>http://www.pchome.com.tw/</url> 
            <timestamp>1159092511925524</timestamp> 
            <id>13886029170967257073</id> 
            <labels>
                <label>Homepage</label> 
                <label>^smh</label> 
            </labels>
        </bookmark>
    </bookmarks>
</xml_api_reply>

<Bookmarks> 是全部 Bookmark 的根節點,每個 <Bookmark>表示一個書籤,其中包含的元素有

a. title:標題
b. url:網址
c. timestamp:建立時間
d. id:識別碼,刪除 Bookmark 使用這個值
e. labels:所屬的標籤,可內含多個 <label> 元素。

2. 取得 Bookmark 的 XML

取得 Cookie 之後,如果要取得你的 Bookmark,必須透過 http://www.google.com/bookmarks/?output=xml 並使用下面的參數

1. sort=title : 排序方式,title 以標題排序,date 以建立該 Bookmark 日期排序
2. num=1000: 資了筆數

以 GET 方式取得 Bookmark XML

3. 新增 Bookmark

透過 http://www.google.com/bookmarks/mark 以 POST 方式使用下面參數來新增一個 Bookmark

1. bkmk=URL
2. title=標題:
3. labels=標籤:
4. annotation=這是註解:

4. 移除 Bookmark

使用 http://www.google.com/bookmarks/mark 以 POST 方式使用下面參數來移除一個 Bookmark

1. dlq=ID:Bookmark 識別碼
2. op=remove:操作識別

 

 總結:

原則上只要能夠使用 HTTP Request 取得 Cookie,剩下的事情只是在正確的 URL 並給予合適的參數進行 Web Services 操作。

Read Full Post »

最近使用 VC8 編譯一個 VC7 的 Project ,結果出現如下的 Warning

Warning 1 warning C4996: ‘strcpy’ was declared deprecated d:20060922libstunt_client_dll_win32sample.cpp 67

查了 MSDN [1]才發現VC8 對於 CRT 加入許多安全性的函數,將內文節錄如下:

  • 已加入數種函式的安全版本,這些函式會以較佳的方式處理錯誤,並強制執行較嚴格的緩衝控制,以避免發生常見的安全性缺失。新的安全版本可以利用 _s 後置字元加以識別。

  • 現有較不安全的許多函式版本已經被取代,若要停用取代警告,請定義 _CRT_SECURE_NO_DEPRECATE。如需詳細資訊,請參閱 Security-Enhanced Versions of CRT Functions。

    所以,依據上述說明,如果你要讓其他編譯器也能夠編譯該程式,可以定義_CRT_SECURE_NO_DEPRECATE 來抑制警告訊息,或是改用 VC8 新提供的 strcpy_s 函數。

    參考資料:
    [1] ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_vcedit/html/1a82576b-7f39-48f5-98f3-4679bb9df36c.htm
    [2] http://www.microsoft.com/taiwan/msdn/library/2005/Mar-2005/VisCExSecApps.htm

  • Read Full Post »

    最近太多人問我為什麼電腦會出現 svchost.exe 程式執行錯誤然後就無法上網,這是Windows XP 的系統漏洞,只要更新下面的修補檔即可修正

    http://www.microsoft.com/downloads/details.aspx?familyid=2996B9B6-03FF-4636-861A-46B3EAC7A305&displaylang=zh-tw

    Read Full Post »

    函數

    函數用來封裝特定的工作和重複使用程式碼。依據官方文件描述 AS3.0支援兩種函數:method 和 function closure。這兩種函數依據被定義的所在位置而有不同名稱。假如你將函數定義在類別中或附加在物件實體上稱之為 method。除此之外,其他方式所定義的都稱之為 function closure。雖然官方文件說了一堆,可是我覺得這些名詞不是很重要@_@…

    定義自己的函數

    函數定義方式有兩種第一種稱之為 function statement 也就是一般常見的函數定義方式,如下:

    function max(a:int, int b){
       // your algorithm
    }
    max(1, 2);

    第二種稱之為寫法稱之為 function expression,如下:

    var max:Function = function(a:int, b:int){
      // your algorithm
    };

    max(1, 2);

    基本上我覺得兩者沒有什麼太大的差別,只是 var max:Function 的這種 Function Object 寫法有點類似 C# 中的 delegate 概念,可將某個功能委託給某個函數物件處理。在架構系統上是相當方便的一種寫法。下面是一個說明此概念的範例,將排序的演算法委託給客戶端應用程式來決定: 

    // CFOTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CFOTest extends Sprite{		
    		public function CFOTest(){
    			var o:CMySort = new CMySort();			
    
    			var descSort:Function = function(a:int, b:int):Boolean{
    				return a<b;
    			};
    
    			var ascSort:Function = function(a:int, b:int):Boolean{
    				return a>b;
    			};
    
    			trace('Init: ' + o.Data );
    
    			o.sort(descSort);
    			trace("After DESC sort: " + o.Data );
    			
    			o.sort( ascSort );
    			trace( 'After ASC sort: ' + o.Data );
     		}
    
    
    	}	
    }
    
    // CMySort.as
    package{
    	public class CMySort{
    		private var data:Array;
    		public function CMySort(){
    			data = [9, 3, 4, 5, 77, 10, 1, 4];
    		}
    
    		public function sort(sortMethod:Function):void{
    			var tmp:int;
    			for(var i:int = 0; i<data.length; ++i){
    				for(var j:int = i+1; j<data.length; ++j){
    					if (sortMethod(data[i], data[j])){
    						tmp = data[i];
    						data[i] = data[j];
    						data[j] = tmp;
    					}
    				}
    			}
    		}
    		
    		public function get Data():Array{
    			return data;
    		}		
    	}
    }

    執行結果: 

     

    巢狀函數(Nest Function)

     巢狀函數的意思是函數中又定義了函數,下面實作一個 getInfo() 函數以巢狀方式寫法取得資訊:

    // CNestFunctionTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CNestFunctionTest extends Sprite{		
    		public function CNestFunctionTest(){
    			trace( getInfo() );	// CNestFunctionTest v1.0
     		}
    	
    		public function getInfo():String{
    			function productName():String{
    				return 'CNestFunctionTest';
    			}
    
    			function productVersion():String{
    				return '1.0';
    			}
    
    			return productName() + ' v' + productVersion();
    		}
    	}	
    }
    
    

    函數的參數傳遞方式

    雖然官方文件說明 primitive 將參數以傳值方式傳遞,而complex 將參數以傳址方式傳遞。但是我的測試結果卻令人 confuse,下面是一個測試傳址/傳值的常見 swap 範例:

    // CNestFunctionTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CSwapTest extends Sprite{		
    		public function CSwapTest(){
    			var o1:Object = {Name: 'Arick'};
    			var o2:Object = {Name: 'Mavis'};
    			trace( 'o1: ' + o1.Name + ', o2: ' + o2.Name);
    
    			swapObject(o1, o2);
    			trace( '[after swapObject] o1: ' + o1.Name + ', o2: ' + o2.Name);			
    
    			swapObjectMember(o1, o2);
    			trace( '[after swapObjectMember] o1: ' + o1.Name + ', o2: ' + o2.Name);
    
    			var v1:int = 100;
    			var v2:int = 200;
    			trace( 'v1: ' + v1 + ', v2: ' + v2);
    			swapValue(v1, v2);
    			trace( '[after swapValue] v1: ' + v1 + ', v2: ' + v2);
    
    
    			var s1:String = 'Arick';
    			var s2:String = 'Mavis';
    			trace( 's1: ' + s1 + ', s2: ' + s2);
    			swapString(s1, s2);
    			trace( '[after swapString] s1: ' + s1 + ', s2: ' + s2);
     		}
    
    		public function swapString(s1:String, s2:String):void{
    			var tmp:String = s1;
    			s1 = s2;
    			s2 = tmp;
    			trace( '[swapString] s1: ' + s1 + ', s2: ' + s2);
    		}
    
    		public function swapObject(o1:Object, o2:Object):void{
    			var tmp:Object = o1;
    			o1 = o2;
    			o2 = tmp;
    			trace( '[swapObject] o1: ' + o1.Name + ', o2: ' + o2.Name);
    		}
    
    		public function swapObjectMember(o1:Object, o2:Object):void{
    			var tmp:String = o1.Name;
    			o1.Name = o2.Name;
    			o2.Name = tmp;			
    			trace( '[swapObjectMember] o1: ' + o1.Name + ', o2: ' + o2.Name);
    		}
    
    		public function swapValue(v1:int, v2:int):void{
    			var tmp:int = v1;
    			v1 = v2;
    			v2 = tmp;
    			trace( '[swapValue] v1: ' + v1 + ', v2: ' + v2);
    		}
    	}	
    }
    

    執行結果:

    我檢查了程式並沒有錯誤,可是執行結果不知道你是不是也很困惑,雖然文件上說他的 complex 是以傳址方式傳遞,但是 swapObject 執行結束後 呼叫端的 o1 與 o2 並沒有交換,這和其他語言(如:C/C++)預期結果不同,可是 swapObjectMember 的執行結果卻又使呼叫端的變數產生變化。所以,我想 AS3.0 無論是 primitive 或 complex 都是將呼叫端的值,以副本方式傳遞給函數。只是 primitive 是傳遞值的副本,而 complex 是傳遞記憶體位址的副本,如果是這樣說的話,兩個記憶體副本在函數中交換,並不會影響呼叫端的 complex 值,但是,因為他擁有呼叫端 complex 值的記憶體位址,所以函數內部的修改會影響呼叫端的值。

    參數預設值

    由於函數部份參數可能大部分都一樣,此時可以給這些參數預設值,方便呼叫端的使用,這是個相當便利的設計,部份的語言(如:PHP, VB)也支援這個功能,下面的範例即可瞭解參數預設值的寫法:

    // CDefaultParamTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CDefaultParamTest extends Sprite{		
    		public function CDefaultParamTest(){
    			trace( func(1) );		// 501
    			trace( func(1, 2) );	// 303
    			trace( func(1, 2, 3) );	// 6
     		}
    
    		private function func(a:int, b:int = 200, c:int = 300):int{
    			return a+b+c;
    		}
    	}	
    }
    

    預設值的寫法如上述範例所示,只需要在參數宣告後面直接使用 = 後接其值即可。使用預設值寫法只有一點需要注意,亦即某個參數指定預設值,則其後的參數也必須指定預設值,如下範例就會出現編譯錯誤:

    // CDefaultParamTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CDefaultParamTest extends Sprite{		
    		public function CDefaultParamTest(){
    			trace( func(1) );		// 501
    			trace( func(1, 2) );	// 303
    			trace( func(1, 2, 3) );	// 6
     		}
                      // Error: Required parameters are not permitted after optional parameters.
    		private function func(a:int, b:int = 200, c:int):int{ 
    			return a+b+c;
    		}
    	}	
    }

    arguments 物件

    arguments 物件用來表示傳遞給函數的參數資訊。arguments 本身是一個陣列用來存放每一個傳遞給函數的參數,arguments.length 表示參數個數,arguments.callee 表示函數本身。下面是使用 arguments 進行間單的加法運算範例:

    // CArgumentsTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CArgumentsTest extends Sprite{		
    		public function CArgumentsTest(){
    
    			var func:Function = function ():int{
    				var result:int = 0;
    				for(var i:int = 0; i<arguments.length; ++i){
    					result += arguments[i];
    				}
    
    				return result;
    			};
    
    			trace( func(1) );		// 1
    			trace( func(1, 2) );	// 3
    			trace( func(1, 2, 3) );	// 6
     		}
    
    	}	
    }
    

    這個方法在 class method 中是無效且會發生編譯錯誤,如下範例:

    // CArgumentsTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CArgumentsTest extends Sprite{		
    	  public function CArgumentsTest(){
    		trace( func(1) );		//  Error: Incorrect number of arguments.  Expected no more than 0.
    		trace( func(1, 2) );	//  Error: Incorrect number of arguments.  Expected no more than 0.
    		trace( func(1, 2, 3) );	//  Error: Incorrect number of arguments.  Expected no more than 0.
     	  }
    
    	  private function func():int{
    		var result:int = 0;
    		for(var i:int = 0; i<arguments.length; ++i){
    			result += arguments[i];
    		}
    		return result;
      	  }
    	}	
    }

     

     
    下面使用 Factorial 為範例說明 arguments.callee 的用法:

    // CArgumentsTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CArgumentsTest extends Sprite{		
    		public function CArgumentsTest(){
    			var factorial:Function = function (x:uint) {
    				if(x == 0) {
    					return 1;
    				} else {
    					return (x * arguments.callee(x - 1));
    				}
    			}
    			trace(factorial(5)); // output: 120
     		}
    
    
    	}	
    }
    注意:如果你使用 ... 來修飾參數則會使 arguments 物件失效。而且如果你某個參數名稱取名為 arguments 也會使 arguments 物件無效。
    

    … 函數參數修飾字

    … 是 AS3 新的語法,他允許你指定任意數量任意型別的參數,經由 … 修飾的參數,他具有類似 arguments 物件的功能,只是不具備 callee 方法。如下 func() 和 mix() 的測試。

    // CArgumentsTest3.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CArgumentsTest3 extends Sprite{		
    		public function CArgumentsTest3(){
    
    			var func:Function = function (a:int, ...params):int{
    				var result:int = 0;
    				for(var i:int = 0; i<params.length; ++i){
    					result += a * params[i];
    				}
    
    				return result;
    			};
    
    			var mix:Function = function(a:int, ...params):String{
    				var result:Array = [ a.toString() ];				
    				for (var i:int; i<params.length; ++i){
    					result.push( params[i].toString() );
    				}
    
    				return result.join();
    			};
    
    			trace( func(9) );		// 0
    			trace( func(9, 2) );	// 18
    			trace( func(9, 2, 3) );	// 45		
    			trace( mix(9, 'Arick', 3.99, 789, true) ); // 9,Arick,3.99,789,true
     		}
    	}	
    }
    

    Read Full Post »

    利用 PHP 取得網路時間

    <?php
    /**
     * 取得網路恔正時間
     *
     **/
    $server = 'time.nist.gov';
    $port	= 13;
    
    $fp = fsockopen($server, $port, $errno, $errstr, 30);
    if (!$fp) {
       echo "$errstr ($errno)
    n"; } else { while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ?>

    Read Full Post »

     

    註解

    AS3.0 支援兩種註解,這兩種註解和 C++/Java  一樣,一個是用於單行註解的 // 和多行註解的 /* */,下面是一個簡單的註解範例

    var x:Object = new Object();  // 這是註解

    var i:int = 100; /* 這也是註解 */

    常數定義

    AS3.0 支援常數定義,常數定義在原來變數宣告的 var 以 const 修飾字取代即可。表示這個變數定義之後不能在變更內容值。常數定義的值只能指定一次,雖然線上手冊說有兩個地方可以賦予值:變數宣告時和類別建構式。可是我測試建構式中進行初始化會出現錯誤(還沒找到原因);

    // CConstTest.as 
    package {
    	import flash.display.Sprite; 	
    
    	public class CConstTest extends Sprite{		
    		public function CConstTest(){
    			var o:CConst = new CConst();
    			trace( o.AUTHOR );  // Arick
    			//trace( o.VERSION ); //
     		}
    	}	
    }
    
    // CConst.as
    package {
    	public class CConst{
    	  public const AUTHOR:String = "Arick";
    	  // public const VERSION:int; // 
    
    	  public function CConst(){
    		//VERSION = 10;		// Error: 只有初始設定式才能指定常數變數。	
    	  }
    	}
    } 

    條件判斷

    AS3 支援的條件判斷語法有下面 3 種

    1. if … else …
    2. if … else if …
    3. switch

    由於和大部分的語言沒有什麼不同,以下面的範例來看一下他的用法即可理解。

    // CSyntaxTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CSyntaxTest extends Sprite{		
    		public function CSyntaxTest(){
    			var o:CSyntax = new CSyntax();
    			trace( o.min(99, 8) );  // 8
    
    			trace( o.Sign(99) );  // 1
    			trace( o.Sign(0) );   // 0
    			trace( o.Sign(-7) );  // -1
    
    			trace( o.ChangeUser( 0 ) ); // Arick
    			trace( o.ChangeUser( 1 ) ); // Mavis 
    			trace( o.ChangeUser( 2 ) ); // James
    			trace( o.ChangeUser( 3 ) ); // Unknown
     		}
    	}	
    }
    
    // CSyntax.as
    package {
    	public class CSyntax{		
    		public function CSyntax(){
    
     		}
    
    		/**
    		 * if ... else ... 語法
    		 *
    		 * 取得兩數的最小值
    		 **/
    		public function min(a:int, b:int):int{
    			if (a>b){
    				return b;
    			}else{
    				return a;
    			}
    		}
    
    		/**
    		 * if ... else if ... 語法
    		 *
    		 * 傳入一個數值判斷正負數, 
    		 *  = 1   正
    		 *  = -1  負
    		 *  = 0   0
    		 **/
    		public function Sign(i:int):int{
    			if ( i == 0){
    				return 0;
    			} else if ( i < 0 ){
    				return -1
    			} else {
    				return 1;
    			}
    		}
    
    		/**
    		 * 使用 swtich 建立一個 int-String 名稱對照表
    		 *
    		 **/
    		public function ChangeUser(i:int):String{
    			var User:String;
    
    			switch( i ){
    			case 0:	
    				User = 'Arick';	
    				break;
    			case 1:
    				User = 'Mavis';
    				break;
    			case 2:
    				User = 'James';
    				break;
    			default:
    				User = 'Unknown';
    				break;
    			}
    
    			return User;
    		}
    	}
    }
    

    迴圈

    AS3 支援的迴圈語法共下面五種,前三種在一般語言中很常見,第4種在 Javascript 種很常用,而第5種是我第一次看過的語法。

    1. for
    2. while
    3. do … while
    4. for … in
    5. for each … in

    我們用個簡單的九九乘法表來示範前三種迴圈語法

     範例(九九乘法表):

    // CLoopTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CLoopTest extends Sprite{		
    		public function CLoopTest(){
    			//var o:CLoop = new CLoop();
    			CLoop.forSyntax();
    			CLoop.whileSyntax();
    			CLoop.doSyntax();
     		}
    	}	
    }
    
    // CLoop.as
    package {
    	public class CLoop{		
    		public function CLoop(){
    
     		}
    
    		/**
    		 * for 語法
    		 *
    		 **/
    		public static function forSyntax():void{
    			trace('== for ==');
    			var result:String = '';
    			for(var i:int = 1; i <= 9; ++i){
    			  for(var j:int = 1; j<= 9; ++j){
    				 result += String(i*j) + "t";
    			  }
    			  result += "n";
    			}
    			trace(result);
    		}
    
    		/**
    		 * while 語法
    		 *
    		 **/
    		public static function whileSyntax():void{
    			trace('== while  ==');
    			var result:String = '';
    			var i:int = 1;
    			var j:int = 1;
    			while(i<=9){
    
    				j = 1;
    				while( j <= 9){
    					result += String(i*j) + "t";
    					++j;
    				}
    				result += "n";
    				++i;
    			}
    			trace(result);
    		}
    
    		/**
    		 * do ... while 語法
    		 *
    		 **/
    		public static function doSyntax():void{
    			trace('== do ... while ==');
    			var result:String = '';
    			var i:int = 1;
    			var j:int = 1;
    			do {
    				j = 1;
    				while( j <= 9){
    					result += String(i*j) + "t";
    					++j;
    				}
    				result += "n";
    				++i;
    			}while(i<=9);
    
    			trace(result);
    		}
    	}	
    }
    

    執行結果:

    以下來示範 for … in 和 for each … in 寫法 

    // CLoopTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CLoopTest extends Sprite{		
    		public function CLoopTest(){
    			CLoop.forInSyntax();
    			CLoop.forEachSyntax();
     		}
    	}	
    }
    
    // CLoop.as
    package {
    	public class CLoop{		
    		public static function forInSyntax():void{			
    			var Person:Object = {
    				  Name: 'Arick'
    				, Sex: 1				
    			};
    
    			for (var key:String in Person) {
    				trace (key + " : " + Person[key]);
    			}
    			/* 輸出結果
    			 * Sex : 1
    			 * Name : Arick
    			 */
    
    			var NameSet:Array = [
    				  'Arick'
    				, 'Mavis'
    				, 'Joss'
    				, 'Jack'
    			];
    
    			for (var idx:String in NameSet) {
    				trace (idx + " : " + NameSet[idx]);
    			}
    
    			/* 輸出結果
    				0 : Arick
    				1 : Mavis
    				2 : Joss
    				3 : Jack
    			 */
    		}
    
    		public static function forEachSyntax():void{
    			var Person:Object = {
    				  Name: 'Arick'
    				, Sex: 1				
    			};
    
    			for each(var value:* in Person) {
    				trace (value);
    			}
    			/* 輸出結果
    			 * 1
    			 * Arick
    			 */
    
    			var NameSet:Array = [
    				  'Arick'
    				, 'Mavis'
    				, 'Joss'
    				, 'Jack'
    			];
    
    			for (var Name:String in NameSet) {
    				trace (Name);
    			}
    			/* 輸出結果
    				Arick
    				Mavis
    				Joss
    				Jack
    			 */
    		}
    	}	
    }
     

    for…in 用來迭代陣列和物件的成員,上述的 forInSyntax() 函數即示範這個用途,雖然說他可以迭代物件的成員,可是不能用來迭代 class 定義的物件。但是可以用來迭代 dynamic 定義的 Class。如下範例: 

    // CIteratorTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CIteratorTest extends Sprite{		
    		public function CIteratorTest(){
    			var elem:String;
    			var nc:NormalClass = new NormalClass();
    			for(elem in nc){
    				trace( elem + '/' + nc[elem]);
    			}
    
    			var dc:DynamicClass = new DynamicClass();
    			dc.Name = 'DynamicClass';
    			dc.getName = function():String{
    				return this.Name;
    			};
    			for(elem in dc){
    				trace( elem + '/' + dc[elem]);
    			}
     		}
    	}	
    }
    
    // NormalClass.as
    package {
    	public class NormalClass{		
    		public var Name:String = 'NormalClass';
    
    		public function NormalClass(){
     		
    		}
    
    		public function getName():String{
    			return Name;
    		}
    	}	
    }
    
    // DynamicClass.as
    package {
    	public dynamic class DynamicClass{		
    		public function DynamicClass(){
     		
    		}
    	}	
    }
    

    執行結果:
     
    如果你迭代陣列或物件時不在意索引值,可以使用 for each … in 語法來取代 for … in ,改寫上述範例如下:

    // CIteratorTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CIteratorTest extends Sprite{		
    		public function CIteratorTest(){
    			forEachIn();
     		}
    
    		private function forEachIn():void{
    			var elem:String;
    			var nc:NormalClass = new NormalClass();
    			for each(elem in nc){
    				trace( elem);
    			}
    
    			var dc:DynamicClass = new DynamicClass();
    			dc.Name = 'DynamicClass';
    			dc.getName = function():String{
    				return this.Name;
    			};
    			for each(elem in dc){
    				trace( elem);
    			}			
    		}
    	}	
    }
    
    

     
    執行結果:
     
    你如果有仔細看的話會發現兩個執行結果的順序會不太一樣,依據線上手冊說明他的順序是亂數(random)的。for each … in 除了剛剛所說得差異之外,他的主要用途還是在處理 XML,他可以用來迭代 XML 和 XMLList 物件,如下:

    // CIteratorTest.as
    package {
    	import flash.display.Sprite; 	
    
    	public class CIteratorTest extends Sprite{		
    		public function CIteratorTest(){
    			xmlTest();
     		}
    
    		private function xmlTest():void{
    			var myXML:XML = <users>
    					<fname>Jane</fname>
    					<fname>Susan</fname>
    					<fname>John</fname>
    				       </users>;
    			for each (var item in myXML.fname) {
    				trace(item);
    			}
    			/* 輸出結果
    				Jane
    				Susan
    				John
    			*/
    		}
    	}	
    }
    
    

    XML 處理以後談到時再詳細說明。

    Read Full Post »

    Older Posts »