2005年09月08日

新建一个600*600的文档

新建一个图层,填充上黑色

选择“滤镜-渲染-镜头光晕”,亮度:115,镜头类型:35毫米聚焦

注意:一定要将光晕中心放在中间的位置

attachments/200507/27_155342_1.gif



现在选择“滤镜-艺术效果-塑料包装”,设置如下


高光强度:20,细节:15,平滑度:3

复制这个图层,将图层混合模式设置为叠加

按CTRL+U,调节色相/饱和度,选中“着色”,色相:100,饱和度:200,亮度:0

蓝色魔圈效果就完成了。

attachments/200507/27_155357_2.gif

新建一个500×500的文件
将前景色和背景色设置为默认的黑色和白色

选择“滤镜-渲染-云彩”

选择“滤镜-模糊-动感模糊”,设置角度:0,距离:999

选择“滤镜-风格化-查找边缘”

复制图层
选择“编辑-变换-旋转90度(顺时针)”,将图层混合模式改为变暗。

合并两个图层
选择“滤镜-风格化-照亮边缘”,按照以下设置
边缘宽度:1,边缘亮度:20,平滑度:3
选择“图像-调整-亮度/对比度”,对比度:+40

选择“图像-调整-色相/饱和度”
选中“着色”,色相:180,饱和度:100,亮度:0

选择“编辑-变换-透视”,按住下面的节点向外拖动,产生透视的效果

attachments/200507/26_180304_1.gif


复制图层

选择“滤镜-模糊-高斯模糊”,半径:4.4

设置图层混合模式为滤色

合并图层

选择“滤镜-渲染-光照效果”
按下图进行设置

attachments/200507/26_180320_2.gif


效果就完成了

attachments/200507/26_180331_3.gif
[最后修改由 candy, 于 2005-07-26 18:04:31]
2005年09月07日

loadVariables()

loadVariablesNum()

用法

loadVariables ("url" , target [, variables])
loadVariablesNum ("url" ,level [, variables])

区别:
太理论的东西我就不讲了,大家都知道FLASH里有层级(level),也有影片剪辑(MC)那么:
·如果你想让FLASH读取到的数据放到某个影片剪辑中,那你就用第一个loadVariables
·如果你想让FLASH读取到的数据放到某个特定的级别,那你就用第二个loadVariablesNum

FLASH4就有的语法,这个函数的功能就是从外部文件(例如文本文件,或由 CGI 脚本、Active Server Page (ASP)、PHP 或 Perl 脚本生成的文本)中读取数据,并设置目标影片剪辑中变量的值。此动作还可用于使用新值更新活动 SWF 文件中的变量。

举例说明:

1、我们先准备一个 TXT记事本。在里面写以下内容:

t_name=tommyheng&t_age=25岁&t_from=辽宁沈阳

解释:上面的文本内容我定义了3个变量 t_name  t_age  t_from 并且分别让给他们赋予了一个值。而且中间用了 & 分隔开了,不明白的朋友就会问了?用&分开是啥意思?那我就来告诉你,FLASH读取外部数据,当外部数据被程序载入的时候,FLASH会自动根据 & 来 分割数据 也就是说 上面文本里的东西如果被FLASH读取到,FLASH就自动认识它们是3个变量。 

2、我们新建一个FLASH文件,在第一个桢写上:

loadVariables("tommyheng.txt", "_root");
或者(选一个就行,别2个都写哦)
loadVariablesNum("tommyheng.txt", 0);

解释:用2种方法把tommyheng.txt载入到FLASH中。
第一种方法:把文本中的数据载入到FLASH的主场景中(_root 其实就是FLASH的主场景,当然,如果你想把数据放到FLASH中的某个MC中,你可以把它修改成,_root.mc意思就是载入到主场景中的一个叫做MC的影片剪辑)
第二种方法:把文本中的数据载入到FLASH的场景中的第0个级别

然后,在第5桢处插入一个关键空白桢,里面写
trace(t_name);
trace(t_age);
trace(t_from);
stop();
解释:trace()是FLASH里是一个信息输出函数,在制作FLASH的时候,开发者可以通过这个函数,把程序返回的结果(变量)直接输出来观察运行的是否正确等等,但是它只能在FLASH里使用(也就是说按CTRL+ENTER的时候)你才能看到它的功能。
把FLASH和tommyheng文本保存到同一个文件夹中。按CTRL+ENTER直接测试影片
你会发现会输出一下结果:
tommyheng
25
辽宁沈阳
如果你想把这些结果显示到文本框中,而不是输出来看,那可以又2种方式:
第一种方式:直接分配方式

就是直接做3个动态文本框,分别点选每个文本框,在其属性中找到变量,并分别填写:
    t_name    t_age    t_from

第二中方式:自定分配方式

