存档在 2007年12月

Announcement: 如何卸载ie7浏览器,如何删除IE7

2007年12月4日

虽然IE7浏览器增加了不少非常实用的功能,但是感觉使用起来还是有些不习惯,很多人都想删除ie7用回原来的IE6浏览器。

那么该如何卸载ie7呢?下面是删除IE7的简单步骤。

1.”开始”==>“运行”,输入“regedit”回车,打开注册表。
2.在注册表中找到HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\ActiveSetup\\ InstalledComponents\\{89820200-ECBD-11cf-8B85-00AA005B4383},在其右窗口中,将 IsInstalled值,由“1”改为“0”。
3.打开“控制面板”,双击“添加或删除程序”并选中“显示更新”,然后卸载IE7浏览器。
4.重启电脑,系统将自动删除IE7,并自动重装IE6,回到你想要的浏览器。
完成卸载….

FLASH版MD5加密函数

2007年12月19日

向大家提供一下我的FLASH版MD5加密函数(仅能用于半角字符的加密,全角的会出错),调用方法如:trace(md5(“copyright thor 2003″));函数代码如下(我已经定义为全局函数了,大家可以在任何地方使用):
_global.MD5=function(sMessage) {
function RotateLeft(lvalue, iShiftBits) { return (lvalue<<iShiftBits) | (lvalue>>>(32-iShiftBits)); }
function AddUnsigned(lX,lY) {
var lX4,lY4,lX8,lY8,lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
if (lX4 | lY4) {
if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
} else return (lResult ^ lX8 ^ lY8);
}
function F(x,y,z) { return (x & y) | ((~x) & z); }
function G(x,y,z) { return (x & z) | (y & (~z)); }
function H(x,y,z) { return (x ^ y ^ z); }
function I(x,y,z) { return (y ^ (x | (~z))); }
function FF(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function GG(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function HH(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function II(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function ConvertToWordArray(sMessage) {
var lWordCount;
var lMessageLength = sMessage.length;
var lNumberOfWords_temp1=lMessageLength + 8;
var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
var lWordArray=Array(lNumberOfWords-1);
var lBytePosition = 0;
var lByteCount = 0;
while ( lByteCount < lMessageLength ) {
lWordCount = (lByteCount-(lByteCount % 4))/4;
lBytePosition = (lByteCount % 4)*8;
lWordArray[lWordCount] = (lWordArray[lWordCount] | (sMessage.charCodeAt(lByteCount)<<lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount-(lByteCount % 4))/4;
lBytePosition = (lByteCount % 4)*8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
lWordArray[lNumberOfWords-2] = lMessageLength<<3;
lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
return lWordArray;
}
function WordToHex(lvalue) {
var WordToHexvalue=””,WordToHexvalue_temp=””,lByte,lCount;
for (lCount = 0;lCount<=3;lCount++) {
lByte = (lvalue>>>(lCount*8)) & 255;
WordToHexvalue_temp = “0” + lByte.toString(16);
WordToHexvalue = WordToHexvalue + WordToHexvalue_temp.substr(WordToHexvalue_temp.length-2,2);
}
return WordToHexvalue;
}
var x=Array();
var k,AA,BB,CC,DD,a,b,c,d
var S11=7, S12=12, S13=17, S14=22;
var S21=5, S22=9 , S23=14, S24=20;
var S31=4, S32=11, S33=16, S34=23;
var S41=6, S42=10, S43=15, S44=21;
x = ConvertToWordArray(sMessage);
a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
for (k=0;k<x.length;k+=16) {
AA=a; BB=b; CC=c; DD=d;
a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
d=GG(d,a,b,c,x[k+10],S22,0x2441453);
c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
a=II(a,b,c,d,x[k+0], S41,0xF4292244);
d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
c=II(c,d,a,b,x[k+6], S43,0xA3014314);
b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
a=AddUnsigned(a,AA); b=AddUnsigned(b,BB); c=AddUnsigned(c,CC); d=AddUnsigned(d,DD);
}
var temp= WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
temp=temp.toLowerCase();
temp=temp.substr(temp.length/4,temp.length/2);
return temp;
}

FlashMX+ASP+Access数据库操作之初步应用

2007年12月19日

大家经过前面的学习(如果前面的内容,大家已经能完全掌所至的话),各位应该能够完成相当的大部分功能了,在此卷中将向大家演示如何制作一个多用户留言板,其功能如下:
[1]多用户支持(允许通过指定的网址直接进入指定用户的留言板)
[2]悄悄话功能支持(仅留言板主人可以看)
[3]留言删除功能(仅留方板主人可以删)
[4]新留言提示
[5]留言的分页显示(每页12个)
[6]用户密码的标准MD5加密(不过不支持中文)
[7]根据操作系统的不同,自动设置字体和字号(不过很不幸,我在调试时注释掉了两行代码,后来忘了还原,所以这条功能在演示中无效,各位拿到源码者请去掉注释标记就可以了)
[8]留言者IP,操作系统,浏览器,来源信息登记
[9]非法下载以及盗版的处理
……

由于本卷源码较长,所以不在本教程中一一列出,本卷仅向大家讲述以上功能的实现方法,以及关键技术和实例代码

首先我们来说怎样实现多用户的支持,关于多用户的支持嘛,没什么很特别的技术,写过论坛或者多用户ASP留言板的人都了解,只是有一点要说一下的,我们都知道一般来说多用户留言板的直接指定用户的方法是由ASP文件的GET参数实现的,如: “这一段,然后在SWF文件名后面加上?user=用户名,这样的话,SWF在启动时会在_root下创建这个变量,然后我们的SWF就可以明确的知道现在需要切换至谁的留言板。

接下来说关于悄悄话的实现,这个就不用多说了,在FLASH中搞一个变量来保存当前用户是否输入了有效的密码,如果是的话就允许他看所有的留言,如果不是的话就弹个消息框来让提示不允许看

接着我们来说留言删除的实现,这个很容易,向ASP发出密码,用户和当前留言的主键,然后剩下的事情全交给ASP去做吧,当然,删除之前得看看用户名和密码是否用效,不然的话,任何人都可以删留言,那可大大的不妙了~“`

新留言提示的实现,这个也很容易,在数据库中加一个字段来识别这个留言是否被点开过了就行了

留言的分页显示,这个嘛,稍稍要麻烦一点,不过,我们在前一卷,也就是第5卷的源码中已经演示了如何实现分页的问题,所以这一点也不用多说了

用户密码的MD5加密功能的实现,这个我以前也讲过了,我还在CSDN上发布过了FLASH版的MD5函数,大家请到FAQ或者精华区中找

根据操作系统的不同,自动设置字体和字号的实现方法,这个要说明一下,本来FLASH是可以直接读取操作系统版本的,但因为今年刚推出的WINDOWS 2003,所以FLASHMX中读不到WINDOWS 2003 的真实版本,所以我还是用ASP来读取的操作系统版本,然后通过建立的全局函数来为文本框赋值,同时检查字体和字号是否跟WINDOWS的默认字体和字号对应,不是的话就改掉字体和字号,不过这个我在演示的源码中注释掉了,大家拿到源码的话可以把这两行恢复出来,哦对了,说到FLASH直接读操作系统的时候,我想到了一个问题得提醒一下各位初哥,特别是还在看FLASHMX版帮助的同志请注意,帮助中有一项有点错误,大家请将帮助翻至System中的那个C什么什么对象中,就是关于获取屏幕分辨率的那两个函数,帮助上印错了,多印了一个点,应该是

System.capabilities.screenResolutionX获取分辨率X值
System.capabilities.screenResolutionY获取分辨率Y值

关于留言者IP啊什么的,这个就不用我多说了吧,随便找个版本的动网论坛看一下,就明白了

最后一个功能,就是关于怎么知道自己的FLASH有没被下载运行或者盗版运行嘛,同志们请用影片的_URL属性值……,如trace(_root._url),呵呵,明白了吧?

好了,这些功能的实现方法说完了,然后我们接着说一下相关技巧和代码规范
首先,第一点,大家请注意在面对大工程面前,请尽量双OOP方式来(噢,不明白OOP的人没关系,代码写多了,你就明白OOP是什么了,呵呵,基本常识,别跟着我问)
不过话说回来了,在FLASHMX 6中请不要完全以OOP方式来,那样运行速度太慢了,尽量不要自定义对象的属性,那样太慢了……
第二点,请大家尽量不要用UI组件,速度太慢,不过想偷懒的话嘛例外(建议大家多下载UI组件,不是下载了用,是下载了看里面的代码,增加经验)
第三点,在各位拿到源代码之前先预读一下String对象的操作,再复习一下Array对象的使用,还有[]方式的对象,变量引用技巧(不明白的人请倒回去看第5卷),如果各位对AttachMovie等语句熟悉者,请查阅相关资料
第四点,拿到源代码之后看不懂的同志,请加强一下FLASH基本语句和C语言的学习,呵呵
……

呵呵,我们现在对以上几点中的技巧进行实例说明,首先咱们来说说关于怎样在FLASH中创建对象,哦这个其实也很容易,帮助上写着有呢

对象名=new Object();

当然,我们也可以这样干 _global.对象名=new Object(); 这样的话,我们就可以在FLASH中的任何角落中直接使用对象名来引用这个Object了
接下来,大家就可以在这个Object中创建什么变量啊,数组啊,属性啊之类的(当然,并不推荐创建属性,不然的话,你的FLASH将对用户的机器运行速度来个极限考验)

然后嘛,就剩下一个比较复杂的,就是[]的引用方法,如下

trace(_root[“mov”+1][“childMo”+1][“var”+1]);
呵呵,各位语言基本功效差的同志看明白了么?这行代码是用trace弹个窗口出来(当然,如果是运行SWF的话,什么反应都没有的哦)显示_root对象中的叫做”mov”+1的对象中的”childMo”+1中的一个叫做”var”+1的变量的值,明白?这种引用方法掌握了的话,可是大大的有用哦,再如:

_root[“mov”+1][“txtCaption”+1].text=”ABC”;
呵呵,这一行是将_root对象中的”mov”+1中的”txtCaption”+1的文本域的文本设成ABC三个字母,当然,这个文本域txtCaption1要是动态或者输入文本域才行,静态文本域是不能这样干的,呵呵
好了,这一卷就说到这里了,对了代码基础较差的同志请先熟练一下代码基本功,然后再多看看前5卷,对代码较熟悉的同志只用看一下本攻略中提到的方法,呵呵,当然,对于经验丰富者,本攻略仅供参考……:)

FlashMX+ASP+Access数据库之数据整理

2007年12月19日

  经过我们几天的讨论,现在大家如果已经看完前4卷的话,应该已经可以轻松的搞定文本文件和ASP等文件与FLASH的数据传递方法了,今天我们来讨论怎样对对一定规模的数据进行有效的整理和安排。

在数据的整理我主要是用两种方法配合进行,分别是用Array和String这两个对象,因为我们在以后的历程中可能需要在FLASH中实现如小到留言板,大到论坛或者信息平台的功能,所以在FLASH中对数据的整理是非常重要的技术和技巧。我们在网页的功能编写中最最常见的应该算是列表之类的功能,我们今天的讨论实例将以实现软件下载系统的基本功能为主。软件下载系统相应大家都是经常接触的了,由于篇幅和时间的原因,我们在这里仅讨论软件下载系统的核心部分,其相关功能是:

我们还是用ACCESS数据库为例,在数据库中存储一系列软件信息,如软件名称,软件版本,推荐度,发布时间,软件介绍和下载链接等,然后我们将在FLASH中建立一个列表,并以每页10条记录的形式来显示这个数据库中的记录,并允许用户通过点击开始下载,这样的话,我们首先要写一个ASP文件(仅仅一个ASP文件就足够了),我们将在这个ASP文件中编写出按照指定的参数向FLASH提供第几页(如每页10条记录)的数据(其中包括每条记录的所有字段),也就是说,我们将每页的记录从ASP发向FLASH,然后再经过FLASH整理后,显示在列表上,这样的话,我们在每次从ASP发出数据时,因为需要以“变量名=值”的形式输出,所以在ASP部分的数据输出形式上是有两种风格的,我们以软件系统的数据为例讲解ASP部分的这两种数据整理风格:
第一种:我比较喜欢这一种,呵呵

变量名=软件1,软件2,软件3,软件4,软件5,软件6,软件7,软件8,软件9,软件10

第二种:我不怎么喜欢这一种,不过有很多人却喜欢这样干的
变量名0=软件数量&变量名1=软件1&变量2=软件2&变量3=软件3&变量4=软件4&变量5=软件5&变量6=软件6&变量7=软件7&变量8=软件8&变量9=软件9&变量10=软件10

两种风格之间其实也没有太明显的界线,呵呵,是吧,看各位的风格爱好了,当然也可以两种相结合,可能有部分人看到这里会纳闷,我现在在说些什么呢,怎么看不大明白呢?其实说白了也没什么,只是讨论一下我们每页要发出的数据怎样安排比较好,第一种的风格的实例如下:

aspRect=Foxmail,4.2,Windows,2003,Office,2003,Winamp,3.0
而另一种风格就如下所示:
softcount=4&softname1=foxmail&softname2=windows&softname3=office&softname4=winamp&softver1=4.2
&softver2=2003&softver3=2003&softver4=3.0

各位看完前4卷的朋友应该明白我现在在说什么了吧,如果仍有不清楚的请认真的从第1卷开始看,不许偷懒(这是为大家好,当然我也可以省些口水了)

说到这里我们已经讲到了前面两种数据输出的风格,接下来我们将讨论FLASH部分的处理,关于FLASH部分的处理嘛,我只有推荐一种,那就是引用对象数组来存这些数据,对于对象数组的基本操作,大家可以参考FLASHMX帮助中的Array对象,当然,我们还是有必要举下面几个例子:
如我们要在一个对象数组中保存一条软件信息的数据记录
SoftDatas=new Array();
SoftDatas.push({name: “Foxmail”, ver: 4.2, Size “2MB”,Note: “这是一个邮件收发软件”});

这样的话,我们在需要引用某一个软件的相关信息时,我们可以在FLASH中写如下代码来引用,如我们要在一个动态文本域中显示这个软件的名称:

txtBox.text=SoftDatas[0].name;  //0是索引咯,各位有语言基础的就不用我说了,没语言基础的同志嘛,看样子得多看看书了

对了,说到这里,我们得向大家强调一下FLASH中关于变量和对象的基本使用

变量和对象在FLASH中分两种,一种是本地变量或本地对象,另一种是全局变量或全局对象
关于本地变量和对象的声明嘛,就是普通的声明方式,(其实FLASHMX 6当中可以不用声明)如:
var a=”abc”;//声明一个变量,名称是a,初始值是”abc”
var b=123;//声明一个变量,名称是b,初始值是123
c=new Array();//声明一个Array对象,也就是数组
这种变量和对象在声明之后只能在当前影片实例中直接引用,在其它的影片实例中需要引用时要以”.”或者”/”方式引用,在这里我们推荐使用”.”方式引用,如:
当我们引用最顶层实例中的变量或对象时,那就是_root.变量名
当我们引用上一层实例中的变量或对象时,那就是_parent.变量名
当我们要引用某个特定实例中的变量或对象时,那就是_root.实例名1.实例名2.变量名(类似文件夹路径,也有绝对路径和相对路径的形式)

说到这里或许有些人对引用方法还不是很熟悉,这样吧,我们换一种方法来理解,其实FLASH中的场景就相同于“我的电脑”中的磁盘分区C:,D:,E:等
然后每个场景中的影片实例就相当于磁盘分区中的文件夹,每个场景中都有一个顶级的实例就是我们新建一个FLASH文档之后所显示的那个实例,这个顶级的实例我们可以理解成磁盘的根目录,其它我们创建的影片元件实例可以理解成文件夹,结构也是一样的,都是呈树状的,所以每个影片实例中还可以再创建影片实例,这就相当于在文件夹中还可以再创建文件夹,然后实例的引用就相当于文件夹的路径,只是说区别如下:

FLASH相当于文件系统中的
_root.Windows.System32.shellC:\Windows\System32\shell
\abc_root.abc
.\abcthis.abc
..\abc_parent.abc

现在各位该清楚了吧,好,我们再来说全局变量和对象的引用,这个嘛,就非常简单了,直接写变量或对象的名称就OK了

好了,跑题好半天了,该回来继续做我们的下载系统了 (兄弟们别砸,呵呵,咦,我刚才说到哪儿了,我看看先…  *^_^*)
哦,刚才说到整理数据了,说到这里有一点比较常用的技巧需要说一下,就是关于使用循环来引用变量或对象的方法,比如:我们有几个文本框,分别命名text1,text2,text3,text4,text5,然后我们不想一个一个的去引用,那么我们可以用循环或者过程来引用它们,比如说把它们的内容都设成www.coolthor.com,那么我们可以用下面的代码完成
for(i=1;i<6;i++){
this[“text”+i].text=”www.coolthor.com”;
}

当然,除了实例[“变量名”]的方法之外还有/方法,不过最好还是用上面的这个方法比较好。
好了,现在我们就要开始说下载系统的FLASH部分的实现方法了,由于篇幅原因,我在这里就只写出实现的方法

首先建立变量保存当前页的页码和总页数(这个值由ASP提供),这样我们就可以做上一页和下一页的按钮,并进行判断是不是当前页的页码超出了预期的范围,然后我们再来建立loadvars对象的实例和回调函数,然后再编写对象数组的赋值代码,参考代码如下:

/*设aspRect为返回的数据,我们以第一种风格为例,设ASP返回的数据是aspRect=Foxmail,4.2,Windows,2003,Office,2003,Winamp,3.0 */
SoftData=new Array();
tmpArray=aspRect.split(“,”);
tmpCount=0;
for(i=0;i<tmpArray.length;i++){
tmpCount++;
if (tmpCount==2){
tmpCount=0;
SoftData.push({name: tmpArray[i-1], ver: tmpArray});
}
}

然后,我们需要准备显示列表了,我比较习惯的方法是创建一个影片元件,在这个里面做好文本框和这条记录的按钮,并调整好位置,然后拉出10个到_root中,或者用attachmovie都可以,给它们加上顺序命名,如item1,item2,item3,item4…等等,然后嘛再该干什么就不用我说了吧

基本方法就是这些,哦对了,如果有需要将字串换成数值的,可以使用parseInt之类的函数来进行转换,还有就是比如说软件名称或者软件介绍中可能会出现&或者=号之类的,大家记在在asp输出之前把这些替换成全角的&和=,ASP中替换字串很容易,用Replace就可以了,FLASH中嘛,我在本卷的源代码中为大家写了一个全局函数Replace,用法和ASP中的那个一样,呵呵,今天就到这里,有需要本卷源代码者请付30分,哦,对了,还有些事情要告诉大家的就是,在我的源代码中为了方便大家阅读,所以绝大部分的变量和对象命名都是用的汉字,这一点在正式的编程中并不提倡,再就是大家要养成区分大小写的习惯,因为FLASH MX 7.0中已经区分大小写了,A并不等于a !!

FlashMX+ASP+Access数据库之中文代码解决方案

2007年12月19日

在前面的几卷中我们已经初步的了解了FLASH与数据库的加接原理和基本方法,现在我们将从本卷开始进行实战演习

本卷将向大家讲述怎样完成一个具备基本功能的会员注册和会员档案功能。
很多刚开始与ASP连接的朋友经常会提到同一个问题,就是无法正确的从ASP或者文本文件中读取到汉字或者全角字符,关于这个问题嘛,当年我也蛮头大的,呵呵,其实只要在FLASH中加一条指令就行了,就是在连接ASP之前加上System.useCodePage=true;就可以了(建议将此命令放在第一帧的第一行)

对了,有一个非常重要的问题忘了告诉大家,各位在使用LoadVars对象向ASP发送数据时,建议使用POST方法,尽量不要用GET方法,因为那样的话……嘿嘿  (俺先卖个关子再说,反正大家照我说的做绝对对各位都有好处,可以少走弯路,至于为什么嘛,大家自己试试GET和POST的区别就明白了,多动手对大家都有好处嘛,呵呵)

现在我们已经解决了FLASH与ASP之间的中文问题,下面我们将要准备开始实现会员的注册功能。我们首先建立一个ACCESS 2000格式的数据库,然后在数据库中创建一个数据表,并为它命名为user,接下来我们在这个数据表中创建三个字段,分别是id,user,pass,然后我们分别将这三个字段设为主键字段、20个字符长度文本字段和60个字符长度的文本字段,设置好之后,我们关闭这个数据库,并打开记事本(当然,用其它编辑器也可以),我们创建下面这个ASP文件(我们将用这个ASP文件来实现会员注册功能):
<%
dim strUser,strPass,strOutput,strSQL,db
strUser=trim(Request.FORM(“user”))    ’获取POST数据中的USER参数
strPass=trim(Request.FORM(“pass”))    ’获取POST数据中的PASS参数
strSQL=”insert into user (user,pass) values (‘”&strUser&”‘,'”&strPass&”‘)”    ’生成SQL语句
db=”test.mdb”    ’数据库文件名
Set conn = Server.CreateObject(“ADODB.Connection”)
connstr=”driver={Microsoft Access Driver (*.mdb)};dbq=” & Server.MapPath(db)
conn.Open connstr    ’打开数据库连接

if len(strUser)<1 or len(strUser)>20 then
strOutput=”用户名须1至20个字以内”    ’检查用户名长度
else
if len(strPass)<3 or len(strPass)>60 then
strOutput=”密码须3至60个字以内”    ’检查密码长度
else
set rs = server.CreateObject(“ADODB.Recordset”)
rs.open “Select top 1 * from user where user = ‘” & strUser & “‘”,conn,2,3    ’检查同名用户
if rs.eof then
conn.execute strSQL      ’执行SQL语句
strOutput=”注册成功”
else
strOutput=”用户已存在”
rs.close
set rs=nothing
end if
end if
end if
conn.close
set conn=nothing
response.write “aspAction=REG&aspRect=” & strOutput      ’输出结果
%>

这样我们就写好了注册功能的ASP文件,接下来,我们再创建另一个ASP文件,用来显示会员的信息,代码如下:

<%
dim parID,strUser,strPass
parID=Request.FORM(“id”)    ’获取POST数据中的PASS参数
if parID<1 then parID=0

db=”test.mdb”
Set conn = Server.CreateObject(“ADODB.Connection”)
connstr=”driver={Microsoft Access Driver (*.mdb)};dbq=” & Server.MapPath(db)
conn.Open connstr    ’打开数据库连接

set rs = server.CreateObject(“ADODB.Recordset”)
rs.open “select top 1 * from user where id = ” & parid,conn,2,3
if rs.eof then
strUser=”不存在的用户记录”
strPass=”不存在的用户记录”
else
strUser=rs(“user”)
strPass=rs(“pass”)
end if
rs.close
conn.close
set conn=nothing
response.write “aspAction=READ&aspUser=” & strUser & “&aspPass=” & strPass      ’输出结果
%>

好了,到此为止,数据库和ASP部分我们已经基本就绪了,我们现在就要开始FLASH部分的编写,说到FLASH和用户注册问题,有些事得先说一下,各位在做会员信息的时候最好还是别直接在数据库里面存下会员的密码,这样不好,呵呵,还是用些什么MD5啊之类的算法加密一下,我这里就有一代FLASH版的MD5函数,大家复制到FLASH里面就可以直接引用了,地址是http://expert.csdn.net/Expert/TopicView1.asp?id=2022597,使用方法嘛,直接用trace(md5(“password”))就可以了,哦,说到这里又得再罗索两句了,很多人问我trace是干什么,唉,不是我没耐心,这个真的很简单,就是在FLASHMX里面弹一个小窗口出来显示数据,主要是用来调试代码的,比如说看一下一个变量的值 trace(a);就是显示变量a的值咯,很简单,大家自己动手试试就知道了

好了,言归正传,准备写FLASH代码!,在我们下面要做的FLASH代码中需要同时可能不止一次的重复调用上面的两个ASP文件,所以我在上面的那个ASP文件中都写了aspAction这个变量,一个是返回“READ”字串,另一个是返回”REG”字串,这样的话我们就可以在FLASH中用共用的代码来识别哪一次ASP调用是来自哪一个功能,这样就可以让FLASH代码自己区别出来,然后分别去干相应的事情了。

好了,我们先在FLASH中创建一个关键帧(只需要一帧就可以了)和几个动态文本域和可输入的动态文本域,相关操作方法请自己读FLASHMX的相关教程(很简单的咯,实在不懂的话回帖提问吧),然后再创建三个按钮(分别用做“注册”、“上一条记录”、“下一条记录”),然后分别为它们命名:

txtUser     用来让别人输入要注册的用户名
txtPass     用来让别人输入要注册的密码
txtPrompt   用来显示是否注册成功的提示信息
txtCount    用来显示当前记录的主键值
datUser    用来显示当前记录中的用户名
datPass    用来显示当前记录中的密码

准备好上面这些之后,我们开始在第一帧中写入以下代码:
System.useCodePage=true; //提供中文支持,这样就可以从数据库或者ASP等文件中引用汉字和全角字符了
CurrentUserID=0;         //主键值变量,默认从0开始
datUser.text=””;
datPass.text=””;
UpDateCount();
function UpdateCount(){         //显示当前主键的值
txtCount.text=”ID = “ + CurrentUserID;
}
function ReadAsp(){              //LoadVars的回调函数

switch(this[“aspAction”]){
case “REG”:        //当运行的ASP中返回的aspAction是REG时,就作为用户注册信息进行处理
txtPrompt.text=this[“aspRect”];
break;
case “READ”:     //当运行的ASP中返回aspAction是READ时,就作为查看用户信息进行处理
datUser.text=this[“aspUser”];
datPass.text=this[“aspPass”];
UpDateCount();
break;
}

}
stop();

接下来我们在“注册”按钮中写下代码:

on(release){
asp=new LoadVars();
asp.onload=ReadAsp;
asp.user=txtUser.text;
asp.pass=txtPass.text;
asp.sendAndLoad(“http://thor/flashclass/userreg.asp”,asp,”POST”);
}

然后在“上一条记录”按钮中写下代码:
on(release){
if (CurrentUserID>1){
CurrentUserID–;
asp=new LoadVars();
asp.onLoad=readasp;
asp.id=CurrentUserID;
asp.sendAndLoad(“http://thor/flashclass/userread.asp”,asp,”POST”);
}
}
最后在“下一条记录”按钮中写下代码:
on(release){
CurrentUserID++;
asp=new LoadVars();
asp.onload=readasp;
asp.id=CurrentUserID;
asp.sendAndLoad(“http://thor/flashclass/userread.asp”,asp,”POST”);
}

好了,一切准备就绪了,同志们一起按CTRL+ENTER吧~“““““

在下一卷中将向大家演示如果制作能排序,分页的列表,以及链接(以软件下载系统为例)

FlashMX+ASP+Access数据库高级间接连接方法

2007年12月19日

在前面的文章已经给大家讨论了FLASH间接操作数据库的原理和基本方法(LoadVariables语句),本卷将向大家讲述比LoadVariables更强大的LoadVars对象的使用方法

/* —————————————–
闲聊:记得有次和Whose一起回答别人关于FLASH操作数据库的问题时提到了LoadVariables,在我的回答中我一时忘了LoadVariables这个语句的字母拼写,所以只写了LoarVar…,Whose就问我是不是要别人自由发挥,呵呵,其实是我自己忘了这条语句,因为我已经实在记不起来我有多久没用这条语句了,因为后来都是用LoadVars和其它方法来操作数据库了。相信大家在掌握了LoadVars之后也会扔掉LoadVariables
——————————————*/

好了,言归正传,我们现在在开始LoadVars对象之前,再次讨论一下关于ASP中的写法(其它脚本语言如此类推,如ASPX,CGI,PHP等),在前面的文章中我们已经强调了要求在ASP中去掉所有的HTML标记,也就是说不要在ASP中写下任何<html>、<body>、<B>、<A>……等,只能在ASP中写下<%和%>之间的纯ASP脚本,以保证ASP最后的运行结果是:(无空格)
变量名1=值1 & 变量名2=值2 & 变量名3=值3 & 变量名4=值4 ……

也就是说,在ASP中要保证最后的结果是每个变量名(并非ASP中的变量,而是传达到FLASH中的FLASH变量),然后再是一个等号,接着再写这个变量的值(如果这个值中需要空格的话,用+号代替),在ASP中输出结果的方法可以是
<%=”…”%>,也可以是<%Response.write “…”%>,两种方法都可以,只是随大家习惯而已,这两种方法对于经常用ASP的朋友来说再熟悉不过了,不过有一点要说明的就是我们在ASP中提倡使用<%=”…”%>的方法来输出结果,但我们现在在编写为FLASH服务的ASP文件时,我建议大家还是用<%Response.write “…”%>方法,因为在我们需要的这种ASP文件中是无任何HTML标记的,所以<%Response.write “…”%>比<%=”…”%>更直观,我们举例来说:
<%
dim a1,a2,a3,strOutput
a1=”Fireworks”
a2=”Dreamweaver”
a3=”Flash”
strOutput=”a1=” & a1 & “&a2=” & a2 & “&a3=” & a3

response.write strOutput
%>

这样的话,当FLASH装载了这个ASP的运行结果之后就会在FLASH中生成a1,a2,a3三个变量,并且自动给这三个变量赋值为”Fireworks”,”Dreamweaver”,”Flash”,然后我们就可以使用其它的FLASH语句来使用或操作这三个变量。

在大家再次熟悉了ASP的书写方法之后,我们现在就要开始LoadVars对象了,LoadVars对象的原理和LoadVariables类似,也是通过读取文本文件或者ASP等文件的结果,来给FLASH中的变量赋值,但LoadVariables没有回调功能,所以需要建立循环来判断是否已经将结果读入了FLASH,这一点是比较麻烦和低效的,在LoadVars中就不会再如此做了,因为LoadVars在读完了结果之后会自动产生事件,然后通过这个事件我们就已经知道这次的读入已经完成,而且在LoadVars中还可以实现读取进度、仅发送参数、发送参数并回调结果、仅回调结果等多种功能,并且LoadVars除了读取文本文件和ASP等文件结果之外,还另有妙用(这一功能是我瞎胡弄出来的,此功能足以让大家惊讶,呵呵,俺得先留着这个功能多卖点分才行,大家别砸我哈,下部中自然为给大家讲的)

我们先从FLASH的帮助中复制它的属性、方法和事件过来参考一下,我们在本卷中只用关心下面这些内容就行了:

代码类型 说明
LoadVars.load方法 从指定的 URL 下载变量。
LoadVars.send方法将变量从 LoadVars 对象发布到 URL。
LoadVars.sendAndLoad方法 将变量从 LoadVars 对象发布到 URL,并将服务器的响应下载到目标对象。

LoadVars.onload事件当LoadVars对象完成 load 或 sendAndLoad 等操作时产生。

我们在使用这些方法和事件之前需要先将LoadVars实例化,代码如下:
ASP=new LoadVars();//格式是:实例名=new LoadVars();<–此例中我用的实例名是ASP(实例名的命名和变量名相同,呵呵,顺便告诉大家,在FLASHMX6,可以用中文的变量名和实例名,呵呵,好玩吧,比如说:后台=new LoadVars();)
好了,我们现在已经创建了一个LoadVars对象的实例,实例名称用的是”ASP”,接下来我们开始研究LoadVars的三种方法Load,Send和SendAndLoad:
我们从第一种方法开始,Load的功能是不向ASP发任何参数,直接运行ASP,并将ASP的运行结果收入FLASH;
而第二种方法是首先将参数发向ASP,然后打开ASP文件页面,并执行它,这样的话,我们可以用FLASH做些比如论坛登陆窗口之类的东东
最后第三种方法SendAndLoad也就是我们以后做全版FLASH网站时要经常使用的方法,它是首先将参数发给ASP,然后执行ASP并将执行结果读回到FLASH中来。
注意:Load和SendAndLoad中运行ASP文件时,访问者并不会看到ASP的页面(可以说是后台运行的)

三种方法的代码编写基本类似,由于篇幅字数的限制,我们只讨论其中的SendAndLoad方法,此方法需下面这些步骤完成:
第1步:LoadVars实例化
第2步:添加ASP所需参数
第3步:设置回调函数
第4步:使用SendAndLoad指令

第1步在上面我们已经说过了,现在我们来说一下第2步。所谓的“添加ASP所需参数”也就是一些ASP中,如用户登录信息验证,分类数据列表等等都需要从POST或者GET中获取相关参数,如果要在ASP中获取POST参数的话,用Request.FORM(“参数名”)就可以了,如果是要在ASP中获取GET参数的话,那就得用Request.QueryString(“参数名”),例如下面的ASP代码:
<%
‘检查用户登录 – GET方法参数
dim strUser,strPass,strOutput
strUser=Request.QueryString(“user”)
strPass=Request.QueryString(“pass”)

if strUser=”THOR” and strPass=”abc” then
strOutPut=”Yes”
else
strOutput=”No”
end if
response.write “aspRect=” & strOutput
‘本例只是演示参数的使用,所以没用到数据库,当然在正式的项目应用中的用户登录参数,大家可千万别用GET方法的参数,得用POST才行
%>

我们接着开始在FLASH中为这个ASP写添加参数的代码
function ReadAspRect(){//创建一个名称为ReadAspRect的函数,此函数将用来分析ASP的返回结果
trace(this[“aspRect”]);//弹一个窗口出来显示aspRect变量的值
}

ASP=new LoadVars();//创建一个名称叫做ASP (当然也可以用其它名称) 的LoadVars对象实例
ASP.user=”THOR”;//添加一个值为”THOR”的参数,参数名是user,对应ASP中的user参数
ASP.pass=”abc”;//添加一个值为”abc”的参数,参数名是pass,对应ASP中的pass参数
ASP.OnLoad=ReadAspRect;//设置回调函数为ReadAspRect,当ASP结果装载完毕时,FLASH会自动运行ReadAspRect函数
ASP.sendAndLoad(“ASP文件地址”,ASP,”GET”);//使用GET方法发送参数,并从ASP中返回其运行结果

大家看到这里应该已经了解了LoadVars对象的基本用法,我们在下一卷中将向大家详细举例LoadVars对象的中文、数据库操作以及相关经验和技巧~“`

FlashMX+ASP+Access数据库连接方法

2007年12月19日

首先我们要先写好操作数据库的ASP脚本,然后再使用FLASHMX来读取ASP的运行结果(注意:这里仅仅只是需要ASP的运行结果而已,所以需要在ASP中去除一切无用的Html标记),我们先来掌握一下专为FlashMX提供数据的ASP的编写方法。ASP部分提供数据时应保证最后的运行结果应为:

变量名1=值1&变量名2=值2&变量名3=值3…

这样的话就相当于ASP部分为FlashMX中的变量进行赋值,当FlashMX中接收到数据之后便可以直接引用这些变量的值(注意:多个变量时,每个变量之间应用&号隔开!)
我们先以下面这段非常简单的程序为例:
文件名: Test.asp
<%=”aspRect=Hello! Macromedia FlashMX 6.0″%>
或者写成:
<%
Response.write “aspRect=Hello! Macromedia FlashMX 6.0”
%>

这两种写法的功能是相同的,各位熟悉ASP的朋友看过这段代码后也许忍不住会问:“那不就相当于直接在页面中写aspRect=Hello! Macromedia FlashMX 6.0么?,呵呵,对,如果你直接在页面中写这句,FlashMX也是可以读到的,这也就是FlashMX读取文本文件的方法.

言归正传,我们现在已经完成了ASP部分的代码,然后我们再来准备编写FLASHMX部分的数据接收代码……
在FLASH中可以接收数据的语句有很多,我们主要推荐两种,一个是LoadVariables语句,另一个是LoadVars对象,本卷将向大家讲解LoadVariables语句的使用。

LoadVariables语句由于在读取数据时没有回调功能,也就是无法产生数据接收完毕的事件,所以,我们需要建立一个循环来判断是否接收到了数据,我们以下面这代码为例
文件名: Test.fla
在FLASHMX的默认场景中创建4个关键帧,
第1个关键帧的代码如下:
loadVariables(“http://127.0.0.1/test.asp”,_root,”GET”);
//Loadvariables的第1个参数为ASP文件名,也就是刚才我们写的那个
//Loadvariables的第2个参数为接收对象,也就是将在哪个对象中创建变量
//Loadvariables的第3个参数为”GET”或者”POST”,在此语句中建议使用GET方法
第2个关键帧的代码为空
第3个关键帧的代码如下:
if(aspRect ne “”){
/*如果变量aspRect的值不为空,也就是已经接收到了数据则转向第4帧*/
gotoAndPlay(4);
}
else{
/*如果变量aspRect的值为空,也就是还没有接收到数据则转向第2帧*/
gotoAndPlay(2);
}
第4个关键帧的代码如下:
trace(aspRect);//显示变量aspRect的值
stop();

这样我们就可以在FLASHMX中获取到ASP中的数据,ASP的代码经过改进之后更可以完成比较复杂的应用。假设我们现在有一个Access 2000的数据库,其中有一个User的数据表,这个数据表中由以下字段和记录

记录\字段id(主键)user(文本)sex(逻辑)
—————————————————————————————–
1thortrue
2csdnfalse
假设我们现在要在FLASH中通过指定ASP的参数来获取ID为1或者ID为2的记录中的USER字段值或者SEX字段值的话,我们可以这样来做:
ASP部分:文件名Test.asp
<%
dim conn,rs,db,connstr
db=”数据库文件名”
Set conn = Server.CreateObject(“ADODB.Connection”)
Server.MapPath(db)
connstr=”driver={Microsoft Access Driver (*.mdb)};dbq=” & Server.MapPath(db)
conn.Open connstr’建立数据库连接

dim parID,strSQL,AspUser,AspSex
parID=Request.QueryString(“ID”)’获取ASP参数ID
strSQL=”select top 1 * from user where id = ” & parID
Set rs=Server.CreateObject(“ADODB.RecordSet”)
rs.open strSQL,conn,2,3
if rs.eof then
AspUser=”无此记录”
AspSex=”无此记录”
else
AspUser=rs(“user”)
AspSex=rs(“sex”)
end if
rs.close
conn.close
response.write “AspUser=” & AspUser & “&AspSex=” & AspSex
%>
FlashMX部分:
详细代码省略,大家对照上面的FLASH代码改改就行了,把第一帧的代码改为loadVariables(“http://127.0.0.1/test.asp?id=1″,_root,”GET”);
然后把所有的aspRect改为AspUser或者AspSex,最后第4帧的代码改为
trace(AspUser);
trace(AspSex);
大家玩到这里的时候应该明白了FLASHMX的Loadvariables的用法了,熟悉ASP的朋友再稍稍变更一下ASP的代码就能完成功能稍稍复杂一点的应用了,不过Loadvariables由于没有回调功能以及相关功能上的限制,这条语句我已经很久没用了,将向大家介绍功能更强大的LoadVars的用法,相信大家在掌握了LoadVars之后也会跟我一样扔掉Loadvariables语句 .

😛