Feeds:
文章
留言

Archive for 一月 18th, 2007

Flex 超連結(Hyperlink)元件

 Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.19

本文擴展 Text 控制項成 Hyperlink 控制項,外觀的呈現透過 Text 控制項的 htmlText 來顯示超連結,當使用者的游標移動到超連結上面時,透過文字代換 htmlText 來顯示不同的顏色,最後,如果想要點選超連結之後以瀏覽器開啟連結,可以使用 navigateToUrl() 來瀏覽指定的 URL。下面是控制項實作的原始碼:

Hyperlink_test.mxml
<?xml version="1.0" encoding="utf-8"?>
<!– This app shows the usage of the Hyperlink.as component and HyperlinkEvent.as custom event.
  Both of those files must either reside in the same folder as this file, or must be in
  a source-path folder. –>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml&quot;
    xmlns="*" layout="vertical" horizontalAlign="left">

<mx:Script><![CDATA[
  import Hyperlink;
  import HyperlinkEvent;
 
  /** run by bubbling custom event from Hyperlink component */
  private function onLinkClick(oEvent:HyperlinkEvent):void
  {
    txtDataUrl.text = oEvent.data.toString();
  }//init
 
]]></mx:Script>
  <mx:Text text="This app shows the usage of the Hyperlink component and HyperlinkEvent custom event." width="300" fontSize="12" />
  <mx:Text text="This repeater  sets launchUrl=true, so clicking on a Hyperlink launches the specified url in a separate browser." width="200" />
  <mx:Repeater id="rpUrl" dataProvider="{xmlData.item}">
    <Hyperlink launchUrl="true" colorNormal="#0000FF" colorHover="#00FF00"
        linkText="{rpUrl.currentItem.@linkText}"
        dataUrl="{rpUrl.currentItem.@dataUrl}" />
  </mx:Repeater>

  <mx:Text text="This repeater sets launchUrl=false, so the Hyperlink component emits a bubbling custom event, which is handled by a listener in the main app. It also uses different text colors." width="200" />
  <mx:Repeater id="rpEvent" dataProvider="{xmlData.item}">
    <Hyperlink launchUrl="false" onClick="onLinkClick(event)"
        colorNormal="#0FF0FF" colorHover="#FAAAFF"
        linkText="{rpEvent.currentItem.@linkText}"
        dataUrl="{rpEvent.currentItem.@dataUrl}" />
  </mx:Repeater>
  <mx:Label text="You clicked:"  />
  <mx:Text id="txtDataUrl" fontSize="16" color="white" />
  
  <!– Sample data –>
  <mx:XML id="xmlData" xmlns="">
    <data>
      <item linkText="Google" dataUrl="http://www.google.com&quot; />
      <item linkText="NPR" dataUrl="http://www.npr.org&quot; />
      <item linkText="MSN" dataUrl="http://www.msn.com&quot; />
      <item linkText="Yahoo" dataUrl="http://www.yahoo.com&quot; />          
    </data>
  </mx:XML>
</mx:Application>

Hyperlink.as
/**
 * Hyperlink
 * This control displays a Text control that looks like an HTML hyperlink.
 * See public var / property declarations
 *
 *
 */
package
{
 import mx.controls.Text;
 import flash.events.Event;
  import flash.events.TextEvent;
  import HyperlinkEvent;
  import flash.net.*;
 
 [Event(name="onClick", type="HyperlinkEvent")]
 public class Hyperlink extends Text
 {
  public var colorNormal:String = "#0000FF";   //Link text color.
  public var colorHover:String = "#00FF00";    //Link hover text color.
  public var dataUrl:String = "";         //Any string if launchUrl="false" and using event, must be valid url if launchUrl="true";
  public var linkText:String = "";        //Displayed Hyperlink text
  public var launchUrl:Boolean = true;      //controls whether a click on a link launches the dataUrl, or emits a DLink event.
 
  /**
   * 控制像建立完成時的初始化動作
   */  
  private function onCreationComplete(oEvent:Event):void
  {
   if (linkText && linkText.length > 0)  {              //only do this if we have link text
    setHtmlText();
   }
   else  {
     htmlText = "!!!!!!Property ‘linkText’ is REQUIRED!!!!!!";
   }
  }//onCreationComplete
 
  /**
   * 使用 HTML 標籤顯示超連結和提示文字
   */
  private function setHtmlText():void
  {
   var sHTML:String = ‘<font color="’ + colorNormal + ‘">’;
   sHTML += ‘<a href="event:myEvent" ><u>’; 
   sHTML += linkText;
   sHTML += ‘</u></a’;
   sHTML += ‘</font>’;
   this.htmlText = sHTML;
   this.toolTip = "Click to show " + linkText;
  }//setHtmlText
 
   
  /**
   *  當游標橫越超連結時,切換文字顏色
   */
  private function hover(oEvent:Event):void{
    if (oEvent.type == ‘mouseOver’)  {
      this.htmlText = String(this.htmlText).replace(colorNormal, colorHover);
    } else  {
      this.htmlText = String(this.htmlText).replace(colorHover, colorNormal);
    }
 
  }//hover 
 
  /**
   * 當點選 URL 時,如果要開啟新視窗,則使用 navigateToURL(),否則將 Click 訊息往上傳遞
   */  
  private function onLinkClick(oEvent:TextEvent):void
  {
     if (launchUrl)  {
        var ur:URLRequest = new URLRequest(dataUrl);
        navigateToURL(ur,"_blank");
     } else  {
        dispatchEvent(new HyperlinkEvent("onClick",dataUrl,true,true));
     }
  
  }//onLinkClick  
 
  /**
   * Constructor
   */   
  public function Hyperlink(xmlData:XML=null)
  {
   this.addEventListener("mouseOver",hover);
   this.addEventListener("mouseOut",hover);
   this.addEventListener("creationComplete",onCreationComplete);
   this.addEventListener("link", onLinkClick);
   super();
  }//Constructor
 
 }//class Hyperlink
}//package
HyperlinkEvent.as
/**
 * This simple custom event works with the Hyperlink component.
 * Actually, it could be easily adapted for other uses as well.
 */