同样建立3个动态文本框,但是不同的是,分别点选每个文本框,在其实例名称处分别填写随便的3个名字 比如:a1 a2 a3
然后在这桢上写如下程序:

a1.text = t_name
a2.text = t_age
a3.text = t_from


这样FLASH就完成了读取外部数据的功能!!!

特别提示:
某些朋友根据我的文件进行测试或者学习,会出现一个问题,那就是英文和数字显示很正常,但是中文就显示不正常变正了乱码(这个是编码问题,很高难的哦)。不要怕,我们有办法对付它,在第一桢处写上
System.useCodepage=true;
这句话的意思就是让FLASH认识中文(嘿嘿),按照理论上讲就是让FLASH使用运行播放器的操作系统的传统代码页来解释外部文本文件。

本讲结束语:
虽然我只写了FLASH读取文本TXT文件,但是它同样试用其他的格式文件的读取。如果你愿意,你可以把文件的扩展名修改成 .dat  甚至你可以把它修改成 .tommyheng  还有,也可以是ASP了。不过如果想读取ASP 那你必须要会ASP哦。起码把要ASP的输出结果也是t_name=tommyheng&t_age=25岁&t_from=辽宁沈阳
从此我们不难看出,其实FLASH读取什么都无所谓,重要的一点,这个文件输出来的东西要能被FLASH认识 也就是 被 & 分开来的变量格式

LoadVars 类

不要因为下面的文字太多而不看,如果你仔细的看过,如果你对是没有学过程序的朋友,那么看完一下的部分,你就已经迈入了程序海洋的一步……

说明

LoadVars 类是 loadVariables() 函数的替代方法,用于在 Flash 应用程序和服务器之间传输变量。

用法: new LoadVars();

几句废话:可能有些朋友程序基础很差,一看到new LoadVars();就糊涂了。觉得很不直观,不知道它是做什么的。那我来解释几句“这个东西是传说中的对象。什么叫做对象呢?举个例子,它好比是一个盒子。不同的对象就像不同的颜色和属性的盒子,每个盒子里有每个盒子的特点,它能做某些只有它才能完成的特定工作,而且它还能帮你放很多东西在里面。我们目前用的这个new LoadVars();就是专门操作外部数据的盒子,他能加载、发送、装载数据。所以我们可以通过这个对象进行加载、发送、装载数据,并且可以到这个对象中去得到我们所需要的数据!

 

举例说明:

1、我们先准备一个 TXT记事本。在里面写以下内容(tommyheng.txt):

t_name=tommyheng&t_age=25岁&t_from=辽宁沈阳

解释:上面的文本内容我定义了3个变量 t_name  t_age  t_from 并且分别让给他们赋予了一个值。而且中间用了 & 分隔开了,不明白的朋友就会问了?用&分开是啥意思?那我就来告诉你,FLASH读取外部数据,当外部数据被程序载入的时候,FLASH会自动根据 & 来 分割数据 也就是说 上面文本里的东西如果被FLASH读取到,FLASH就自动认识它们是3个变量。 

2、我们新建一个FLASH文件,在第一个桢写上:

举例说明:

1、我们先准备一个 TXT记事本。在里面写以下内容(tommyheng.txt):

t_name=tommyheng&t_age=25岁&t_from=辽宁沈阳

解释:上面的文本内容我定义了3个变量 t_name  t_age  t_from 并且分别让给他们赋予了一个值。而且中间用了 & 分隔开了,不明白的朋友就会问了?用&分开是啥意思?那我就来告诉你,FLASH读取外部数据,当外部数据被程序载入的时候,FLASH会自动根据 & 来 分割数据 也就是说 上面文本里的东西如果被FLASH读取到,FLASH就自动认识它们是3个变量。 

2、我们新建一个FLASH文件,在第一个桢写上:

System.useCodepage = true;
//防止中文出现乱码
var myload = new LoadVars();
//var 在FLASH的程序中用于声明变量
//这里 我们声明了一个加做myload的数据类对象
//它可以用来发送、接收、装载、处理数据。
myload.onLoad = function(success) {
//介绍一下这里
//onLoad是LoadVars()下的一个事件处理函数,它的作用是当 LoadVars.load() 或
// LoadVars.sendAndLoad() 操作结束时调用。如果该操作成功,my_lv 将填充为
//该操作所下载的变量,而这些变量将在调用此处理函数时变为可用。
//也就是说:这个函数的功能是在载入数据文件后,可以通过这个函数,将数据
//文件中的所有数据放入对象中,这样可以让我们随时使用
//参数success 该参数指示加载操作是成功完成 (true) 还是以失败结束 (false)。
//(如果我们成功的载入了数据文件,那么它就返回一个true值,代表成功,
//反之,就返回一个false值,代表栽入失败。失败的原因可能是因为数据文件
//tommyheng.txt文件不存在或者路径错误,如果你载入的是ASP等文件,失败
//的原因可能是网络错误)

 if (success) {
//这里就用if判断一下success返回的是true还是false
//如返回的值是true说明我们载入文件成功
//到此,myload对象已经把tommyheng.txt文件载入到对象里
//下面我们就可以对其中的数据任意的宰割了!挖哈哈……

  trace("载入成功!");
  trace(myload.t_name)
  trace(myload.t_age)
  trace(myload.t_from)
//用trace把我们刚刚的实验结果显示出来,看看我们实验结果
  a1.text = myload.t_name
  a2.text = myload.t_age
  a3.text = myload.t_from
//把数据分别分配到场景中a1  a2  a3这3个动态文本框中显示出来
 } else {
  trace("载入失败!");
//反之,如返回的值是false说明我们载入文件失败了!555
//gotoAndStop("shibai")
//如果失败,你可以让程序跳到一个提前设计好的桢,这里显示信息载入失败信息
 }
};

