置顶随笔
“文章分类”栏目的内容都不是原创的,多为转贴,如果在转贴时有原出处及作者,我会加以注明,但有些文章出处及作者不详的,会加上[转贴]字样,且版权都归原作者所有,如果您发现那篇文章是您的而没有署名,请与我联系,我会第一时间加上署名或应您要求进行删除

“随笔分类”中的文章为原创内容,采用许可:署名,非商业。
posted @ 2005-05-20 19:13 三千 阅读(563) | 评论 (0)编辑
  2008年4月24日

    老是有网友找我要,所以干脆放出来,这是TTGame整理的版本,其实网上一搜到处都有。排版和没有图片不理想,但也凑合能看。
    陈冰那个版本我从来没见过,因为是付费的,不知道现在还是否有出售,不过我已经用不上了,FMS搞熟了就那些东西,剩下的就靠经验积累了。

    fms_api_cn.rar(3.61MB)>>
posted @ 2008-04-24 10:16 三千 阅读(207) | 评论 (0)编辑
  2008年4月21日

以下二个函数,适合ComboBox,List件。

CheckCmbItemExists:检测某项是否已存在。有时候,需要动态向List或ComboBox组件中添加项,但是在添加前,要事先检查是否已经存在了,避免重复添加。

SelectCmbItem:选中某项。有时候需要使用程序将List或ComboBox组件中某项选中。


    //检测某项是否已存在。
    function
 CheckCmbItemExists(_cmb, _data) {
        
var l = _cmb.length;
        
for (var j = 0; j<l; j++) {
            
if (_cmb.getItemAt(j).data == _data) {
                
return true;
            }
        }
        
return false;
    }
    
//选中某项。
    function SelectCmbItem(_cmb, _data) {
        
var l = _cmb.length;
        
var index = 0;
        
for (var j = 0; j<l; j++) {
            
if (_cmb.getItemAt(j).data == _data) {
                index 
= j;
                
break;
            }
        }
        _cmb.selectedIndex 
= index;
    }

posted @ 2008-04-21 11:41 三千 阅读(54) | 评论 (0)编辑
  2008年3月13日
    有时候需要返回小数点后若干位的一个浮点数。如2.16832,保留二位小数变成:2.17,这样的函数在AS 2.0中是没有的,需要自己写:

function getPoint(num, l) {
    
return (Math.round(num*Math.pow(10, l))/Math.pow(10, l));
}


    用法
    num:要处理的浮点数;
    l:要保留的小数位个数;
    如:getPoint(2.16832,2),输出为:2.17
    注意
    在使用这个函数时,要注意溢出,因为num*Math.pow(10, l)及有可能超出了AS中浮点数所能表示的范围,从而导致你不想要的结果,另外,当输入数num比较大的时候,虽然还在浮点数表示范围内,但是小数点返回就可能不准确了,如:getPoint(12345678.123456789123, 10) ,输出结果:12345678.1234568,而不是12345678.1234567891。

   
posted @ 2008-03-13 20:25 三千 阅读(67) | 评论 (0)编辑
  2008年3月6日

很早以前写过一篇文章(用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则Match的速度,比如文章系统中就极有可能用到,今天有点时间,就改进了一下,代码如下:

    public static string getStr(string s,int l,string endStr)
    
{
        
string temp = s.Substring(0, (s.Length < l)?s.Length:l);
        
        
if (Regex.Replace(temp,"[\u4e00-\u9fa5]","zz",RegexOptions.IgnoreCase).Length<=l)
        
{
            
return temp;
        }

        
for (int i=temp.Length;i>=0;i--)
        
{
            temp 
= temp.Substring(0,i);
            
if (Regex.Replace(temp,"[\u4e00-\u9fa5]","zz",RegexOptions.IgnoreCase).Length<=l-endStr.Length)
            
{
                
return temp + endStr;
            }
    
        }

        
return endStr;
    }


此修改版的方法多加了个参数"string endStr",是指当字符串"string s"超过指定长度"int l"时,对结尾的处理,比如要不要加上省略号"..."或加上其它字符。
另外,添加了省略号之后,省略号长度也是算在结果的长度之内了。

    用法如:

    getStr("中国1中国中国中1111中国", 23,"") 
    //output:中国1中国中国中1111中国

    getStr("中国1中国中国中1111中国", 23,"...") 
    //output:中国1中国中国中1111...

    getStr("中国1中国中国中1111中国中国", 23,"")    
    //output:中国1中国中国中1111中国

    getStr("中国1中国中国中1111中国中国", 23,"...")
    //output:中国1中国中国中1111...

----------------------------------------------------------------------

    补充:"kpz"回复说上边的方法会截取失真,而我又无法做到穷尽测试,所以换了另一种写法,为了考虑性能结果把逻辑搞的有点"晕",反复测试了多次,代码如下:

public static string getStr2(string s, int l,string endStr) 
    

        
string temp = s.Substring(0, (s.Length < l+1)?s.Length:l+1);    
        
byte[] encodedBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(temp);
        
        
string outputStr = ""
        
int count = 0;     
        
        
for (int i = 0; i < temp.Length; i++
        

            
if ((int)encodedBytes[i] == 63)
                count 
+= 2
            
else
                count 
+= 1

            
if (count <= l-endStr.Length)
                outputStr 
+= temp.Substring(i,1); 
            
else if (count>l)    
                
break;            
        }
 
        
        
if (count<=l)
        
{
            outputStr
=temp;
            endStr
="";
        }

        
        outputStr 
+= endStr;    
        
        
return outputStr; 
    }

