2005年01月11日

继承关系:
    UIObject—>UIComponent—>FocusManager

    包:mx.manager.FocusManager

    一个例子先

    1) 拖一个Button和一个TextInput组件到舞台上。并取名okButton和input_txt<
    2) 在时间轴第一帧写:

okButton.tabIndex=1;
input_txt.tabIndex=2;//设置两种组件的tabIndex属性,即按下tab键时的切换次序
focusManager.setFocusinput_txt);//当程序第一次运行的时候把焦点设在input_txt上
focusManager.defaultPushButton=okButton;//当用户按下Enter(windows)或Return(Macintash)时聚焦okButton
var lo=new Object();//定义一个Object对像来创建Listener
lo.click=function(evt){
  trace(evt.target+"was clicked");
}
okButton.addEventListener("click",lo);//当okButton按下时触发click事件

    FocusManager管理着所有2004中组件的焦点次序关系.它可以指定每一个组件在一个项目中的切换次序(就是当我们按tab键的时候焦点的位置)    所有的组件都继承了FocusManager类的方法和属性,但是你并不需要去用as直接的调用它。如果你没有给任何一个组件自定义焦点,那么它就会按照内定的方法来切换焦点.

    FocusManager还可以与SystemManager进行交互。它可以激活一个弹出窗口( pop_up)或者让它失去焦点。每一个对话框窗口都是一个FocusManager类的实例。因此在对话框窗口中的组件有它们自的tab次序,也就是说A弹出窗口中的tab次序与B弹出窗口的tab次序是独立的互不影响的。

    对于一种特殊情况:单选按钮(RadioButton),FocusManager是这样处理的:单选按钮有一个groupName属性,当FocusManager处理到RadioButton的时候,它会把焦点放在被选中的那个单选按钮上,(selected==true),再按tab键往下继续的时候它不会聚焦到有同一个groupName的另一个单选按钮,而是下一组具有不同groupName的单选按钮或是另外一个组件

    不管项目中的组件的tabIndex是如何定义的,只要有鼠标点击事件发生(当鼠标点击一个组件的)时候,FocusManager就会把焦点聚到被点击的那个组件上。

     FocusManager不会自动的事先给某一个组件聚焦,举例说:有A,B,C三个组件在一个项目里,当你打开这个项目的时候FocusManager不会自动的给A,或者B或者C聚焦,默认状态下是没有焦点的,除非你用FocusManager.setFocus(instanceName)去给一个组件预设焦点。

    使用焦点管理器[FocusManager]

    你可以用tabIndex属性来为项目中的组件自定义切换顺序。当用户点击tab键的时候,FocusManage会自动聚焦到比当前组件的tabIndex值大的组件上,如果tabIndex的属性值达到了最大值,那么就会返回0;举例说明:okButton是一个Button组件,input_txt是一个TextInput组件

    okButton.tabIndex=1;
    input_txt.tabIndex=2;

    那么当用户按下tab键的时候okButton就会先接受焦点,然后才是input_txt,如果希望用户按下Enter(window)或Return(Macintosh)键时聚焦到okButton,那么可以用defaultPushButton属性来实现。

focusManager.defaultPushButtonokButton
    FocusManager里有一个sendDefaultPushButtonEvent()方法需要特别说明一下。这个方法的作用是发送一个click的事件给被定义为focusManager.defaultPushButton的组件.演示一下先:

name_txt.tabIndex = 1;
password_txt.tabIndex = 2;
chb.tabIndex = 3;
submit_ib.tabIndex = 4;
focusManager.defaultPushButton = submit_ib;//这里定义了defaultPushButton属性
chbObj = new Object();
chbObj.click = function(o){
  if (chb.selected == true){
    name_txt.text = "Jody";
    password_txt.text = "foobar";
    focusManager.sendDefaultPushButtonEvent();
//当用户按下Enter(window)或Return(Macintash)的时候触发定义在submit_ib上的click事件
  }  else {
    name_txt.text = "";
    password_txt.text = "";
  }
}
chb.addEventListener("click", chbObj);
submitObj = new Object();
submitObj.click = function(o){ if (password_txt.text != "foobar"){ trace("error on submit"); } else { trace("Yeah! sendDefaultPushButtonEvent worked!"); } } submit_ib.addEventListener("click", submitObj);

    其它的关于FocusManager类的方法和属性大家可以查下Components Directory,学的方法就是从框架入手,刚开始的时候细节部分可以“不求甚解”在做东西的时候可以一边查一边用。

2005年01月10日

对于flash的组件一直没有好好的研究,一直觉得这是个遗憾,现在有点时间,好好来学习一下,我说的都是一些很粗的知识,大家有兴趣的一起来研究.

先来了解一下UIObject:

UIObject是所有v2组件的基类;它是不可视组件。UIObject类围绕ActionScript MovieClip对象,并包含允许Macromedia v2组件攻关某些常用行为的函数和属性。IObject类实现了以下内容:样式、事件、安缩放比例调整大小。要使用UIObject的方法和属性,请直接从正在使用的任何组件中调用它们。如果您使用Macromedia Component V2 Architecture创建新组件,则只需创建一个UIObject实例。即使在这种情况下,UIObject也经常由其他子类(例如Button)隐式创建。如果您确实需要创建一个UIObject实例,请使用下列代码:

class MyComponent extends UIObject;


UIObject类的方法描述摘要:

UIObject.createObject(): 为一个对象建立它的子对象