myload.load("tommyheng.txt")
//用我们的对象去载入数据文件
//=====================================================================

小结:

至此,一个简单的,用对象载入数据的例子我就介绍完了。至于用对象载入数据的优点上面的程序至少可以说明,我们可以判断数据是否真正被载入了,而这个只不过是个读取载入数据的部分而已,他只不过是loadvars对象的一个小功能而已哦!!!

下面开始讲如何用FLASH对外发送数据

以下内容我们开始采用ASP程序做数据文件
(因为txt文本格式的文件不可能实现接收数据的功能,它最多只能被FLASH读取和载入而已)

其实,用FLASH发送数据给ASP等这样的程序有很多!有很多FLASH的计数器,留言本,游戏,等等大家都是见过的。以前我们不懂,觉得它很高难,那么通过我们下面的讲解,你就不会觉得这些东西那么神秘了!

LoadVars.send()

用这个东西就可以实现了。它怎么用呢?我们继续举例子说明它的实现方法!!!

代码如下:


FLASH:
先建立一个名字为btn的按纽,
然后在场景中分别建立3个输入性文本框,名字分别为  t_name   t_age   t_from
然后在桢上写如下语句:

mybtn.onRelease = function() {
 var my_send = new LoadVars();

 my_send.t_name = t_name.text;
 my_send.t_age = t_age.text;
 my_send.t_from = t_from.text;
//上面3行是要发送的数据

 my_send.send("http://10.16.0.4/flash/send.asp", "_self","post");
};

ASP代码:
<%
set conn=server.CreateObject ("adodb.connection")
dbpath=server.MapPath ("db1.mdb")
‘Response.Write dbpath
connstr="Driver={Microsoft Access Driver (*.mdb)};dbq="&dbpath
conn.Open connstr

dim t_name, t_age, t_from
‘读FLASH传递过来的数据
t_name=request.form("t_name")
t_age=request.form("t_age")
t_from=request.form("t_from")

‘写FLASH传递过来的数据
response.Write ("<li>t_name="& t_name)
response.Write ("<li>t_age="& t_age)
response.Write ("<li>t_from="& t_from)
response.Write ("<li>mystr="& mystr)

‘写入数据库

set rs=server.CreateObject ("adodb.recordset")
sql="insert into usertab(t_name,t_age,t_from)values(‘"&t_name&"’,'"&t_age&"’,'"&t_from&"’)"
rs.open sql,conn,3,3

%>
这样 就把FLASH里文本框中的数据发送到ASP中 并且ASP写入到数据库中了!

2005年08月31日


Macromedia家族新成员——Macromedia Studio 8预计将在九月中旬上市,现在可以通过Macromedia的在线商店预购。详情请参阅《Macromedia Studio 8开始网上预订送背包》。

Macromedia Studio 8 家族成员包括:

Dreamweaver 8

Flash Professional 8

Fireworks 8

Contribute

Flash Paper

图形与网页设计者使用Flash创建网页动画或其它网页内容已经有许多年的历史,这些生动的内容为用户提供了更丰富的网络浏览体验。然而即使在今天宽带如此普及的情况下,一些体积较大的文件经常会需要较长的下载时间,这是现在的Internet用户所不愿忍受的。于是Macromedia在新版本的Flash 8中引入了几种高级技术,使得即使是内容较多的动画在最终完成时也只生成较小的文件。下面介绍一下新版的Flash 8中几大重要的新功能。

一、实时渲染滤镜

其中一种非常棒的技术是,Macromedia减轻了Flash Player 8的渲染工作,在Flash文件中使用标签,Flash Player 8现在可以在用户与Flash文件交互时实时渲染滤镜。

这意味着Macromedia已经能够合并内建的滤镜效果,象阴影、模糊、内外发光、倒角、渐变倒角、颜色调整,以获得更丰富的用户体验。这些滤镜或可视效果能够被应用到影片剪辑(MovieClips)和文本域,当在网页中运行时,通过播放器渲染并显现出来。