用法和参数含义均同前,注意省略号也占位置,算了长度。

posted @ 2008-03-06 10:06 三千 阅读(231) | 评论 (7)编辑
  2008年3月4日

[Flash开发笔记] AS中保留多少位小数的函数

[Flash开发笔记] 如何让Flash的swf文件在客户端不缓存
[Flash开发笔记] List控件--删除指定label或data的项

[Flash开发笔记] Flash 执行exe文件
posted @ 2008-03-04 13:07 三千 阅读(341) | 评论 (0)编辑
    问题
    如何让Flash的swf在客户端不缓存?即如何让swf文件不出现在IE浏览器的临时文件夹里?

    方法:

    一般的我们对于动态页面(asp,php等)禁止缓存都是通过语言本身设置HTTP头来实现的,但swf不能直接设置HTTP头。办法就是可以从服务端着手,在IIS里添加HTTP头:

cache-control: "no-cache"
pragma: "no-cache"
expires: "-1"


    操作方法见图示:



    但在设置IIS时要注意,如果对整个网站设置了HTTP头,则整站的内容(如jpg,gif,css,html等)都不会被缓存了,这样会导致每次都要重新下载这些文件,不好。那么可以更进一步,在网站下创建一个虚拟目录,然后对此虚拟目录设置HTTP头,把禁止缓存的swf文件放在其中。
   

posted @ 2008-03-04 12:03 三千 阅读(222) | 评论 (0)编辑
  2008年2月29日
 
    在制作聊天室,斗地主游戏等这样的Flash/FMS程序时,可能会涉及到划分房间的问题,比如二个房间的游戏规则相同,功能相同,但是二个房间的数据独立,互不影响。
 
    那么这种应用,就涉及到应用程序实例了,如以下。
 
    nc.connect("rtmp://myDomain.com/chat_app/room_01") 
    nc.connect("rtmp://myDomain.com/chat_app/room_02")
 
    chat_app是一个聊天室程序,room_01和room_02就是chat_app的两个不同实例,整个地址的格式是:

    protocol:[//host][:port]/appname/[instanceName]
 
    地址中的[instanceName]以方括弧表示可有可无,但是不管这个"instanceName"有没有,它都会连接到了一个实例。
    就是说,任何一个客户机连接到一个应用程序时,这个客户机实际上都是连接到一个应用程序实例(application instances)的。
 
    比如我们一般的写法:

    nc.connect("rtmp://myDomain.com/my_app");
 
    本质上他和以下的做法是等同的:

    nc.connect("rtmp://myDomain.com/chat_app/_definst_");
 
    即在这种情况下,默认连接的实例为"_definst_",并不代表没有实例。
 
    那么我们就要好好理解一下“实例”,做过高级语言开发的,就很好理解,就象一个类有多个实例一样,它们具有同样的“规则”,但是具有各自不同的“数据”。
 
    一个实例不需要在服务器上定义它自己的目录。应用程序的资源,比如流和共享对象,对于每个实例而言都是独立的,并且是被存储在这个应用程序的流和共享对象目录下的它们各自的目录中的,比如实例room_01使用的SharedObject对象(比如叫"my_rso"),会存储在"\chat_app\sharedobjects\room_01\my_rso.fso"。
 
    使用应用程序实例的另一个原因是可以避免由这个应用程序创建的记录流或共享对象的冲突。例如,在上面的例子中,room_01和room_02都使用main.asc中的程序规则和逻辑,但是他们的数据各自独立,互不影响。由room_01创建的任何流或共享对象与由room_02创建的都是截然不同的,虽然这两个实例都是运行在同一个应用程序chat_app。


posted @ 2008-02-29 09:00 三千 阅读(139) | 评论 (0)编辑
  2008年1月23日
List控件有两个关于remove的方法:removeAll()、removeItemAt(index),但是在预先不知道索引的情况下,如果想删除label为"yaoyao"或data为"333"的项,怎么做呢?
 
方法是循环遍历,并进行比对,再使用removeItemAt方法删除:

var l = _list.length;
for (var j = 0; j<l; j++) {
 
if (_list.getItemAt(j).label == "yaoyao") {
  
//_list.getItemAt(j).data == "333";
  _list.removeItemAt(j);
  
break;
 }
}

posted @ 2008-01-23 12:29 三千 阅读(151) | 评论 (0)编辑
  2008年1月16日
    在FMS开发中,我们经常要在FMS端连接数据库,进行如身份验证等的数据查询操作。方法有多种,你可以使用WebServices或NetConnection对象,也可以使用NetServices类,差别是NetServices能够返回RecordSet对象的数据,本例子就是一个使用NetServices连接FlashRemoting程序的简单例子。例子的重点在于跑通"Flash->FMS->FlashRemoting"这个数据传递的过程,所以并没有使用到RecordSet对象。例子使用Flash 8 + FMS 2.0.4 + Asp.Net 2.0 制作。

    点此下载(74KB)>>

    一、使用说明
        1).在IIS中,创建虚拟目录RemotingApp,asp.net版本选择2.0,将例子中RemotingApp文件夹中的内容放进去;
        2).将crossdomain.xml文件放在IIS站点根中,要能通过http://domain/crossdomain.xml访问;
        3).将FMSRemotingTest文件夹copy到FMS的应用程序目录中,此目录默认在“C:\Program Files\Macromedia\Flash Media Server 2\applications\”

    二、关键代码分析
        1).TestDemo.aspx
