Seven Yu @ 03/30/2008 (10:43 pm)

一个简单的 SQLite 类

Tags: , , ::

SQLData.as

PLAIN TEXT >> ACTIONSCRIPT:
  1. package org.phpz.data
  2. {
  3.     /**
  4.      * author: Seven Yu
  5.      * url: http://phpz.org/
  6.      * */
  7.     import flash.data.SQLConnection;
  8.     import flash.data.SQLStatement;
  9.     import flash.filesystem.File;
  10.     import flash.net.Responder;
  11.    
  12.     public class SQLData
  13.     {
  14.         private var dbFile:File = new File();
  15.         private var conn:SQLConnection = new SQLConnection();
  16.         private var stmt:SQLStatement = new SQLStatement();
  17.        
  18.         public function SQLData(path:String = null)
  19.         {
  20.             if (null != path)
  21.             {
  22.                 dbFile.nativePath = path;
  23.                 open(dbFile);
  24.             }
  25.         }
  26.        
  27.         //////////////////////////
  28.         // public functions
  29.         //////////////////////////
  30.        
  31.         /**
  32.          * open database from path
  33.          * */
  34.         public function openPath(path:String):Boolean
  35.         {
  36.             dbFile.nativePath = path;
  37.             return open(dbFile);
  38.         }
  39.        
  40.         /**
  41.          * open database from file
  42.          * */
  43.         public function openFile(file:File):Boolean
  44.         {
  45.             return open(file);
  46.         }
  47.        
  48.         /**
  49.          * close database connection
  50.          * */
  51.         public function close(responder:Responder = null):void
  52.         {
  53.             conn.connected && conn.close(responder);
  54.         }
  55.        
  56.         /**
  57.          * execute SELECT sql
  58.          * @return Array SQLStatement.getResult().data;
  59.          * */
  60.         public function select(sql:String, prefetch:int = -1, responder:Responder = null):Array
  61.         {
  62.             stmt.text = sql;
  63.             try
  64.             {
  65.                 stmt.execute(prefetch, responder);
  66.                 return stmt.getResult().data;
  67.             }
  68.             catch (e:Error)
  69.             {
  70.                 trace("<select>", e.message);
  71.                 trace(" - <SQL>", sql);
  72.             }
  73.             return null;
  74.         }
  75.        
  76.         /**
  77.          * 执行 INSERT UPDATE 或 CREATE 等语句
  78.          * @return int SQLStatement.getResult().rowsAffected
  79.          * */
  80.         public function update(sql:String, prefetch:int = -1, responder:Responder = null):int
  81.         {
  82.             stmt.text = sql;
  83.             try
  84.             {
  85.                 stmt.execute(prefetch, responder);
  86.                 return stmt.getResult().rowsAffected;
  87.             }
  88.             catch (e:Error)
  89.             {
  90.                 trace("<update>", e.message);
  91.                 trace(" - <SQL>", sql);
  92.             }
  93.             return -1;
  94.         }
  95.        
  96.         ///////////////////////////
  97.         // getter & setter
  98.         ///////////////////////////
  99.        
  100.         /**
  101.          * get database native path
  102.          * @return String path
  103.          * */
  104.         public function get path():String
  105.         {
  106.             return dbFile.nativePath;
  107.         }
  108.        
  109.         /**
  110.          * get database file
  111.          * @return File database file
  112.          * */
  113.         public function get file():File
  114.         {
  115.             return dbFile;
  116.         }
  117.        
  118.         /**
  119.          * get the last sql sentence
  120.          * @return String sql
  121.          * */
  122.         public function get lastSQL():String
  123.         {
  124.             return stmt.text;
  125.         }
  126.        
  127.         ///////////////////////////
  128.         // private functions
  129.         ///////////////////////////
  130.        
  131.         /**
  132.          * open database connection
  133.          * @private
  134.          * */
  135.         private function open(file:File):Boolean
  136.         {
  137.             dbFile = file;
  138.             close();
  139.             try
  140.             {
  141.                 conn.open(dbFile);
  142.                 stmt.sqlConnection = conn;
  143.             }
  144.             catch (e:Error)
  145.             {
  146.                 trace("  <open>", e.message);
  147.                 return false;
  148.             }
  149.             return true;
  150.         }
  151.     }
  152. }