二、运行时位图缓冲

Macromedia通过另外的方式将Flash和Flash player捆绑在一起以提高性能。另一种新功能叫做位图缓冲,允许设计者将任何影片剪辑符号指定为一个位图,在使用Flash player运行时获得缓冲,以提高影片播放速度。

影片剪辑符号可以使用属性检查器或ActionScript指定为位图,这些指令在运行时传给播放器,节省了通常情况下处理器用来计算矢量图形的时间。

即便对象作为位图被缓冲,对象的矢量数据仍然被保留了下来,允许设计者在任何时候将其转换回矢量对象。

三、FlashType字体渲染引擎

Flash 8同时允许用户使用FlashType字体渲染引擎对字体作更多的控制。FlashType允许设计者对字体拥有与Flash项目中其它元素同样多的控制。

Flash包含字体渲染的预置,为动画文本提供等同于静态文本的高质量优化。新的渲染引擎使得文本即使使用较小的字体看上去也会更加清晰,这一功能是Flash的一大重要改进。

四、自定义淡入淡出功能

动画设计者将会享受新的自定义淡入淡出功能所带来的乐趣,这一功能允许设计者直观地控制所有的动作补间属性。新增的曲线图功能提供对位置、旋转、大小、颜色及滤镜的独立控制,使用它能够精确控制动画对象的速率。

五、全新的视频编码技术

Macromedia在以前版本的Flash中,就已经试图通过引入Flash视频来扩展交互式Web体验。Flash 8继续这一目标,采用了一种新的视频编码,并扩展了面向Web的视频解码选项。

除了在Flash Player中加入新的视频解码器之外,Macromedia同时在Flash Professional中加入了一个独立的视频解码器。设计者现在可以选择使用Sorenson Spark编码或新的On2 VP6编码。新的On2 VP6编码的目标是在提供一种丰富的交互式体验的同时使文件大小保持最小,与Apple支持的视频编码H-264类似。

新的视频工具也为开发者提供了优化视频内容质量和文件大小的高级选项。

在Flash 8中的视频现在允许将提示点嵌入自定义metadata(元数据),使用嵌入的提示点,图形或动画的事件能够在播放期间动态触发。

使用新的On2 VP6编码,开发者能够解码视频中的一个8位Alpha通道,这个Alpha通道可实时合成到任何其它Flash内容之上。覆盖的视频以透明或半透明Alpha通道的方式合成。

现在在一个对话框中有一个集中的视频工作流程,这个对话框提供所有配置Flash视频所能够用到的选项,不管它是Flash Communication Server流视频,还是通过HTTP或其它方式下载的外部FLV文件。

六、其它引人注目的功能

此外Flash 8还有一些比较吸引人注意的新功能,在此列举如下。

SWF元数据

脚本助手(以前叫做“普通模式”)

对象绘制模型

交互式Mobile设备模拟器

改进的视频播放组件

增强的文本工具

增强的描边属性

高级渐变控制

多SWF打包发布成EXE问题?
多SWF打包发布成EXE问题?

做一个FLASH中有 index.swf 1.swf 2.swf 3.swf 4.swf 5.swf 6.swf 7.swf 8.swf 9.swf 这样10个SWF文件 其中index.swf 有调用 其它的SWF文件..

我想把他们发布成一个 EXE 文件请问我应该怎么做?

我想要的最终效果是.10个swf打包成一个 .exe 文件.能正常调用执行.

这种功能用flash是不好做的,当然要使用第三方软件。

不过这个软件很普及,几乎人人都用——WINRAR!! 怎么做?跟我来——

1、准备好你的所有swf文件和一个你中意的ICO图标文件——它就是你打包后的图标。

按此在新窗口浏览图片
我这里,main.swf是主文件(最好用flash player 导成exe 文件,但是…),其它是main调用的文件。

2、选中所有文件,右击选择"winrar 添加到压缩文件…"

按此在新窗口浏览图片

把A选中,在B处写上你EXE文件的名字

3、更改设置

按此在新窗口浏览图片

选C——点D——出现下图

按此在新窗口浏览图片

在常规里设置好,解压后调用的主文件名。(很关键,名字不要错,注意选解压后的!!)

再选择“模式”标签,E——F——G 一个都不能少,

这里设置文件的解压到"临时文件夹",过程中不出现任何提示窗,复盖旧文件(也是为防止出现提示的)
按此在新窗口浏览图片

再选择“文本和图标”标签,设好图标

按此在新窗口浏览图片

4、开始压缩吧!!

压缩后的文件图标是自定义的,解压到机子的临时文件夹(中间不会出现任何的窗口或提示!!),解压后自动调用main文件。