<%@ Page Language="c#" Debug="true" %>

<%@ Register TagPrefix="Macromedia" Namespace="FlashGateway" Assembly="flashgateway" %>
<Macromedia:Flash ID="Flash1" runat="Server" />

<script language="C#" runat="server">
    
void Page_Load(Object sender, EventArgs e)
    {
        Flash1.Result 
= "FlashRemoting服务器时间:"+System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
    }
</script>

        注意加粗的部分,FlashRemoting是个比较特殊的东西,你的页面"TestDemo.aspx"的名称"TestDemo"就是方法名称,方法的代码要写在Page_Load中,然后把返回结果绑定到一个FlashGateway对象(本例中"Flash1")上才能传递出去。关于FlashRemoting For .Net的详细用法,请查其它资料。

        2).FMS端Main.asc文件

load ("netservices.asc");
//
application.onConnect = function (client, _name)
{
    //...
        this.acceptConnection (client);
        
//
        NetServices.setDefaultGatewayUrl ("
http://localhost/RemotingApp/gateway.aspx");
        
var conn = NetServices.createGatewayConnection ();
        
var myService = conn.getService ("RemotingApp", this);
        myService.TestDemo();
        application.TestDemo_Result =
 function (result_obj)
        {
          //...
        }
    //...
};

        同样注意加粗的部分,load ("netservices.asc");要放在最顶行。
        "RemotingApp"就是前边创建的虚拟目录了。
        conn.getService ("RemotingApp", this);这一句这里要非常注意,如果你的aspx页面放在更深一层的目录中,那么这一句中的"RemotingApp"就要带把路径转换为类似命名空间的写法,如“RemotingApp.Folder”。
        "TestDemo"就是前边TestDemo.aspx页面的名称,接受数据的函数使用"Remoting方法名"+"_Result"的格式。

        3).FMS_FlashRemoting.fla文件
        这个没啥说的,很简单,略了。

    三、注意事项
        如果遇到不能成功连接和返回数据,请注意:
        1).安全策略的问题,前边放置"crossdomain.xml"就是解决这个问题。
        2).web.config中system.web节的是否有:

<httpModules>
      
<add name="GatewayController" type="FlashGateway.Controller.GatewayController,flashgateway" />
</httpModules>
        
    四、本例的测试运行效果

       如下图:



    五、另附两个开发过程中遇到的简单问题
    1.如何查看FMS的服务端trace出的信息?
        1).打开FMS的管理控制台;
        2).View Applications -> { FMSRemotingTest } -> LiveLog;如下图:
 



    2.如何重启FMS应用程序?
        修改了FMS服务端的程序,如Main.asc后,需要重启FMS的应用程序才能看到最新的结果,所以如果你改了代码而看不到最新效果,不要恼火,还需要这步操作。
        1).打开FMS的管理控制台;
        2).Manage Servers -> { FMSRemotingTest } ->  如下图:



posted @ 2008-01-16 12:51 三千 阅读(354) | 评论 (0)编辑
  2008年1月2日
    其实今天这个标题,应该用"dangdang和joyo购书对比"比较合适。之所以用这个标题,是想接续上一篇文章《我为什么在joyo购书。昨晚几乎在相同的时间,我在joyo和dangdang都订了书。今天观察了二者的发货速度,有点感想想写下来。值此新年之际,也祝阅读此文的朋友新年快乐!

    首先我不是偏执狂,更不是闲来没事非要跑二个网站订书,更加谈不上枪手了,说的只是我做为一个普通消费者的实际经历和感受,如果说感受是主观的,那么经历总算是客观的吧,既然是写程序的,那咱用数据说话。:D~ 另外,之所以把这二家拿出来比,是因为去年二者为争夺中文书店全球第一名号引发的口水战,孰是孰非,无法分辨,做为消费者,我不管谁是第一,我只在乎实实在在享受到的服务。

    昨天是元旦,出去转了转,然后顺便去书城打算买那本上次翻过而未买的《项目管理通俗演义》,结果书城没了,于是回来在网上订,一查dangdang没货,joyo还有货。在将要在joyo下单的时候,顺便问了下朋友要不要顺便订书。她说想订本《人本界面(交互式系统设计) 》,可是一直没有货,我一查,果然两家都断货。于是搜了一下,发现还有《人机交互:以用户为中的设计和评估(第2版)》、《用户体验的要素:以用户为中心的Web的设计》比较适合,具体内容好坏不能判断,但是看书的简介还可以,价格也不贵,于是决定二本全订了。但是仔细一看,这二本只有在dangdang有货,joyo却没货。所以最后只好分别在两家下单:《项管》在joyo订,后二本在dangdang订,正好也对比一下二者的服务。

    今天上网一直关注二者的发货速度,晚些时候结果出来了,结果我抓成了图,我们来对比一下:
   
    上图为joyo订单,从下单(2008-1-1 22:42:06)到发货(2008-1-2 17:45:36)总共用时约19小时,免运费;

    
    上图为dangdang订单,从下单(2008-1-1 22:42:36)到发货(2008-1-2 19:13:58)总共用时约20.5小时,运费2元;
    
    A.配货时间方面,如果严格来讲,那么dangdang慢了一个多小时,但是这里头,也存在着偶然因素,暂时不足已说明问题,比如上月的那个dangdang的订单光配货就用去了二天时间,配货用去二天时间,我暂且以为是那个订单书多(折后约二百五十多块)的原因吧。

    B.包装方面,有一点我不能不提,上月的那个dangdang订单在送来时,塑料袋全烂了,书的一半完全裸露,且有轻度磨损,这令我当时很不满,不过不是特别严重就没有计较了。但是相比这下,joyo选用的宅急送,都是用纸箱包装,没有类似情况。

    C.在送达时间方面,joyo在订单上写“预计送达时间: 2008-1-3”,而且可以凭包裹号在宅急送网站查询物流情况。而dangdang网是没有的,我无法知道什么时候送达。至于本次真正的送达时间我会在收到书后,在此做以补充。但我敢预测的是,以dangdang往日的风格,绝不会比joyo早到。
    (2008-1-03 10:35分,joyo的书送到。时间比我想象的要快,这次有一点我猜错了,就是包装:这次没有使用纸箱,可能只有一本书太小的缘故,但是还是包了三层,第一层是印有joyo的塑料袋,和当当类似,第二层是泡沫塑料代,最外一层又密封一层塑料袋。当当的书目前还没有送到。
     2008-1-07 12:50分,当当的书送到,这次包的很严实,只是这时间...)

    D.在价格方面,见下表:

书籍 joyo(折后价格) dangdang(折后价格)
项目管理通俗演义 12.60 14.10(无货)
人机交互:以用户为中的设计和评估(第2版) 21.70(无货) 22.33
用户体验的要素:以用户为中心的Web的设计 18.70(无货) 18.75
运费 0 2

    统计一下上表,如果在二家都有货的情况下,上述订单总额算上运费,dangdang为:57.18元,joyo为:53.00元,那么在dangdang订的话要比在joyo多花去4.18元。

    E.在网站功能上,比如搜索,排行,书籍资料列表显示上,还是维持我上次所说的,dangdang做的比joyo好。但是我在前一个文章里也说了,这不是购买行为的决定因素,dangdang应该在关键环节下功夫。

    F.在产品的库存/品种齐全性方面,dangdang要比joyo全面,就拿本次三本书来说,joyo有两本就没有,这也迫使我不得不在dangdang下单,那么相对的,joyo在本次竞争中就失去了一个客户订单,虽然我这二本书不算多,但我相信积少成多的道理。

    在以上六点的对比中,除去"C.送达时间"暂不明确之外,joyo在配货速度、包装、价格三方面优胜于dangdang,而dangdang在网站功能、品种齐全方面比joyo做的好。
    
    文章末了,我想说的是,不要去争虚名,第一不第一无所谓,但服务千万不能马虎,只有用户认为你是第一你才是第一,自封的那是自欺欺人。

    最后希望在新的一年里,dangdang和joyo都能完善自我,超越对手,只有这样,我们用户才能享受到更好的服务。

posted @ 2008-01-02 21:25 三千 阅读(123) | 评论 (2)编辑