应用演示:

PLAIN TEXT >> ACTIONSCRIPT:
  1. import org.phpz.data.SQLData;
  2. private var db:SQLData = new SQLData();
  3.  
  4. private function initConnect():void
  5. {
  6.     // 通过文件路径打开数据库
  7.     db.openPath(File.applicationDirectory.nativePath + "/data/test.sqlite");
  8.  
  9.     // - OR -
  10.  
  11.     // 直接打开数据库文件
  12.     // db.openFile(new File(File.applicationDirectory.nativePath + "/data/test.sqlite"));
  13.  
  14.     // 执行 insert update 或 create 等语句
  15.     // insert update 返回影响的行数, 失败返回 -1
  16.     // create 成功返回 0, 失败返回 -1
  17.     trace(db.update("update test set txt = 'aa' where txt = 'aa';")); // 可能的输出: 1
  18.  
  19.     // 执行 select 语句, 返回 SQLStatment.getResult().data 数组
  20.     dg.dataProvider = db.select("select * from address_book;");
  21. }

Seven Yu @ 03/28/2008 (10:30 pm)

[转]Tons of new Flex / AIR articles and videos online

Tags: , , ::

Craig Goodman just sent out an email highlighting some of the new Flex and AIR content on the Adobe Developer Center.

Articles:

Uploading files to a server from an Adobe AIR application
Explore different scenarios that leverage the Adobe AIR framework for uploading files from a user’s desktop to a remote server.

Mashing up Google Maps with Adobe AIR
Explore how to integrate web tools such as Google Maps with an Adobe AIR application.

Taking a Flex app to the desktop
Learn to use Adobe AIR specific features when deploying a browser-based Flex app to the desktop.

Communicating between Flex and .NET
Learn how and when to use the three most popular HTTP request/response mechanisms used for communicating between Flex and .NET, and get a practical comparison of the three.

Building a standalone Adobe AIR app on salesforce.com with Flex 3
Learn how to build a simple desktop Adobe AIR-based application that uses the Apex platform to access the salesforce.com infrastructure.

Videos:

Rick Treitman, Buzzword / Virtual Ubiquity
Flex, AS3, deployed via Flash player (AIR version soon to come)

Anthony Franco, Discovery Channel’s Cancer Collage
Flash and Flex

Frog Design - Disney Travel Agent Application
AIR, Flex, and Flash and Photoshop CS3 for building comps

Alan Queen - Digimix
AIR, Flex and ActionScript 3

John Wu - Ora Time and Expense Tracker
AIR, HTML, JavaScript, EXTjs framework

Ed Finkler - Spaz.AIR
AIR, HTML, JavaScript

Tm Bray and Robert Cadena, Searchcoder Dashboard
AIR, Flex and LiveCycle Data Services

Marc Hughes, AgileAgenda
AIR, Flex, PHP

Josh Hirsch, Big Spaceship / HBO
AS3, Flash, FLV, Photoshop (comps), After Effects, Papervision

原文地址: http://www.mikechambers.com/blog/2007/10/18/tons-of-new-flex-air-articles-and-videos-online/

Seven Yu @ 03/28/2008 (12:24 pm)

一款在线正则测试工具

Tags: , , , , ::