使用时就像是双击了我们的压缩文件直接执行main文件的感觉一样(当然这与你机子的性能和文件大小有相当关系,否则会等相当一段时间才会开始)!!!如果你把FLash Player的图标导入,加在压缩文件里……会和真的播放器一样的,以假乱真!!

再没有多个swf文件烦心了。而且在关闭显示文件后,临时文件夹中的内容会全部删!!开心。

5、但是——这种方法极意被恶意者利用,比如在里面加上一个木马软件,先期调用了,而我们只看flash去了,也不晓得…………后果……
在EXE属性里可以看到压缩文件的注释,如果里面写明了调用EXE文件……就有些可疑!如果是我,不会冒然使用的。


6、声明
请不要利用这个东东搞&*#$@……
请不要不查毒直接调用不明EXE文件……
请不要想用这种方法保护作品,一点做用不起……
但是压缩时加上密码,也是一种防君子偷偷使用的一种方法。

2005年08月15日

 表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。

  Validator是基于javascript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类,所以在调用时不需要实例化,直接以"类名+.语法+属性或方法名"来调用。此外,Validator还提供3种不同的错误提示模式,以满足不同的需要。

  Validator目前可实现的验证类型有:

  1.是否为空;
  2.中文字符;
  3.双字节字符
  4.英文;
  5.数字;
  6.整数;
  7.实数;
  8.Email地址;
  9.使用HTTP协议的网址;
  10.电话号码;
  11.货币;
  12.手机号码;
  13.邮政编码;
  14.身份证号码;
  15.QQ号码;
  16.日期;
  17.符合安全规则的密码;
  18.某项的重复值;
  19.两数的关系比较;
  20.判断输入值是否在(n, m)区间;
  21.输入字符长度限制(可按字节比较);
  22.对于具有相同名称的单选按钮的选中判断;
  23.限制具有相同名称的多选按钮的选中数目;
  24.自定义的正则表达式验证;

  运行环境(客户端):

  在Windows Server 2003下用IE6.0+SP1和Mozilla Firefox 1.0测试通过;
  在Lunix RedHat 9下的Netscape测试通过;

  对于客户端的表单验证,这个基于javascript编写的Validator基本上都可以满足,具体可以下载CHM文件:
  Validator.CHM下载

  

 <title>表单验证类 Validator v1.0</title>