UIObject.createClassObject():创建指定类的对象(注:在第一节中曾用了这一方法建立了一个按钮对象:

import mx.controls.Button;
createClassObject();

UIObject.setSize(): 将对象调整到要求的大小

UIObject.setStyle(): 设置组件的样式,例如字体的粗细,线条的风格等等。有关各组件所支持的样式的列表,请参阅其各自所属的条目。

另外,简单介绍一下如何在组件上增加一个事件触发行为。
UIObject.addEventListener(“click”, listenerObject):即表示在组件上增加一个事件触发行为。其中buttonInstance为按钮实例名;click为事件名称,可以是其他事件;listenerObject为侦听器对象或函数,如果是函数,当事件触发时将调用该函数。

更多的可看帮助。

我们以Button组件为例简单介绍一下UIObject的几个常用方法的使用

1、先打开flash2004,新建一flash文档。

2、打开组件面板,双击button组件,然后在场景中把button把组件删除,别说我有病,帮助文件中这样写的,这样在库中就有一个button组件了,供以后用AS从库中调用。

3、在第一帧上单击,然后在Actions-Frame窗口中输入以下as代码:

_root.createObject("Button", "button1", 1);
//建一个button组件,button1为button组件的实例名
button1.setSize(80,20);
//设置大小
button1.label="闪式天下";
//按钮的名称(文本标签)
button1.setStyle("fontWeight", "bold");
//定义字体
button1._x=275;
button1._y=200;
//按钮的位置
myButton=new Object()
myButton.click=function(){
  getURL("http://www.mcmx.com");
}
button1.addEventListener("click",myButton)
//为按钮加入链接

4、测试

可以比较完整的看下MAX2004的盛况, 来自我闪网
点击查看全图
[ http://www.macromedia.com/macromedia/events/max/video/2004/ ]

首先打开flash2004,建立一个新文档,接下去我们简单介绍一下怎么把组件添加到场景中及相关的一些设置

1、选择Window-Development Panels-Components,或使用快捷键Ctrl+F7,打开组件面板:

2、选中一个组件,拖到场景中或者双击组件都能把组件加到场景中

3、你可安装一些组件,方法和MX一样(请参考《组件安装方法》)

4、选中场景中的组件,打开属性面板,你可加入实例名,改变标签等等,也可通过菜单Window-Development Panels打开Components inspector设置更多,如是否可见,是否可用等等

5、要改变组件的字体等可看UIObject.setStyle(),这个我们后面会介绍

当然你也可以不直接把组件拖到场景中,而是用as代码向场景中添加组件,我们举个例子来加个按钮:

1、双击Button组件,加入到场景中

2、到场景中把组件Delete掉(注:删掉的目的是把这个组件加入到库中,使用AS代码来从库中调用)

3、为第一帧加入以下as:

import mx.controls.Button;
//Button为组件的名称,
//前面的格式不变,如要加入一个CheckBox,就用import mx.controls.CheckBox;
createClassObject(Button,"button2",5,{label:"Test Button"});
//Button为名称,Button2为实例名,5为深度,后面为标签

或者简单点这样

createClassObject(mx.controls.Button,"button2",5,{label:"Test Button"});

这样的话我们就可利用实例名来改变组件的一些属性,在前面代码的基础上再添加如下AS代码:

button2._x=200;
//x坐标
//试试这样
button2.onRelease=function(){
  trace("zjs");
}

注:以上这些代码是加在帧上的。

换一种方法,不用AS来添加BUTTON组件。

1.把BUTTON组件拖入场景或通过双击该组件使其出现在场景中

2.选中Button,点击Action面板。输入

on(click){
  trace("不要点我");
}

运行试试看。

注:组件的事件因组件而不同,对Button组件可用on(click)、on(press)、on(release)等。

还有一种语法是写在帧上的:

function myHandler(eventObj){
  if (eventObj.type == "click"){
    trace("你点了我了")
}
}
button1.addEventListener("click", myHandler);
//点击后输出信息

注:写这段AS的前提是给场景中的Button组件一实例名:button1

[闪客帝国注:原作者zjs35,由闪客帝国改编完善。如需转载请注明出处。]

韩国的FLASH起步也许比我们要早一些,有很多的动画做得很精典。提到这儿,并不是我没有爱国热情,而是优秀的文化成果很值得我们借鉴和学习,从而促进我国FLASH动画的发展。 见到有很多的网友询问这个菜单的制作方法与步骤,小草以仅有的一点点能力,将其大致步骤作个解析。有些不当之处,请各位同行多多指正! 一样的,我们先看一下文件的效果吧!


1、费话少说,我们来看一下它的制作步骤。首先我们打开FLASH MX2004,新建一个文档,并将其保存为main.fla。

按此在新窗口浏览图片

2、打开文档的属性,设置影片的大小为770*250,帧频为第秒36帧,白色背景。如图所示:

按此在新窗口浏览图片

3、单击“文件”==》“导入”==》“导入到舞台”命令,向主场景中导入一幅背景图片。(选一幅漂亮一点的吧!

按此在新窗口浏览图片

按此在新窗口浏览图片

4、另外再导入几幅所需要用到的图片文件,在制作影片剪辑的时候要用的。找几幅好看的图片,点击“打开”按钮,我们将其导入到库中。

按此在新窗口浏览图片

5、新建起6个图层,从上到下的命名为:主场景动作层、特效动作层、FLASH8—LOGO层、特效层、菜单影片层和背景层。在背景层中放置导入的背景图片,我们将其锁定。在菜单影片层中,从库中托出一幅图片到当前场景中的适当位置。


按此在新窗口浏览图片

6、在此图片上单击右键,在弹出的菜单中选择“转换为元件”命令,将其转换为名为“menu1”的影片元件。

按此在新窗口浏览图片

7、在此元件上双击,进入menu1影片元件的编辑状态。

按此在新窗口浏览图片

8、这其实就是一个新的小影片,你可以在这里发挥你的聪明才智,将其表现得尽善尽美!这儿你可以自由的发挥你的想法和表现力。(本实例中加入了特效影片,遮罩等特殊效果,如图所示:) 按此在新窗口浏览图片

9、返回主场景,打开库面板。选中menu1,单击右键,在弹出的菜单中选择“重制”命令,将刚才制作完成的影片元件menu1复制元件为menu2 ,menu3, menu4, menu5, menu6。(这样做的目的是可以节省时间。)然后将它们托到主场景菜单元件层中,双击进入menu2的编辑场景,对其进行编辑。其它几个也是如此:

按此在新窗口浏览图片

10、编辑好后的如图所示:

按此在新窗口浏览图片

11、在主场景的属性栏,现在我们将menu1影片元件命名为“menu1”,以便于AcitionScript对其进行控制。其它5个元件也依次命名为:menu2,menu3,menu4,menu5,menu6。如图所示:

按此在新窗口浏览图片

按此在新窗口浏览图片

12、然后将这菜单影片层也锁定,在特效层里放置一影片元件Sy2,这是一个由场景左边飞到右边的白色箭头影片。由于要添加动作对其控制,所以在主场景中我们将其命名为“spe”。如图所示:

按此在新窗口浏览图片

13、(Sy2元件的内部结构:很简单的,不要忘了最后一帧加上”stop” 。)
按此在新窗口浏览图片


按此在新窗口浏览图片

14、编辑完成后,我们返回主场景。(为了便于区分,我这里将动作分别用到两个图层中)我们在特效动作层中添加动作:

按此在新窗口浏览图片

time = 20;
vHeight = 200;
vSpace = 25;
_root.i = 0;
_root.onEnterFrame = function ()
{
if (random(time) == 0)
{
_root.speedbar.duplicateMovieClip(“spe” + _root.i, _root.i);
_root["spe" + _root.i]._y = random(vHeight) + vSpace;
_root["spe" + _root.i]._x = random(300) – 100;
_root["spe" + _root.i]._xscale = random(80) + 30;
_root["spe" + _root.i]._yscale = _root["spe" + _root.i]._xscale;
_root["spe" + _root.i]._alpha = random(70) + 20;
_root.i++;
}
};

15、然后在主场景影片动作层添加动作,用于控制菜单影片的!

按此在新窗口浏览图片

动作如下:

_root, ball.onEnterFrame=function () {
for (var j = 0; j<5; j++) {
mc = this.duplicateMovieClip(“ball”+i, i);
mc._rotation = random(360);
i++;
}
};
MovieClip.prototype.sMove = function(spx, tarX) {
speedX = spx*(tarX-this._x);
this._x += speedX;
};
var mtx1 = 650;
var mtx2 = 670;
var mtx3 = 690;
var mtx4 = 710;
var mtx5 = 730;
var mtx6 = 750;
_root.menu1.onEnterFrame = function() {
this.sMove(0.5, mtx1);
};
_root.menu2.onEnterFrame = function() {
this.sMove(0.5, mtx2);
};
_root.menu3.onEnterFrame = function() {
this.sMove(0.5, mtx3);
};
_root.menu4.onEnterFrame = function() {
this.sMove(0.5, mtx4);
};
_root.menu5.onEnterFrame = function() {
this.sMove(0.5, mtx5);
};
_root.menu6.onEnterFrame = function() {
this.sMove(0.5, mtx6);
};
_root.menu1.hit.onRollOver = function() {
_root.mtx1 = 430;
_root.mtx2 = 670;
_root.mtx3 = 690;
_root.mtx4 = 710;
_root.mtx5 = 730;
_root.mtx6 = 750;
_root.menu1.gotoAndPlay(2);
_root.menu2.gotoAndStop(1);
_root.menu3.gotoAndStop(1);
_root.menu4.gotoAndStop(1);
_root.menu5.gotoAndStop(1);
_root.menu6.gotoAndStop(1);
};
_root.menu2.hit.onRollOver = function() {
_root.mtx1 = 430;
_root.mtx2 = 450;
_root.mtx3 = 690;
_root.mtx4 = 710;
_root.mtx5 = 730;
_root.mtx6 = 750;
_root.menu2.gotoAndPlay(2);
_root.menu1.gotoAndStop(1);
_root.menu3.gotoAndStop(1);
_root.menu4.gotoAndStop(1);
_root.menu5.gotoAndStop(1);
_root.menu6.gotoAndStop(1);
};
_root.menu3.hit.onRollOver = function() {
_root.mtx1 = 430;
_root.mtx2 = 450;
_root.mtx3 = 470;
_root.mtx4 = 710;
_root.mtx5 = 730;
_root.mtx6 = 750;
_root.menu3.gotoAndPlay(2);
_root.menu2.gotoAndStop(1);
_root.menu1.gotoAndStop(1);
_root.menu4.gotoAndStop(1);
_root.menu5.gotoAndStop(1);
_root.menu6.gotoAndStop(1);
};
_root.menu4.hit.onRollOver = function() {
_root.mtx1 = 430;
_root.mtx2 = 450;
_root.mtx3 = 470;
_root.mtx4 = 490;
_root.mtx5 = 730;
_root.mtx6 = 750;
_root.menu4.gotoAndPlay(2);
_root.menu2.gotoAndStop(1);
_root.menu3.gotoAndStop(1);
_root.menu1.gotoAndStop(1);
_root.menu5.gotoAndStop(1);
_root.menu6.gotoAndStop(1);
};
_root.menu5.hit.onRollOver = function() {
_root.mtx1 = 430;
_root.mtx2 = 450;
_root.mtx3 = 470;
_root.mtx4 = 490;
_root.mtx5 = 510;
_root.mtx6 = 750;
_root.menu5.gotoAndPlay(2);
_root.menu2.gotoAndStop(1);
_root.menu3.gotoAndStop(1);
_root.menu4.gotoAndStop(1);
_root.menu1.gotoAndStop(1);
}
_root.menu6.hit.onRollOver = function() {
_root.mtx1 = 430;
_root.mtx2 = 450;
_root.mtx3 = 470;
_root.mtx4 = 490;
_root.mtx5 = 510;
_root.mtx6 = 530;
_root.menu6.gotoAndPlay(2);
_root.menu2.gotoAndStop(1);
_root.menu3.gotoAndStop(1);
_root.menu4.gotoAndStop(1);
_root.menu1.gotoAndStop(1);
_root.menu5.gotoAndStop(1);
};

16、出于对闪吧的热爱,将闪吧的LOGO放上来啦!

按此在新窗口浏览图片

17、按CTRL+ENTER组合键,测试看一下吧!

按此在新窗口浏览图片

2005年01月09日

参数和属性

下列标记属性和参数描述了由”发布”命令创建的 HTML 代码。在编写自己的用于显示 Flash 内容的 HTML 时,可以参考此列表。除非特别说明,否则所有条目都同时适用于 object 标记和 embed 标记。可选条目也在此列出。Internet Explorer 可以识别用于 object 标记的参数,而 Netscape 则可以识别用于 embed 标记的参数。属性既可用于 object 标记,也可用于 embed 标记。当自定义模板时,可以用此处列出的模板变量替代相应的值。请参阅自定义 HTML 发布模板。

注意:此部分中列出的属性和参数特意以小写字母显示,以符合 XHTML 标准。

devicefont 属性/参数

值: true | false
模板变量:$DE
说明:
(可选)对于未选定”设备字体”选项的静态文本对象,指定是否仍使用设备字体进行绘制(如果操作系统提供了所需字体)。

src 属性

值: movieName.swf
模板变量:$MO
说明 : 指定要加载的 SWF 文件的名称。仅适用于 embed。

movie 参数

值: movieName.swf
模板变量:$MO
说明: 指定要加载的 SWF 文件的名称。仅适用于 object。

classid 属性

值: clsid27cdb6e-ae6d-11cf-96b8-444553540000
说明: 标识浏览器的 ActiveX 控件。输入的值必须与上面的显示完全一致。仅适用于 object。

width 属性

值: n 或 n%
模板变量:$WI
说明:以像素值或浏览器窗口的百分比值来指定应用程序的宽度。

height 属性

值: n 或 n%
模板变量:$HE
说明: 以像素值或浏览器窗口的百分比值来指定应用程序的高度。

注意:因为 Flash 应用程序是可缩放的,所以只要高宽比保持不变,不论以任何尺寸播放,它们的品质都不会降低。(例如,以下尺寸的高宽比都是 4:3:640 x 480 像素、320 x 240 像素和 240 x 180 像素。)

codebase 属性

值: active.macromedia.com/flash7/cabs/swflash.cab#version=7,0,0,0

说明: 标识 Flash Player ActiveX 控件的位置,以便在尚未安装该控件时,浏览器可以自动下载它。输入的值必须与上面的显示完全一致。仅适用于 object。

pluginspage 属性

值: www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash
说明: 标识 Flash Player 插件的位置,以便在尚未安装该插件时,用户可以下载它。输入的值必须与上面的显示完全一致。仅适用于 embed 。

swliveconnect 属性

值: true | false
说明: (可选)指定第一次加载 Flash Player 时浏览器是否应启动 Java。如果忽略此属性,默认值为 false。如果在同一页面上同时使用 JavaScript 和 Flash,Java 必须处于运行状态,FSCommand() 函数才能起作用。但是,如果您运行 JavaScript 只是为了检测浏览器或用于其他与 fscommand() 动作无关的目的,则可以通过将 SWLIVECONNECT 设置为 false,从而防止 Java 启动。当没有将 JavaScript 和 Flash 一起使用时,也可以通过将 SWLIVECONNECT 属性明确设置为 true,强制 Java 启动。启动 Java 会显著增加启动 SWF 文件所需的时间,因此,只有在必要时才应将此标记设置为 true。仅适用于 embed。

使用 fscommand() 动作可从独立的放映文件中启动 Java。

play 属性/参数

值: true | false
模板变量:$PL
说明:(可选)指定应用程序是否在浏览器中加载时就开始播放。如果您的 Flash 应用程序是交互式的,则可以让用户通过单击按钮或执行某些其他任务来开始播放。在这种情况下,将 play 属性设置为 false 可禁止应用程序自动开始播放。如果忽略此属性,默认值为 true。

loop 属性/参数

值: true | false
模板变量:$LO
说明: (可选)指定 Flash 内容在它到达最后一帧后是无限制重复播放还是停止。如果忽略此属性,默认值为 true。

quality 属性/参数

值: low | medium | high | autolow | autohigh | best
模板变量:$QU
说明: (可选)指定在应用程序回放期间使用的消除锯齿级别。因为消除锯齿需要更快的处理器先对 SWF 文件的每一帧进行平滑处理,然后再将它们呈现到观众屏幕上,所以需要根据要优化速度还是优化外观来选择一个值:

“Low”使回放速度优先于外观,而且从不使用消除锯齿功能。

“Autolow”优先考虑速度,但是也会尽可能改善外观。回放开始时,消除锯齿功能处于关闭状态。如果 Flash Player 检测到处理器可以处理消除锯齿功能,就会打开该功能。

“Autohigh”在开始时是回放速度和外观两者并重,但在必要时会牺牲外观来保证回放速度。回放开始时,消除锯齿功能处于打开状态。如果实际帧频降到指定帧频之下,就会关闭消除锯齿功能以提高回放速度。使用此设置可模拟 Flash 中的”消除锯齿”命令(”查看”>”预览模式”>”消除锯齿”)。

“Medium”会应用一些消除锯齿功能,但并不会平滑位图。该设置生成的图像品质要高于”Low”设置生成的图像品质,但低于”High”设置生成的图像品质。

“High”使外观优先于回放速度,它始终应用消除锯齿功能。如果 SWF 文件不包含动画,则会对位图进行平滑处理;如果 SWF 文件包含动画,则不会对位图进行平滑处理。

“Best”提供最佳的显示品质,而不考虑回放速度。对所有输出都进行消除锯齿处理,并且对所有位图都进行平滑处理。

如果忽略 quality 属性,其默认值为 high。

bgcolor 属性/参数

值: #RRGGBB(十六进制 RGB 值)
模板变量:$BG
说明: (可选)指定应用程序的背景色。使用此属性来覆盖在 Flash SWF 文件中指定的背景色设置。此属性不影响 HTML 页面的背景色。

scale 属性/参数

值: showall | noborder | exactfit
模板变量:$SC
说明: (可选)当 width 和 height 值是百分比时,定义应用程序如何放置在浏览器窗口中。

“Showall”(默认值)使整个 Flash 内容显示在指定区域中,且不会发生扭曲,同时保持它的原始高宽比。边框可能会出现在应用程序的两侧。

“Noborder”对 Flash 内容进行缩放以填充指定区域,不会发生扭曲,它会使应用程序保持原始高宽比,但有可能会进行一些裁剪。

“Exactfit”使整个 Flash 内容显示在指定区域中,但不尝试保持原始高宽比。可能会发生扭曲。

如果忽略此属性(而且 width 和 height 值是百分比),则它的默认值是 showall。

align 属性

值: Default | L | R | T | B
模板变量:$HA
说明: 指定 object、embed 和 img 标记的 align 值,并确定如何在浏览器窗口内放置 Flash SWF 文件。

“默认”使应用程序在浏览器窗口内居中显示,如果浏览器窗口小于应用程序,则会裁剪边缘。

L、R、T 和 B 让应用程序分别沿着浏览器窗口的左、右、上、下边缘对齐,并根据需要裁剪其余三边。

salign 参数

值: L | R | T | B | TL | TR | BL | BR
模板变量:$SA
说明: (可选)指定缩放的 Flash SWF 文件在由 width 和 height 设置定义的区域内的位置。有关这些条件的详细信息,请参阅scale 属性/参数。

L、R、T 和 B 让应用程序分别沿着浏览器窗口的左、右、上、下边缘对齐,并根据需要裁剪其余三边。

TL 和 TR 让应用程序分别与浏览器窗口的左上角和右上角对齐,并根据需要裁剪底边和剩余的右侧或左侧边缘。

BL 和 BR 让应用程序分别与浏览器窗口的左下角和右下角对齐,并根据需要裁剪顶边和剩余的右侧或左侧边缘。

如果忽略此属性,Flash 内容会在浏览器窗口中居中显示。

base 属性

值: 基本目录或 URL
说明: (可选)指定用于解析 Flash SWF 文件中的所有相对路径语句的基本目录或 URL。如果 SWF 文件保存在与您的其他文件不同的目录下,这个属性是非常有用。

menu 属性/参数

值: true | false
模板变量:$ME
说明: (可选)指定当观众在浏览器中右击 (Windows) 或按住 Command 键单击 (Macintosh) 应用程序区域时将显示的菜单类型。

“true” 显示完整的菜单,让用户使用各种选项增强或控制回放。

“false” 显示的是一个只包含”关于 Macromedia Flash Player 6″选项和”设置”选项的菜单。

如果忽略此属性,默认值为 true。

wmode 属性/参数

值: Window | Opaque | Transparent
模板变量:$WM
说明: (可选)使您可以使用 Internet Explorer 4.0 中的透明 Flash 内容、绝对定位和分层显示的功能。此标记/属性仅在带有 Flash Player ActiveX 控件的 Windows 中有效。

“Window”在 Web 页上用影片自己的矩形窗口来播放应用程序。”Window”表明 Flash 应用程序与 HTML 层没有任何交互,并且始终位于最顶层。

“Opaque” 使应用程序隐藏页面上位于它后面的所有内容。

“Transparent”使 HTML 页的背景可以透过应用程序的所有透明部分进行显示,这样可能会降低动画性能。

“Opaque windowless”和”Transparent windowless” 都可与 HTML 层交互,并允许 SWF 文件上方的层遮蔽应用程序。这两种选项之间的差异在于”Transparent”允许透明,因此,如果 SWF 文件的某一部分是透明的,则 SWF 文件下方的 HTML 层可以透过该部分显示出来。

如果忽略此属性,默认值为 Window。仅适用于 object。

allowscriptaccess 属性/参数

值: always | never | samedomain
说明: 使用 allowscriptaccess 使 Flash 应用程序可与承载它的 HTML 页通信。此参数是必需的,因为 fscommand() 和 getURL() 操作可能导致 JavaScript 使用 HTML 页的权限,而该权限可能与 Flash 应用程序的权限不同。这与跨域安全性有着重要关系。

always 允许随时执行脚本操作。

never 禁止所有脚本执行操作。

samedomain 只有在 Flash 应用程序来自与 HTML 页相同的域时才允许执行脚本操作。

所有 HTML 发布模板使用的默认值均为 samedomain。

如何用FLASH判断一个文件是否存在
var exist = new LoadVars();
exist.onLoad = function(success) {
if(!success) {
trace(“文件不存在”);
}
}
exist.load(“文件名”);

FLASH MX2004比起FLASH MX新加了好多的功能,比如:行为、时间线特效、新的开始面板、增强的组件等等,最让人注目的莫过于对视频的支持了! 以前文件中的视频文件导出后,生成的SWF文件很大。网络传输的效果也不是太理想!
让人高兴的是FLASH MX2004可以对外部的视频文件进行链接,运用媒体播放组件对视频文件进行灵活的控制。这种文件格式就是*.FLV格式,全称为Flash Video,相信大家也都见过的吧!

先看一下这种样式!(由于FLV格式的文件上传不上来,便放到了自己的站上,加载数据有点慢.)
点击浏览该文件
点击浏览该文件

费话少说了,现在开始制作了!

1、启动FLASH MX2004,在开始界面选择“创建新项目”,“FLASH文档”选项。

按此在新窗口浏览图片

2、选择“文件”菜单中的“导入”===》“导入到库”命令,打开导入对话框。

按此在新窗口浏览图片

3、我们可以看到,FLASH MX 2004支持的文件类型有很多种,视频方面有*.mov,*.avi,*.mpg,*.wmv,*.asf等多种格式。

按此在新窗口浏览图片
4、这里我们将选择一个*.wmv网络压缩格式的文件导入。

按此在新窗口浏览图片

5、弹出“导入向导”,我们选择“导入整个视频”后,单击下一步。

按此在新窗口浏览图片

6、接着是一些选项,我们这里按其默认设置,不做改变。

按此在新窗口浏览图片
7、然后,FLASH MX2004会将这个视频导入到库中,如图所示:

按此在新窗口浏览图片

8、选择“窗口”==》“库”命令,或者按CTRL+L组合键,打开库面板。

按此在新窗口浏览图片

9、可以在库中看到到我们刚才导入的视频文件了,在文件上单击右键,在弹出的菜单中选择“属性”命令。

按此在新窗口浏览图片


10、弹出“嵌入视频属性”的对话框,上面有关这个视频文件的属性。在这里,我们要用到的是FLASH MX2004的视频转换功能。这里我们选择“导出”命令。

按此在新窗口浏览图片

11、便会弹出“导出FLV”的选项窗口。然后选择保存的位置和文件名单击保存。

按此在新窗口浏览图片

12、可以看到,这个FLV文件已经转换好了!

按此在新窗口浏览图片




13、视频文件已经生成,现在我们便可以运用FLASH MX2004自带的媒体播放组件来对这个FLV文件进行控制了。打开组件面板,可以见到如图所示的组件。

按此在新窗口浏览图片

14、我们托动一个“MediaPlayback”到当前主场景。

按此在新窗口浏览图片

15、让其在场景中处于被选择状态,打开“组件检查器”,打开参数面板,可以看到相关选项。有两种选项,FLV和MP3。我们选择FLV,在URL栏中,填写要控制的视频文件的相对地址(比如:001.flv)或绝对地址(比如:http://www.falsh8.net/fa.flv )。

按此在新窗口浏览图片



16、别忘记了将这个文件保存起来喔,万一突然死机,那所有的心血就白费喽!!

按此在新窗口浏览图片

17、按CTRL+ERTER来测试一下吧!

按此在新窗口浏览图片

做这个教程所用到的源文件和截图都一并附上,供您参考!注意,一定要用FLASH MX2004打开的喔!

第一课 聊天室运作原理及基础

要点:
1.简介用FLASH2004和VB构建聊天室需要的操作系统、软件环境、基础知识
2.认识聊天室的界面和功能。
3.构建聊天室的基本原理:用一个简单的拓扑结构图展示并讲解。

教程使用提示:双击下载并解压后的教程即可开始学习,如需暂停,可在教程上单击,再次单击,继续播放。另有控制菜单提供视频教程的其他功能。

教程下载 (2.19MB)

第二课 用FLASH2004做聊天室客户端界面

介绍了在FLASH中制作聊天室的客户端界面步骤:

1.添加几个输入文本框做为用户名、密码、文本输入框;
2.登录、发送按钮的制作;
3.TextArea组件做为动态聊天内容区域;
4.动态文本建立用户列表;
5.指定文本框和按钮的实例名

教程使用提示:双击下载并解压后的教程即可开始学习,如需暂停,可在教程上单击,再次单击,继续播放。另有控制菜单提供视频教程的其他功能。

教程下载 (1.59MB)

第三课 在FLASH2004中编写客户端连接部分程序

重点分析客户端连接部分的AS代码

步骤:
1.通过FLASH的帮助,找到一段现成的客户端连接程序的示例代码:XMLSocket;
2.分析代码;
3.修改、补充代码。

教程使用提示:双击下载并解压后的教程即可开始学习,如需暂停,可在教程上单击,再次单击,继续播放。另有控制菜单提供视频教程的其他功能。

教程下载 (4.05MB)

第四课 在VB中编写服务器监听部分程序

分析VB中的程序代码
步骤:
1.插入控件:Microsoft Winsock Control 6.0
2.修改控件属性:Index=0;localport=2000;名称
3.代码编写、分析
4.运行vb服务器端程序,在FLASH中测试客户端

教程使用提示:双击下载并解压后的教程即可开始学习,如需暂停,可在教程上单击,再次单击,继续播放。另有控制菜单提供视频教程的其他功能。

教程下载 (3.26MB)

第五课 XML基础及发送静态XML数据

步骤:
1.XML语法简介
(1)什么是XML
  可扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

(2)XML语法简介
  XML的语法非常的简单,XML文档由节点组成,使用打开和关闭节点描述标记,在格式上与HTML标记非常相似,它们之间最大的不同是:XML中可以自由定义标记名。比如下面的标记就描述了一个电话号码:

<Phone>987-654-3210</Phone>

  
  开始和结束标记必须相同,XML是识别大小写的,所以标记的大小写也必须相同。比如下面的例子中以<message>标记开始就必须以</message>标记结束,而不能是</Message>或</MESSAGE>

  节点标记中可以包含属性,比如下面的代码中message节点包含属性user,其值为dayu:

<message user="dayu" text="11111111111"></message>


  如果不愿意在节点中包含一个值,那么可以不需要结束标记,可以用在开始标记的后面加一个斜线来结束节点,在下面的例子中,Phone标记的Number属性就存储了一个电话号码,所以就不需要一个结束标记:

<Phone Number="987-654-3210"/message>

(3)在FLASH当中建立XML对象的2种方法:
1)先产生XML字符串,将字符串转变成XML对象

mss = “<message user=\\\\\\\\\\\\\\\’”+_root.player+”\\\\\\\\\\\\\\\’ text=\\\\\\\\\\\\\\\’”+_root.mess+”\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\’ taget=\\\\\\\\\\\\\\\’”+_root.taget+”\\\\\\\\\\\\\\\’> </message>”; msss = new XML(); msss.parseXML(mss);

最后两句也可以这样写:

msss= new XML(mss);


2)先建立一个XML对象 然后添加相关的节点以及属性。
这个不做要求,想了解的可以自己看FLASHMX的帮助
2.如何在FLASH中发送静态XML数据

教程使用提示:双击下载并解压后的教程即可开始学习,如需暂停,可在教程上单击,再次单击,继续播放。另有控制菜单提供视频教程的其他功能。

教程下载 (9.7MB)

第六课 发送定制的XML数据包

主题:在连接的基础上从客户端发出一个定制的XML数据包,在服务器端接收,并将其显示出来,学完后可了解客户端向服务器端发送数据的机制。

步骤:
1.在VB6.0中,打开原有的服务器端程序,放入一个文本框。
2.新增代码并讲解:如何用tcpserver的套接字接收数据包。
3.在FLASH2004中,对客户端进行编程,为按钮send添加AS脚本。
4.测试

教程下载 (2.72MB)

第七课 接收服务器的数据包

主题:在FLASH中如何发出任意输入的聊天信息。
1.在FLASH2004中修改原有send按钮的AS脚本。
2.讲解修改后的代码与原代码的区别
3.测试影片
4.修改输入文本的格式,完善客户端界面
5.测试影片

教程下载 (3.67MB)

第八课 将客户发送的信息显示在公共聊天文本域

主题:如何通过发送按钮将客户端的信息显示在公共聊天文本域,供在线用户浏览

1.在FLASH2004中的第一帧上添加一行代码(注:newline表示换行)
2.测试影片,发现问题:不能显示
3.修改代码:将_root.xinxi=_root.xinxi+e.attributes.user…改为_root.xinxi.text=_root.xinxi.text+e.attributes.user…,由此说明_root.xinxi的text属性。
4.测试影片,问题解决。但问题再次出现:英文可以顺利显示,但中文字数是双数时能显示,单数时不能显示,原因是:汉字编码的问题。如何解决?
5.在服务器端追踪信息,发现问题所在:服务器端接收的信息会出现乱字符,导致问题出现,如何处理?
6.简单的解决办法

教程下载 (6.29MB)

第九课 解决第八课中出现的问题

主题:解决两个问题。

1.如何在公共聊天文本域,无需拖动滚动条,即可将聊天室中的最新信息自动显示在底端?
解决方法:在第一帧添加一行代码:xinxi.vPosition = xinxi.maxVposition;
2.中文字符显示的问题。
解决方法:用转意字符“\\\\\\\\\\\\\\\\”。

补充:输入并发送聊天信息后,自动清空输入文本框,解决方法:在第二帧代码中send.onPress = function() {}后增加一行代码:_root.mess=”";

教程下载 (5.4MB)

用FLASH和VB建立聊天室的整个过程到今天全部结束了。相信这套教程将对各位网友有很大的帮助。感谢大愚提供了这套视频教程,同时还提供了教程中涉及到的源文件。(叶子)

我们要建设一个聊天室,首先,这个聊天室的整体概况要在我们脑海中要有一个初步的影像,在众多的公共聊天室中,其核心无非是:
  1、聊天者把语句写入文本或数据库;
  2、浏览器不断的对文本或数据库进行刷新、读取;
  3、实时更新在线的客户;
  4、管理员对聊天者进行踢或IP禁止操作。   若是一个初学程式设计,你能够实现写数据库、自动刷新、获取客户IP的实验,那么,实际上建设聊天室也就完成了一大半。首先,要完成这几个实验,我们至少要熟悉一些ASP脚本及一些SQL命令。
  1、

<%IP=Request(“REMOTE_ADDR”)%>
   您的IP地址为:
   <%=IP%>

   这是一段获取客户IP的脚本,如果你看过《ASP教程》,你应该知道REMOTE_ADDR是
   一个服务器环境变量,返回发出请求的远程主机(client)的IP地址。
  2、

<%
   Set Conn=Server.CreateObject(“ADODB.Connection”)
   Connstr=”DBQ=”+server.mappath(“chat.mdb”)+”;DRIVER={Microsoft Access     Driver (*.mdb)
};”    Conn.Open connstr
   sql=”SELECT * FROM 在线用户表 WHERE 姓名=””””” & Request(“name”) & “”””””
   Set Rs=conn.Execute(sql)    If Rs.Bof OR Rs.Eof Then
    sz = “””””” & Request(“name”) &_
    ”””””, ”””””& Request(“D4″) &_
    ”””””, ”””””& time1 & “”””””
    into_db = “INSERT INTO 在线用户表 ( 姓名, 性别, 登陆时间 ) VALUES(” &_
    sz & “)”
    conn.Execute(into_db)
   end if
   %>

   这是一段十分常见的对数据库操作的脚本,其中包含了对数据库的条件查询与记录添加。上面此段程序我们分三部分来分析,如上以空格分隔的三个部分。
  要使用组件提供的对象,请创建对象的实例并将这个新的实例分配变量名。使用ASP的Server.
CreateObject方法可以创建对象的实例,使用脚本语言的变量分配指令可以为对象实例命名,如下例:

   Set Conn=Server.CreateObject(“ADODB.Connection”)

  这里的变量Conn 是ASP 程序创建的访问数据库的对象实例 。
  我们要访问数据库,首先要必须知道这个数据库在哪里,这个数据库的驱动程序是什么,要指定这两点有两种方法:第一是在服务器端手动创建数据库源名、指定数据库路径、指定数据库驱动程序,这个方法是通过服务器端的控制面版中的 ODBC 来设置的。她的优点是可以限定数据库的访问权限,增加数据库的安全性,缺点是数据库不易移植。
  再有一种方法是使用 ASP 来指定数据库路径及数据库驱动程序。不必手动对创建数据库源。在此例中,我们用的是第二种方法。

server.mappath(“chat.mdb”)指定数据库路径,DRIVER={Microsoft Access Driver
(*.mdb)};

指定数据库驱动程序,此例中我们使用的是MS ACCESS 数据库。
  SELECT是 SQL 查询命令。sql=”SELECT * FROM 在线用户表 WHERE 姓名=””””” & Request(“name”) & “””””” 表示查询 数据库chat.mdb中的 在线用户表 中所有姓名等于Request(“name”)的人,Request(“name”)是读取表单中名为 NAME 的数据。
  Bof 是文件开头,Eof是文件结尾。If Rs.Bof OR Rs.Eof Then…语句往往用于判断数据库中是否存在符合条件的记录,如果为真则记录不存在,如果为假则记录存在。
  INSERT INTO是SQL中的插入命令,往往用于插入一条记录。
  上面此段程序,整体的意思就是:查询数据库在线用户表中是否存在用户Request(“name”),如果不存在这个用户则把这个用户添加到在线用户表中。
  3、

<meta http-equiv=”refresh” content=”4″>

   这是一条最简单的页面自动刷新脚本,她是HTML脚本,而不是ASP脚本。很简单吧,其意思是每4秒钟刷新一次,但在使用过程中,你会发现会出现有不少问题出现。接下来,我们开始讲述建设过程,首先,我们要规划,要大概了解使用多少个数据库表,这些数据库表应该有哪些字段;摆在我们面前的就已经是必须存在的几个数据库表:1、存储用户信息的用户表,2、存储发言信息的发言表,3、存储在线用户信息的在线用户表等。
  建议使用ACCESS或SQL SERVER 数据库,建立一个ACCESS数据库实在是太简单了,就象建立一个EXCEL表格差不多,你可以不必了解太多的数据库知识。
  我们先建立chat.mdb数据库包含用户表及聊天表:如下:
用户表:
ID IP 姓名 性别 密码
. . . . .
. . . . .
聊天表:
ID IP 姓名 颜色 表情 说话对象 说话
. . . . . . .
. . . . . . .
在线用户表:
ID 姓名 性别 登陆时间
. . . .
. . . .
数据库一旦建立,我们便可以开始着手编程,首先要考虑建立如下几个独立文件:1、登陆及发言区;2、刷新区;3、管理区。
  先来看登陆及发言区:这是聊天室的核心部分,请先看看流程:                         登陆<———————————|
             |             |
             |             |
       获取用户名、用户IP、密码       |
             |             |
             |             |
             |             |
             |        密码错误 |
|——————————查询用户表——————————|
| 密码正确         |
|             |
|            初|
|            次|
|            登|
|            陆|
|             |
|             |
|     把用户名、用户IP、及密码写入用户表
|             |
|             |
|————>把用户名、登陆时间写入在线用户表
             |
             |
|—————————-—>发言区
|             |
|             |
|            选|选
|            择|择
|            颜|说
|            色|话
|            与|的
|            表|对
|            情|象
|             |
|             |
|             发言
|             |
|             |
|       把姓名、说话内容、说话对象、
|        颜色、表情写入聊天表
|             |
|             |
|   发言         |        离开
|-————————————|————————————|
                          |
                          |
                          |
             |<-———————————|
             |
             |
        从在线用户表中删除该用户
             |
             |
             |
           离开聊天室
接下来,我们开始对用户登陆与发言实例程序进行分析:chatadd1.asp
1、用户登陆

<%Response.Buffer=true%>                指定缓存为真
<body bgcolor=”#F8E17A”>
<%if Request(“name”)=”" then%>             判断用户名是否为空,以判断用户是否在聊天
界面
<%addr=Request(“REMOTE_ADDR”)%>             获得用户IP
<form method=”POST” action=”chatadd1.asp”>
<p><input type=”hidden” name=”IP” value=”<%=addr%>”><p> 用户登陆表单
<p>请输入匿名:<input type=”text” name=”name” size=”15″>
密码:<input type=”password” name=”pass” size=”15″> 性别:<select name=”D4″ size=”1″ style=”color: rgb(0,0,128)”>
<option value=”先生”>先生</option>
<option value=”女士”>女士</option>
</select> <input type=”submit” value=”发送” name=”B1″>
<input type=”reset” value=”复原” name=”B2″></p>
</form>
<%=Request(“a”)%>                    返回的错误变量
<%else%>                        用户确在聊天界面中 <%B1=Request(“B1″)
If B1=”发送” Then                    开始判断用户名与密码         If Request(“name”)=”" or Request(“pass”)=”" Then    判断用户名与密码是否为空
a=”名字或密码不能为空!<br>”               如果为空,则定义此错误变量
Response.Redirect “chatadd1.asp?a=” & a & ” “      错误一旦出现立即返回登陆界面
end if Set Conn=Server.CreateObject(“ADODB.Connection”)    如果客户输入非空,则开始查询数据库
Connstr=”DBQ=”+server.mappath(“chat.mdb”)+”;DRIVER={Microsoft Access Driver (*.mdb)};”
Conn.Open connstr
sql=”SELECT * FROM 用户表 WHERE 姓名=””””” & Request(“name”) & “””””” 查看数据库中是否存在这个用户
Set Rs=conn.Execute(sql)
If Rs.Bof OR Rs.Eof Then                 如果数据库中还没有这个用户,则
sz = “””””” & Request(“IP”) &_               把该用户写入用户数据库
“””””, ”””””& Request(“name”) &_
“””””, ”””””& Request(“D4″) &_
“””””, ”””””& Request(“pass”) & “”””””
into_db = “INSERT INTO 用户表 ( IP, 姓名, 性别, 密码 ) VALUES(” &_  写入用户数据库
sz & “)”
conn.Execute(into_db) Else                           如果数据库中已经存在这个用户,则
If Request(“pass”)<>Rs(“密码”) Then           查看他的密码是否正确。
a=”这个名字已经被别人使用,或者你输入的口令不对!<br>”   如果密码错误则定义错误信息
Response.Redirect “chatadd1.asp?a=” & a & ” “      立即返回登陆界面并返回此错误信息
end if
end if
time1=now                   如果登陆表单没有任何错误,则开始成为在线用户并进
入聊天
Set Conn=Server.CreateObject(“ADODB.Connection”)
Connstr=”DBQ=”+server.mappath(“chat.mdb”)+”;DRIVER={Microsoft Access Driver (*.mdb)};”
Conn.Open connstr
sql=”SELECT * FROM 在线用户表 WHERE 姓名=””””” & Request(“name”) & “”””””  查看在线名单中是否存在这
个用户
Set Rs=conn.Execute(sql)
If Rs.Bof OR Rs.Eof Then                 如果在线名单中的确没有这个用户,则
sz = “””””” & Request(“name”) &_              在在线用户表中添加这个用户
“””””, ”””””& Request(“D4″) &_
“””””, ”””””& time1 & “”””””
into_db = “INSERT INTO 在线用户表 ( 姓名, 性别, 登陆时间 ) VALUES(” &_  添加这个用户
sz & “)”
conn.Execute(into_db) name=Request(“name”)
sex=Request(“D4″)
ming=”管理员宣布”                     管理员开始宣布欢迎这位(先生/女士)
的光临
sz=”<font size=5 color=#FF0000><strong>” & “热烈欢迎” & name & sex & “的光临”
into_db2 = “INSERT INTO 聊天表 ( 姓名,说话 ) VALUES(””””” & ming & “””””,””””” & sz & “””””)”
conn.Execute(into_db2) end if end if%>


2、用户发言

                              用户开始真正发言             
<%addr=Request(“REMOTE_ADDR”)%>              用户IP
<form method=”POST” action=”chatadd1.asp”>         用户发言表单
<p><input type=”hidden” name=”ip” value=”<%=addr%>”><p>
<p><input type=”hidden” name=”name” value=”<%=Request(“name”)%>”><p>
<p><input type=”text” name=”word” size=”70″><input type=”submit” value=”发言” name=”B3″><input
type=”reset” value=”复原” name=”B4″> <p>颜色:<select name=”D1″ size=”1″ style=”color: rgb(0,0,128)”>
<option value=” “>黑色</option>              颜色选择
<option value=”#ff0000″>红色</option>
<option value=”#008000″>绿色</option>
<option value=”#0000FF”>蓝色</option>
<option value=”#800080″>紫色</option>
<option value=”#008080″>青色</option>
<option value=”#800000″>深红色</option>
<option value=”#00ff00″>草绿色</option>
<option value=”#00ffff”>海蓝色</option>
</select> <%
Set Conn=Server.CreateObject(“ADODB.Connection”)     查询更新在线用户
Connstr=”DBQ=”+server.mappath(“chat.mdb”)+”;DRIVER={Microsoft Access Driver (*.mdb)};”
Conn.Open connstr
sql=”SELECT * FROM 在线用户表 “
Set Rs=conn.Execute(sql)
%> 对象:<select name=”D2″ size=”1″ style=”color: rgb(0,0,128)”> 从在线用户中选择说话对象
<option value=”大家”>大家</option>
<%Do While not Rs.Eof                   在线用户表单
if Rs(“姓名”)=Request(“D2″) then
s=”selected”                        这里的条件定义s是为了保持说话对象的不变性,
else                            使用户不必每次都选择说话对象,你也可以对颜色
s=”"                            与表情如法炮制。
end if%>
<option <%=s%> value=”<%=Rs(“姓名”)%>”><%=Rs(“姓名”)%>(<%=Rs(“性别”)%>)</option>
<%
Rs.MoveNext
Loop
%>
</select>
表情:<select name=”D3″ size=”1″ style=”color: rgb(0,0,128)”> 表情选择
<option value=”微笑着对”>微笑</option>
<option value=”大笑着对”>大笑</option>
<option value=”哭泣着对”>哭泣</option>
<option value=”害羞着对”>害羞</option>
<option value=”红着脸对”>脸红</option>
<option value=”愤怒的对”>愤怒</option>
<option value=”阴沉的对”>阴沉</option>
<option value=”奸笑着对”>奸笑</option>
</select>
&nbsp;&nbsp;&nbsp;&nbsp;<input type=”submit” value=”离开聊天室” name=”B5″>
&nbsp;&nbsp;&nbsp;<a href=”admin.asp”>管理员入口</a>
</form>
<%
B3=Request(“B3″)
If B3=”发言” Then                      准备把用户发言写到聊天表中
Set Conn=Server.CreateObject(“ADODB.Connection”)
Connstr=”DBQ=”+server.mappath(“chat.mdb”)+”;DRIVER={Microsoft Access Driver (*.mdb)};”
Conn.Open connstr
%> <%
word=Request(“word”)
if Request(“word”)=”" then            如果什么都没写就发言,则默认发言为两眼开开,正在发呆
word=”两眼开开,正在发呆…..”
end if
%> <%
sz = “””””” & Request(“ip”) &_                  把用户发言写到聊天表中
“””””, ”””””& Request(“name”) &_
“””””, ”””””& Request(“D1″) &_
“””””, ”””””& Request(“D3″) &_
“””””, ”””””& Request(“D2″) &_
“””””, ”””””& word & “”””””
into_db = “INSERT INTO 聊天表 ( ip, 姓名, 颜色, 表情, 说话对象, 说话 ) VALUES(” &_
sz & “)”
conn.Execute(into_db)
conn.Close end if

3、用户离开

B5=Request(“B5″)
If B5=”离开聊天室” Then                   如果用户选择离开聊天室则
Set Conn=Server.CreateObject(“ADODB.Connection”)
Connstr=”DBQ=”+server.mappath(“chat.mdb”)+”;DRIVER={Microsoft Access Driver (*.mdb)};”
Conn.Open connstr                      从在线名单中把他删除
sql5=”delete * FROM 在线用户表 WHERE 姓名=””””” & Request(“name”) & “”””””
conn.Execute(sql5) name1=Request(“name”)
sex1=Request(“D4″)
ming1=”管理员宣布”                      管理员宣布此用户离开
sz1=”<font size=5 color=#FF0000><strong>” & name1 & sex1 & “有事先离开,欢迎再来”
into_db2 = “INSERT INTO 聊天表 ( 姓名,说话 ) VALUES(””””” & ming1 & “””””,””””” & sz1 & “””””)”
conn.Execute(into_db2)
conn.close
Response.Redirect “chat.asp”
end if end if
%>

把此文件存为chatadd1.asp 当我们把上面的程序保存在具有执行权限的服务器目录中,在客户端用浏览器打开时,我们见到了平常聊天室一样的用户登陆界面。我们于是输入用户名及密码,按发送时,我们所输入的资料便会暗中存入用户数据库中。接着便出现了发言筐,我们试着输入一句话,点发言按钮,这时,我们的发言便会带着我们所输入的话,我们所选择的说话对象,我们所选择的颜色以及表情写入发言数据库中。但是,发言之后,我们并没有发现任何语句出现在屏幕上,那是因为:这个程序本身负责的纯粹是把数据库写入数据库,他不会向客户端返回任何东西,除非你的输入是错误的。
  聊天室还需要一个重要的程序,这个程序自动的、不断的读取数据库中最新的记录,把他显示在所有用户的浏览器上。这个程序与别的任何程序没有任何关系,他的唯一的任务是读取发言数据库中的数据,把他显示出来,他不管客户是否输入发言,不管客户对谁说话,不管客户选择什么表情与颜色。当这个聊天室即使没有一个人说话,这个程序也是不断的读取这个数据库,每N秒钟刷新一次,这个N是由编程者决定的。
  由此,我们可知:登陆_发言部分与自动刷新部分是没有任何联系的。
  在分析范例程序之前,我们最好来分析一下几点:
  1、在我们往数据库中写入数据库时,记录是不断往数据表的尾部增加的,因此,我们必须知道哪一句话是新的,哪一句话在前面说的,我们知道,在MSACCESS数据库表中,有一个自动编号的字段ID,这个字段非常有用,ID最大的记录是最新输入的记录,每添加一个记录,ID自动加1,由此,我们可通过ID来对用户的话进行从新到旧的、一句一句的排序输出。我们知道,在 SQL 的SELECT 语中有一个 ORDER BY的子句,他按一列或多列对结果进行升序或降序排序。如果我们不用ORDER BY 字句,那SELECT 默认为升序输出,那我们会看到,最旧的发言总是在前面显示,而最新的语句则跑到最后面去,那当然不是我们所希望的。
  2、再一点,那就是用户不断的往数据库中输入语句,数据库将会变得越来越大,而我们为了速度,我们不能也不必要读取全部的记录把所有的话显示出来,我们只需要看到最新的N句话比如最新的50句话就够了。如何实现上面两点,且来看看范例程序:
我们来分析一下下面的程序:

chatview.asp <%Response.Buffer=true%>                 设置缓存为真 <%                            指定数据库      
Set Conn=Server.CreateObject(“ADODB.Connection”)
Connstr=”DBQ=”+server.mappath(“chat.mdb”)+”;DRIVER={Microsoft Access Driver (*.mdb)};”
Conn.Open connstr
%> <%
sql=”SELECT * FROM 聊天表 ORDER BY ID DESC”        降序输出查询结果    
Set rootRs=conn.Execute(sql)
set name=rootrs(“姓名”)                  从数据库中获取姓名、说话、颜色、表情等
set word=rootrs(“说话”)
set colo=rootrs(“颜色”)
set face=rootrs(“表情”)
set who=rootrs(“说话对象”)
%> <%i=0%>                          定义输出记录数 i
<%Do While Not rootRs.Eof and i<=50%>         显示50句话,包括姓名、话语、颜色、表情等
<%i=i+1%>
<table border=””””0”””” cellpadding=””””0”””” cellspacing=””””0”””” width=””””85%””””><tr>
<td width=””””100%”””” bgcolor=””””#C0C0C0””””></td></tr><tr><td width=””””100%””””>
<font color=””””#0000FF””””><strong><%=name%></font></strong><font color=””””#008080””””><%=face%></font><font color=””””#0000FF””””><strong><%=who%>说:
</font></strong><font color=””””<%=colo%>””””><%=word%>
</font></td></tr><tr>
<td width=””””100%”””” bgcolor=””””#C0C0C0””””></td></tr></table><br>
<%rootRs.MoveNext
Loop%> <meta http-equiv=”refresh” content=”4″>           每四秒钟刷新一次

请把此程序存为chatview.asp 我们试着在客户端用浏览器打开chatview.asp,我们果然看到自动刷新的页面,不错吧!下面,我们就要考虑如何把发言部分与刷新部分在同一个页面上显示:那需要用到框架。
  框架,那是最简单不过的了,直接用Frontpage即可构建。请看如下代码:

<frameset rows=”*,90″ frameborder=”0″>
<frame name=”main” scrolling=”yes” src=”chatview.asp”>
<frame name=”footer” scrolling=”yes” noresize target=”main” src=”chatadd1.asp”>
<noframes>
<body>
<p>This page uses frames, but your browser doesn””””t support them.</p>
</body>
</noframes>
</frameset>

请把这个程序存为chat.asp
哈哈,现在,我们在客户端输入:http://XXX.XXX/chat.asp
于是,便可以开始聊天了!
当很多人进入聊天室,把大量的话写入了我们的数据库中,于是,我们的数据库越来越大,记录越来越多,
而ACCESS数据库大小是有限制的,因此,总会有崩溃的一天,由此,我们必须使数据库大到一定程度的时候自动提醒我们,让我们删除掉比较旧的N条话语。或者让数据库自动到某一定大小时自动删除部分记录。
当一些不文明之徒进入聊天室,发布一些反动言论,我们必须把他踢掉,或者禁止他的IP,禁止N个钟头,尚或把他的IP列入黑名单,让他永远无法进入。