package
{
 import flash.events.Event;

 public class HyperlinkEvent extends Event
 {
  public var data:Object;
 
  /** Constructor */
  public function HyperlinkEvent(type:String, data:Object, bubbles:Boolean=false, cancelable:Boolean=false)
  {
   super(type, bubbles, cancelable);
   this.data = data;
  }//Constructor

    /** Override the inherited clone() method. */
    override public function clone():Event {
      return new HyperlinkEvent(type, data, this.bubbles, this.cancelable);
    }//clone 
 
 }// class HyperlinkEvent
}//package

執行結果:

參考資料
[1] http://www.cflex.net/showFileDetails.cfm?ObjectID=595&ChannelID=1

Read Full Post »

Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.19

最近開發程式需要快速配置一個大型檔案,之前找到 File.WriteAllBytes("largfile.dat", new Byte[???] ) 方法建立,可是這個方法會受限於 new Byte[] 所能配置的最大記憶體,所以,在 MSDN 論壇我張貼了兩篇文章[2][3]看有沒有人遇到類似的問題,雖然 tihs 建議可透過迴圈的方式來分批寫入資料,但是這個方法還是太慢無法滿足我的需要。後來我在 Code Project 找到一篇"Make-A-File – File Creation Utility "[1],發現他可以快速建立高達 1EB 的檔案大小,訝異之餘研究了一下 Source Code,發現他利用 CreateFile() 建立檔案之後,接著透過 SetFilePointer() 設定檔案的長度,最後透過 SetEndOfFile() 關閉檔案即完成。我發現他的關鍵在於 SetFilePointer() 函數,找尋 FileStream 的相關文件後發現 SetLength() 方法,於是快速建立 1GB 大型檔案的方式就是下面簡單的兩行指令:

using (FileStream fs = new FileStream("e:/large.dat", FileMode.Create)) {
      fs.SetLength(1024000000); // 最大可配置 long.MaxValue 大小
}



補充:(感謝璉璉、tihs 在 MSDN Forum 的回覆[2][3])
1. 陣列索引最大值為 2,147,483,647 – 1(亦即在記憶體充足的情況下,可以配置高達 2,147,483,647 (2GB) 的陣列 )
2. 早期 Windows 雖然號稱單一陣列可以到 2 GB ,但是實際上綁在 oleaut32.dll 上只能到 256 MB,亦即變成 8 個陣列到 2 GB,只能透過 kernel32.dll 來達到單一區塊 2 GB 。.Net framework 不使用 oleaut32.dll
3. 每個陣列之維度長度都受限於 Integer 資料型別的最大值,也就是 (2 ^ 31) – 1。然而,陣列之總大小也同時受限於系統可用的記憶體。若您試圖對總大小超過可用的 RAM 之陣列進行初始化,Common Language Runtime 將擲回 OutOfMemoryException 例外狀況。[5]

參考資料:
[1] http://www.codeproject.com/tools/make-a-file.asp

Read Full Post »

Read Full Post »

今天同事傳了一個"磨蹭的快感?-阿魯巴的男子氣概建構"論文超連結給我,哇~ 真不塊是台大的學生,連這個也能洋洋灑灑寫了 1xx 個字的論文,從摘要和目錄來看,作者似乎有相當考究過,可惜無緣下載本文來欣賞,希望以後有機會一睹這篇論文的全貌。不過,為什麼工學院的主題是這個呢?社會民情風俗觀察嗎?

Read Full Post »