<style>
body,td{font:normal 12px Verdana;color:#333333}
input,textarea,select,td{font:normal 12px Verdana;
   color:#333333;border:1px solid #999999;background:#ffffff}
table{border-collapse:collapse;}
td{padding:3px}
input{height:20;}
textarea{width:80%;height:50px;overflow:auto;}
form{display:inline}
</style>
<table align="center">
<form name="theForm" id="demo" action="" method="get"
  onSubmit="return Validator.Validate(this,2)">
<tr>
<td>真实姓名:</td><td><input name="Name" dataType="Chinese"
     msg="真实姓名只允许中文"></td>
</tr>
<tr>
<td>英文名:</td><td><input name="Nick" dataType="English" require="false"
               msg="英文名只允许英文字母"></td>
</tr>
<tr>
<td>主页:</td><td><input name="Homepage" require="false"
              dataType="Url" msg="非法的Url"></td>
</tr>
<tr>
<td>密码:</td><td><input name="Password" dataType="SafeString"
                msg="密码不符合安全规则" type="password"></td>
</tr>
<tr>
<td>重复:</td><td><input name="Repeat" dataType="Repeat"
                to="Password" msg="两次输入的密码不一致" type="password"></td>
</tr>
<tr>
<td>信箱:</td><td><input name="Email" dataType="Email" msg="信箱格式不正确"></td>
</tr>
<tr>
<td>信箱:</td><td><input name="Email" dataType="Repeat" to="Email"
                 msg="两次输入的信箱不一致"></td>
</tr>
<tr>
<td>QQ:</td><td><input name="QQ" require="false" dataType="QQ"
                msg="QQ号码不存在"></td>
</tr>
<tr>
<td>身份证:</td><td><input name="Card" dataType="IdCard"
                  msg="身份证号码不正确"></td>
</tr>
<tr>
<td>年龄:</td><td><input name="Year" dataType="Range"
                 msg="年龄必须在18~28之间" min="18" max="28"></td>
</tr>
<tr>
<td>年龄1:</td><td><input name="Year1" require="false" dataType="Compare"
            msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"></td>
</tr>
<tr>
<td>电话:</td><td><input name="Phone" require="false"
                 dataType="Phone" msg="电话号码不正确"></td>
</tr>
<tr>
<td>手机:</td><td><input name="Mobile" require="false"
                dataType="Mobile" msg="手机号码不正确"></td>
</tr>
<tr>
<td>生日:</td><td><input name="Birthday" dataType="Date" format="ymd"
                 msg="生日日期不存在"></td>
</tr>
<tr>
<td>邮政编码:</td><td><input name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$"
                   msg="邮政编码不存在"></td>
</tr>
<tr>
<td>邮政编码:</td><td><input name="Zip1" dataType="Zip" msg="邮政编码不存在"></td>
</tr>
<tr>
<td>操作系统:</td><td><select name="Operation" dataType="Require"
   msg="未选择所用操作系统" ><option value="">选择您所用的操作系统
   </option><option value="Win98">Win98</option>
   <option value="Win2k">Win2k</option><option value="WinXP">WinXP</option>
   </select></td>
</tr>
<tr>
<td>所在省份:</td><td>广东<input name="Province" value="1" type="radio">
              陕西<input name="Province" value="2" type="radio">  
              浙江<input name="Province" value="3" type="radio">
              江西<input name="Province" value="4" type="radio"
              dataType="Group" msg="必须选定一个省份" ></td>
</tr>
<tr>
<td>爱好:</td><td>运动<input name="Favorite" value="1" type="checkbox">
            上网<input name="Favorite" value="2" type="checkbox">
            听音乐<input name="Favorite" value="3" type="checkbox">
            看书<input name="Favorite" value="4" type="checkbox""
           dataType="Group" min="2" max="3" msg="必须选择2~3种爱好"></td>
</tr>
<td>自我介绍:</td><td><textarea name="Description" dataType="Limit"
     max="10" msg="自我介绍内容必须在10个字之内">中文是一个字
   </textarea></td>
</tr>
<td>自传:</td><td><textarea name="History" dataType="LimitB" min="3"
    max="10" msg="自传内容必须在[3,10]个字节之内">
    中文是两个字节t</textarea></td>
</tr>
<tr>
<td colspan="2"><input name="Submit" type="submit" value="确定提交">
    <input onClick="Validator.Validate(document.getElementById('demo'))
  " value="检验模式1" type="button">
   <input onClick="Validator.Validate(document.getElementById('demo'),2)
   " value="检验模式2" type="button">
    <input onClick="Validator.Validate(document.getElementById('demo'),3)
  " value="检验模式3" type="button"></td>
</tr>
</form>
</table>
<script>
/*************************************************
    Validator v1.0
    cody by 我佛山人
    wfsr@cunite.com
    http://www.cunite.com
*************************************************/
Validator = {
    Require : /.+/,
    Email : /^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/,
    Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
    Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,
    Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
    IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
    Currency : /^\d+(\.\d+)?$/,
    Number : /^\d+$/,
    Zip : /^[1-9]\d{5}$/,
    QQ : /^[1-9]\d{4,8}$/,
    Integer : /^[-\+]?\d+$/,
    Double : /^[-\+]?\d+(\.\d+)?$/,
    English : /^[A-Za-z]+$/,
    Chinese : /^[\u0391-\uFFE5]+$/,
    UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\
           ?\\\/\'\"]*)|.{0,5})$|\s/,
    IsSafe : function(str){return !this.UnSafe.test(str);},
    SafeString : "this.IsSafe(value)",
    Limit : "this.limit(value.length,getAttribute('min'),
           getAttribute('max'))",
    LimitB : "this.limit(this.LenB(value), getAttribute('min'),
            getAttribute('max'))",
    Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
    Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
    Range : "getAttribute('min') < value && value < getAttribute('max')",
    Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
    Custom : "this.Exec(value, getAttribute('regexp'))",
    Group : "this.MustChecked(getAttribute('name'), getAttribute('min'),
          getAttribute('max'))",
    ErrorItem : [document.forms[0]],
    ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
    Validate : function(theForm, mode){
        var obj = theForm || event.srcElement;
        var count = obj.elements.length;
        this.ErrorMessage.length = 1;
        this.ErrorItem.length = 1;
        this.ErrorItem[0] = obj;
        for(var i=0;i<count;i++){
            with(obj.elements[i]){
                var _dataType = getAttribute("dataType");
                if(typeof(_dataType) == "object"
             || typeof(this[_dataType]) == "undefined") continue;
                this.ClearState(obj.elements[i]);
                if(getAttribute
         ("require") == "false" && value == "") continue;
                switch(_dataType){
                    case "Date" :
                    case "Repeat" :
                    case "Range" :
                    case "Compare" :
                    case "Custom" :
                    case "Group" :
                    case "Limit" :
                    case "LimitB" :
                    case "SafeString" :
                        if
                       (!eval(this[_dataType]))    
                      {
                 this.AddError(i, getAttribute("msg"));
                        }
                        break;
                    default :
                        if
                    (!this[_dataType].test(value)){
                this.AddError(i, getAttribute("msg"));
                        }
                        break;
                }
            }
        }
        if(this.ErrorMessage.length > 1){
            mode = mode || 1;
            var errCount = this.ErrorItem.length;
            switch(mode){
            case 2 :
                for(var i=1;i<errCount;i++)
                    this.ErrorItem[i].style.color
                                = "red";
            case 1 :
                alert(this.ErrorMessage.join("\n"));
                this.ErrorItem[1].focus();
                break;
            case 3 :
                for(var i=1;i<errCount;i++){
            try{
                var span = document.createElement("SPAN");
                span.id = "__ErrorMessagePanel";
                span.style.color = "red";
                this.ErrorItem[i].parentNode.appendChild(span);
                span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
                    }
                    catch(e){alert(e.description);}
                }
                this.ErrorItem[1].focus();
                break;
            default :
                alert(this.ErrorMessage.join("\n"));
                break;
            }
            return false;
        }
        return true;
    },
    limit : function(len,min, max){
        min = min || 0;
        max = max || Number.MAX_VALUE;
        return min <= len && len <= max;
    },
    LenB : function(str){
        return str.replace(/[^\x00-\xff]/g,"**").length;
    },
    ClearState : function(elem){
        with(elem){
            if(style.color == "red")
                style.color = "";
            var lastNode = parentNode.childNodes
                     [parentNode.childNodes.length-1];
            if(lastNode.id == "__ErrorMessagePanel")
                parentNode.removeChild(lastNode);
        }
    },
    AddError : function(index, str){
        this.ErrorItem[this.ErrorItem.length]
              = this.ErrorItem[0].elements[index];
        this.ErrorMessage[this.ErrorMessage.length]
              = this.ErrorMessage.length + ":" + str;
    },
    Exec : function(op, reg){
        return new RegExp(reg,"g").test(op);
    },
    compare : function(op1,operator,op2){
        switch (operator) {
            case "NotEqual":
                return (op1 != op2);
            case "GreaterThan":
                return (op1 > op2);
            case "GreaterThanEqual":
                return (op1 >= op2);
            case "LessThan":
                return (op1 < op2);
            case "LessThanEqual":
                return (op1 <= op2);
            default:
                return (op1 == op2);
        }
    },
    MustChecked : function(name, min, max){
        var groups = document.getElementsByName(name);
        var hasChecked = 0;
        min = min || 1;
        max = max || groups.length;
        for(var i=groups.length-1;i>=0;i--)
            if(groups[i].checked) hasChecked++;
        return min <= hasChecked && hasChecked <= max;
    },
    IsDate : function(op, formatString){
        formatString = formatString || "ymd";
        var m, year, month, day;
        switch(formatString){
            case "ymd" :
                m = op.match(new RegExp
             ("^\\s*((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})\\s*$"));
                if(m == null ) return false;
                day = m[6];
                month = m[5]--;
                year = (m[2].length == 4) ?
                 m[2] : GetFullYear(parseInt(m[3], 10));
                break;
            case "dmy" :
                m = op.match(new RegExp
           ("^\\s*(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))\\s*$"));
                if(m == null ) return false;
                day = m[1];
                month = m[3]--;
                year = (m[5].length == 4) ?
               m[5] : GetFullYear(parseInt(m[6], 10));
                break;
            default :
                break;
        }
        var date = new Date(year, month, day);
return (typeof(date) == "object" &&
       year == date.getFullYear() && month == date.getMonth()
                    && day == date.getDate());
        function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
    }
}
</script>