Flex 在线正则测试工具, 非常不错的小软件, 功能强大, 表现形式友好, 功能如下:

  • 表达式实时匹配: 当输入表达式或测试文本时即进行匹配检测;
  • 正则区域提示: 鼠标放到正则表达式上时, 对各部分有解释信息;
  • 测试文本区域提示: 所有匹配项都在测试文本区被标识出来, 鼠标悬停也会出现提示;
  • 表达式/实例 列表及说明: 右侧有一个常用的表达式的列表, 双击加入正则文本中, 单击显示说明信息;

地址: http://gskinner.com/RegExr/

Seven Yu @ 03/27/2008 (8:56 pm)

Adobe Photoshop Express

Tags: , , ::

Adobe Photoshop Express , 在线 Photoshop, 来领略一下 Flex 的威力吧~~~ :D

你可以免费注册自己的帐号, 并且会得到一个 username.photoshop.com 快去抢啊~~~

BTW: 界面无与伦比的喜欢, 太佩服 Photo Express 的设计师了~~ 致敬~~

Seven Yu @ 03/26/2008 (6:14 am)

RegexTester v2.0.1(源码)

Tags: , , , ::

本篇日志只有源码, 下载及开发历史见上篇日志.

PLAIN TEXT >> ACTIONSCRIPT:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. Regex Tester v2.0.1
  4. Author: Seven Yu (Dofy)
  5. E-Mail/gtalk: dofyyu at gmail dot com
  6. URL: http://dofy.net/ http://phpz.org/
  7. -->
  8. <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
  9.     layout="vertical" horizontalAlign="left" width="400" height="500"
  10.     creationComplete="initApp();"
  11.     showStatusBar="false"
  12.     backgroundColor="0xeeeeee"
  13.     xmlns:ctrler="org.phpz.controls.*">
  14. <mx:Style>
  15.     Application {
  16.         padding-top: 10px;
  17.         padding-right: 10px;
  18.         padding-bottom: 10px;
  19.         padding-left: 10px;
  20.     }
  21.     Application, ToolTip {
  22.         font-size: 12px;
  23.     }
  24.     Label {
  25.         font-weight: bold;
  26.     }
  27. </mx:Style>
  28. <mx:Script>
  29.     <![CDATA[
  30.         import mx.events.DragEvent;
  31.         import mx.controls.Alert;
  32.         import mx.controls.CheckBox;
  33.         import mx.events.ItemClickEvent;
  34.        
  35.         private const FILE_MAX_SIZE:uint = 1024;
  36.        
  37.         private const TITLE_WARNING:String = "Warning!";
  38.         private const TITLE_OK:String      = "Ok!";
  39.        
  40.         private const MSG_ONE_FILE:String      = "Accept one file only.";
  41.         private const MSG_NOT_TEXT_FILE:String = "Accept Text file only.";
  42.         private const MSG_EXCEED_SIZE:String   = "File size could not exceed " + FILE_MAX_SIZE + " bytes.";
  43.         private const MSG_REGEX_PASTED:String  = "Regex pasted.";
  44.        
  45.         private var reg:RegExp = new RegExp();
  46.         private var objArray:Array = new Array();
  47.         private var curIndex:int;
  48.        
  49.         private var _curLastIndex:int;
  50.         private var _curFlags:Array = new Array();
  51.         private var flags:Array = new Array(
  52.                                     ["g", "global"],
  53.                                     ["i", "ignore case"],
  54.                                     ["m", "multiline"],
  55.                                     ["s", "dotall"],
  56.                                     ["x", "extended"]);
  57.        
  58.         /**
  59.          * 初始化
  60.          * */
  61.         private function initApp():void
  62.         {
  63.             // 添加修饰符 checkbox
  64.             var curFlag:CheckBox;
  65.             for (var i:uint = 0; i <flags.length; i++)
  66.             {
  67.                 curFlag = frmFlags.addChild(new CheckBox()) as CheckBox;
  68.                 curFlag.label = flags[i][0];
  69.                 curFlag.toolTip = flags[i][1];
  70.                 curFlag.addEventListener(Event.CHANGE, flagChangeHandler);
  71.             }
  72.             pattern.setFocus();
  73.             // 绑定事件
  74.             nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
  75.             pattern.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, dragEnterHandler);
  76.             pattern.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, dragDropHandler);
  77.             testText.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, dragEnterHandler);
  78.             testText.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, dragDropHandler);
  79.         }
  80.        
  81.         override protected function keyDownHandler(event:KeyboardEvent):void
  82.         {
  83.             if (event.controlKey)
  84.             {
  85.                 switch (event.keyCode)
  86.                 {
  87.                     case Keyboard.NUMBER_1:
  88.                     {
  89.                         pattern.setFocus();
  90.                         break;
  91.                     }
  92.                     case Keyboard.NUMBER_2:
  93.                     {
  94.                         testText.setFocus();
  95.                         break;
  96.                     }
  97.                     case Keyboard.BACKQUOTE:
  98.                     {
  99.                         (frmFlags.getChildAt(0) as CheckBox).setFocus();
  100.                         break;
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.        
  106.         /**
  107.          * 设置修饰符
  108.          * */
  109.         private function flagChangeHandler(evt:Event):void
  110.         {
  111.             var obj:Object = evt.target;
  112.             obj.selected
  113.                 ? _curFlags.push(obj.label)
  114.                 : _curFlags.splice(_curFlags.indexOf(obj.label), 1);
  115.             setRegContent();
  116.         }
  117.        
  118.         /**
  119.          * 执行测试
  120.          * */
  121.         private function test():void
  122.         {
  123.             var execObj:Object;
  124.             // 重置结果数组和索引变量
  125.             objArray = new Array();
  126.             curIndex = 0;
  127.            
  128.             do
  129.             {
  130.                 _curLastIndex = reg.lastIndex;
  131.                 (execObj = reg.exec(testText.text)) != null && objArray.push(execObj);
  132.             }
  133.             while (_curLastIndex != reg.lastIndex && reg.lastIndex> 0)
  134.            
  135.             displayObj(0); // 显示结果
  136.         }
  137.        
  138.         /**
  139.          * 显示结果
  140.          * */
  141.         private function displayObj(offset:int):void
  142.         {
  143.             // 设置结果索引导航
  144.             if (objArray.length> 0)
  145.             {
  146.                 curIndex += offset;
  147.                 if (curIndex <0)
  148.                 {
  149.                     curIndex = objArray.length - 1;
  150.                 }
  151.                 else if (curIndex>= objArray.length)
  152.                 {
  153.                     curIndex = 0;
  154.                 }
  155.             }
  156.            
  157.             // 显示结果信息
  158.             var obj:Object = objArray[curIndex];
  159.             frmResult.label = obj
  160.                                 ? "Result: " + (curIndex+1) + " of " + objArray.length + " match."
  161.                                 : "Result: no match.";
  162.             result.text = "";
  163.             for ( var k:String in obj)
  164.             {
  165.                 result.text += k + ": \"" + obj[k] + "\"\n";
  166.             }
  167.         }
  168.        
  169.         /**
  170.          * 检测正则
  171.          * */
  172.         private function checkRegexp(data:String):void
  173.         {
  174.             var re:RegExp = /^\/(.*?)\/([gimsx]*)$/is;
  175.             var reObj:Object = re.exec(data);
  176.             if (reObj == null)
  177.             {
  178.                 pattern.text = data;
  179.             }
  180.             else
  181.             {
  182.                 pattern.text = reObj[1];
  183.                 var chks:Array = frmFlags.getChildren();
  184.                 for (var i:uint = 0; i <chks.length; i++)
  185.                 {
  186.                     chks[i].selected = (reObj[2].indexOf(chks[i].label) !== -1);
  187.                 }
  188.                 _curFlags = (reObj[2] as String).split('');
  189.             }
  190.         }
  191.        
  192.         /**
  193.          * 替换换行符
  194.          * */
  195.         private function cleanText(txt:String):String
  196.         {
  197.             return txt.replace(/\r\n/g, "\n");
  198.         }
  199.        
  200.         /**
  201.          * 结果导航
  202.          * */
  203.         private function displayObjHandler(evt:ItemClickEvent):void
  204.         {
  205.             displayObj(evt.index * 2 - 1);
  206.         }
  207.        
  208.         /**
  209.          * 拖拽实现
  210.          * */
  211.         private function dragEnterHandler(evt:NativeDragEvent):void
  212.         {
  213.             stage.nativeWindow.activate();
  214.             (evt.currentTarget as TextArea).setFocus();
  215.             var clip:Clipboard = evt.clipboard;
  216.             if (clip.hasFormat(ClipboardFormats.FILE_LIST_FORMAT))
  217.             {
  218.                 NativeDragManager.acceptDragDrop(evt.currentTarget as InteractiveObject);
  219.             }
  220.         }
  221.        
  222.         /**
  223.          * 放置事件
  224.          * */
  225.         private function dragDropHandler(evt:NativeDragEvent):void
  226.         {
  227.             var loader:URLLoader = new URLLoader();
  228.             var txtBox:TextArea = evt.currentTarget as TextArea;
  229.             var file:File = checkFile(evt.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array);
  230.             loader.addEventListener(Event.COMPLETE,
  231.                                         function(ievt:Event):void
  232.                                         {
  233.                                             txtBox.id == "pattern"
  234.                                                 ? checkRegexp(cleanText(ievt.target.data))
  235.                                                 : txtBox.text = cleanText(ievt.target.data);
  236.                                             setRegContent();
  237.                                         }
  238.                                     );
  239.             file != null && loader.load(new URLRequest(file.nativePath));
  240.         }
  241.        
  242.         private function checkFile(files:Array):File
  243.         {
  244.             if (files == null)
  245.             {
  246.                 return null;
  247.             }
  248.             if (files.length> 1)
  249.             {
  250.                 Alert.show(MSG_ONE_FILE, TITLE_WARNING);
  251.                 return null;
  252.             }
  253.             var file:File = files[0];
  254.             if (file.isDirectory || file.extension.toLowerCase() != 'txt')
  255.             {
  256.                 Alert.show(MSG_NOT_TEXT_FILE, TITLE_WARNING);
  257.                 return null;
  258.             }
  259.             if (file.size> FILE_MAX_SIZE)
  260.             {
  261.                 Alert.show(MSG_EXCEED_SIZE, TITLE_WARNING);
  262.                 return null;
  263.             }
  264.             return file;
  265.         }
  266.        
  267.         /**
  268.          * 设置表达式
  269.          * */
  270.         private function setRegContent():void
  271.         {
  272.             reg = new RegExp(pattern.text, _curFlags.join(''));
  273.             test();
  274.         }
  275.                
  276.         /**
  277.          * 显示关于对话框
  278.          * */
  279.         private function showAboutInfo():void
  280.         {
  281.             result.htmlText  = "<p align=\"center\">";
  282.             result.htmlText += "<b><font size=\"17\">Regex Tester</font></b> ";
  283.             result.htmlText += "<font color=\"#999999\">version 2.0.1</font><br />";
  284.             result.htmlText += "<b>Author:</b> Seven Yu (Dofy)<br />";
  285.             result.htmlText += "<b>E-Mail/gtalk:</b> dofyyu" + "@gmail.com<br />";
  286.             result.htmlText += "<b>URL:</b> <a href=\"http://dofy.net/\"><u>dofy.net</u></a> &amp; ";
  287.             result.htmlText += "<a href=\"http://phpz.org/\"><u>phpz.org</u></a><br />";
  288.             result.htmlText += "<br />Copyright (C) 2008 dofy's den all rights reserved.";
  289.             result.htmlText += "</p>";
  290.         }
  291.     ]]>
  292. </mx:Script>
  293. <mx:VDividedBox width="100%" height="100%">
  294.     <mx:VBox width="100%" height="100%">
  295.         <mx:FormItem label="Regex:" width="100%" direction="horizontal" horizontalAlign="right">
  296.             <mx:Button label="Copy">
  297.                 <mx:click>
  298.                     <![CDATA[
  299.                         Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, reg)
  300.                         && Alert.show(MSG_REGEX_PASTED, TITLE_OK);
  301.                     ]]>
  302.                 </mx:click>
  303.             </mx:Button>
  304.             <mx:Button label="About" click="showAboutInfo();" />
  305.         </mx:FormItem>
  306.         <ctrler:TabTextArea id="pattern" width="100%" height="100%" keyUp="setRegContent();" />
  307.         <mx:FormItem id="frmFlags" label="Flag:" direction="horizontal" />
  308.     </mx:VBox>
  309.    
  310.     <mx:VBox width="100%" height="100%">
  311.         <mx:Label text="Test Text:" />
  312.         <ctrler:TabTextArea id="testText" width="100%" height="100%" keyUp="test();" />
  313.     </mx:VBox>
  314.    
  315.     <mx:VBox width="100%" height="100%">
  316.         <mx:FormItem id="frmResult" label="Result:" width="100%" horizontalAlign="right">
  317.             <mx:ButtonBar id="btnBar" itemClick="displayObjHandler(event);">
  318.                 <mx:Array>
  319.                     <mx:String><![CDATA[<]]></mx:String>
  320.                     <mx:String><![CDATA[>]]></mx:String>
  321.                 </mx:Array>
  322.             </mx:ButtonBar>
  323.         </mx:FormItem>
  324.         <mx:TextArea id="result" editable="false" tabEnabled="false" width="100%" height="100%" />
  325.     </mx:VBox>
  326.    
  327. </mx:VDividedBox>
  328. </mx:WindowedApplication>

Seven Yu @ 03/26/2008 (6:14 am)

RegexTester v2.0.1

Tags: , , , ::

RegexTester 是用 Adobe Flex Builder 开发的 Air 应用程序, 可以进行 ActionScript 3.0 的正则式的测试, 是正则测试和学习的有力助手.

欢迎大家下载试用, bug 报告邮箱: dofyyu at gmail dot com.

下载 / 源码

开发历史:

  • 2008.03.04 v 1.0 基本功能实现;
  • 2008.03.05 v 1.1/1.15 优化/移除冗余代码, 修复了一个全局模式造成死循环的 bug.
  • 2008.03.05 v1.17 修正结果包含 html 代码 bug(暂时取消用 htmlText 显示结果)
  • 2008.03.06 v2.0 更名为 RegexTester 支持文件拖拽, 自动分析正则式
  • 2008.03.06 v2.0.1 正则输入框和测试文本输入框支持输入 tab, 但不能用 tab 键切换焦点(可以用 ctrl + tab)

快捷键:

  • Ctrl+` 焦点定位到修饰符(flags)
  • Ctrl+1 焦点定位到正则输入框
  • Ctrl+2 焦点定位到测试文本框

Seven Yu @ 03/26/2008 (4:07 am)

让你的自定义组件拥有自己的图标

通常, 我们使用自定义组件时, 列表中显示的是默认的一个很丑陋的图标(见右图).

今天在看一官方文档(Creating and Extending Adobe Flex 3 Components)时发现一个专门用来定义组件图标的元标签 [IconFile], 使用方法也非常简单:

PLAIN TEXT >> ACTIONSCRIPT:
  1. [IconFile("path/to/your/icon/filename.ext")]
  2. // 支持 png, gif 和 jpg 文件
  3. // 文件尺寸 18*18 px
  4. class YourClass{}

这样, 我们的自定义组件也有了自己的图标了, 够酷吧 ;)

Next Page »