三、DW的站点定义

上一节我们在IIS里把站点根目录定义在E:\Work,现在进到这个目录下新建一文件夹并命名为geustbook。

打开DW,在"Site"菜单下找到"Manage Sites…"项单击,见下图:

 

打开"Manage Site"对话框,点"New …",在出来的下拉菜单里选"Site"定义新站点:

 

跟着新站点定义向导一步一步来定义我们的留言板站点。在站点名称上填上geustbook:

 

点"Next>"继续下一步的后台技术选择,这里我们选择用VBScript作脚本的ASP:

 

点"Next>"继续下一步的站点文件夹设置,因为我们现在是在本地测试,而且gustbook文件夹在E:\Work\guestbook,所以设置如下:

 

点"Next>"继续下一步的设置DW的测试URL:

 

点"Next>"继续下一步,因为我们在本机测试,不需要远程服务器参与,所以选择"No":

 

点"Next>"继续下一步,这里显示的是我们刚才所填的信息,目的是要我们确认一下,如果发现有错,可以点"<Back"返回修改设置,确认无误后就可以点"Done",我们的站点定义就完成了。

 

细心一点的朋友也许会发现,在站点定义对话框上有两个标签:"Base"和"Advanced",其实用途是一样的,只不过"Base"是一步一步的向导模式,而"Advanced"是给对DW有一定了解的朋友用的高级模式,有兴趣的朋友可以自行切换到"Advanced"模式看看。

二、数据库设计
先构想一下,一个功能齐全的留言本应该有哪些内容需要保存?访客名字(Name)、访客主页(Homepage)、访客QQ(QQ)、访客信箱(Email)、访客形象(ICON)、访客IP(IP)、留言内容(Content)、留言时间(Date)—-这是访客的有关信息,如果主人要回复留言呢?好,再加上回复(Reply)和回复时间(RDate),嗯……再想想有没有漏掉什么?对了,还有主人的管理帐号:用户名(Username)、密码(Password)。
要保存这么多信息,数据库应该怎么设计?访客的留言是不断增加的,而主人的管理帐号固定不变,所以应该分开两个表,一个保存所有访客的留言和访客的资料信息,另一个则保存主人的管理帐号。OK,现在可以开始设计数据库了。打开ACCESS(在微软的Office软件中有)软件,新建一空白数据库,ACCESS会提示先保存数据库,定位到你的留言本所在文件夹(笔者是在站点根目录下建了一个guestbook文件夹),保存为data.mdb:

 
然后双击"使用设计器创建表",完成后如图:

 
为了优化数据库,有些字段需要作点设置:
ID:设为主键,确定数据唯一性以保证在管理时能准确定位到相应记录
Name:字段大小设为15(很少有人的名字有这么长的吧?)
Email:字段大小为20(也很少有Email地址的长度超过这个数字)
ICON:字段大小为6(看完后面的教程就明白为什么设这么小了)
IP:字段大小为15(可以算出来,四个三位长的数字再加三个小数点)
Homepage:字段大小为30(很多朋友还在用二级甚至三级的域名,所以放宽一点)
Date:默认值为Now ()(用Now()取得插入新记录时系统的时间)

关闭表窗口,会提示是否保存对表的修改,选"是",然后把表名改为main,同理创建表admin,以保存管理帐号:

 

最后还需要一个记录IP对应地址的表,这个IP库可以在网上搜索一下,或者到http://x-lover.com/temp/ip.mdb下载,然后打开数据库data.mdb
,在"文件"菜单下选择"获取外部数据>>导入",再在弹出的对话框里选择刚才下载的数据库,导入,选择address表,确定,现在数据库data.mdb中应该有这样的三个表:

 

至此,准备工作全部完成。

程序运行配置完了,废话不多说,直接开始我们的DW MX 2004的体验之旅吧。

9月份设计界最热的消息莫过于Macromedia公司的Studio MX 2004了,朋友们都很关心新版软件的新特性,那么就让我通过这个留言本的教程跟大家一起体验Studio MX 2004中的Dreamweaver MX 2004(以下简称DW2004)吧。
一、IIS(Internet 信息服务)安装配置
这里以Windows Server 2003(以下简称Win2003)为例。因为Win2003是服务器级的操作系统,所以自带有IIS6.0,其它版本的系统可以在"添加或删除程序>>添加/删除Windows组件"对话框中把"Internet 信息服务(IIS)"前的勾选中,点"下一步"进行安装就行了(注:在这之前应把系统安装盘放到光驱)。

 
IIS装好之后再作一下简单的配置。定位到"开始>>管理工具>>Internet 信息服务(IIS)管理器",打开IIS管理器。在"本地计算机>>网站>>默认网站"上右键单击,在快捷菜单里选"属性"(或者直接在操作菜单下选"属性"),弹出如下对话框:

 

切换到"主目录"标签(图2),重新选择网站根目录(笔者选择的是E盘下的Work目录),默认是"系统盘:\Inetpub\wwwroot",因为系统盘不宜放太多的非系统文件,所以在这里重设默认网站要目录,如果嫌麻烦可以跳过这步。再切换到"文档"标签,通过"添加"、"删除"、"上移"、"下移",把站点的默认文档设置如图所示:

 
可能有些朋友会疑惑,设置默认内容文档有什么作用?细心的朋友应该会发现,在浏览一些大网站的首页时用它的一级域名就行了,并不需要指定请求页的文件名,这就是设置了默认内容文档的缘故,它的作用就是在浏览器请求没有指定文档的名称时,将默认文档提供给浏览器。要得到更详尽的解释说明,可以点击图3中的"帮助"。之所以有这步,是因为网站的默认内容页中没有index.asp,不大符合国人习惯。

⑨回复页(reply.asp)

先做好一个这样的回复页:

 

然后建立记录集:

 

 

再在"Application"工具组里找到"Record Update Form Wizard"(如图85),弹出跟"Record Insertion Form Wizard"类似"Record Update Form Wizard"对话框:

 

在"Form fields"中删掉"ID"和"Date",修改其余的"Label"为中文,"Content"、"Reply“的"Display as"为"Text area",参考图51、52所示的方法给"Content"和"Reply"加上"Encode – Server.HTMLEncode"格式化,"RDate"的"Display as"为"Hidden field","Default value"为"<%=Date%>",调整下界面后的效果:

 

最后不要忘了也给回复页加上页面保护: