zoukankan      html  css  js  c++  java
  • 用 Flash 制作留言板

    原文件下载

      最近我把自己制作的一个 Flash 留言板放到了爬行榜上,引起了大家不小的兴趣,很多朋友纷纷要求提供原始代码,现在,大家已经可以下载到原始代码了,但是,我想,还是要配合一个教程好一些。

      (没有概念的朋友请看这个演示……点这里

      于是,抓紧时间,马上开始写。计划是分成两部分:一部分是ASP部分的分析,另一部分是在 Flash 中的操作。

      下面,我们先来看看数据是怎样经过ASP处理的。

      这个留言板一共有三个文件——Flash SWF 影片文件、ASP程序和留言板数据文件(文本文件)。

    一、数据的排列方式

      由于实在没有什么特殊的要求,所以,没有必要使用数据库,只要把留言板的数据格式确定好就可以了,于是,我们确定如左边图显示的这种文本结构。在实际应用中,这个文件叫做 guest.txt。

      这种结构很简单,第一条数据代表一共有多少条留言,中间部分就是内容,最后一个标记着文本文件的结束。

      我来具体解释一下:各个数据都以 & 号开头,因为这样 Flash 在读取的时候就会把它当成一个变量。现在“&total=2”被读入以后,Flash 就会把影片中的 total 设置成 2。

      中间部分也是一样,第一个留言的三个部分是 sub1 name1 text1,而第 n 个留言的三个部分就是 subn namen textn……

      最后的这个“&eof=true”好象意义不大,但是其实它主要是作为标志来用,当 Flash 在读取文件的时候,肯定要显示“正在读取中……”等内容,那么怎样才能判断是否已经完全读取了呢?当然是在“&eof=true”被读取以后(也就是在 Flash 中 eof = true),才算完成。这个时候,我们就可以告诉大家:“完成”了。否则,动画就会循环显示“正在读取中……”,直到完成。

    二、ASP完成了什么

      那么,就该我们的ASP程序了,其实它完成的是最基础的工作:读取和写入,其它的功能,比如显示、浏览方式等等都还是由 Flash 完成的。

      首先,参数要全部读取进来(这些数据应该是从 Flash 传来的)。

    subject = request("sub")
    name = request("name")
    text = request("text")
    action = request("action")

      先看它的读取功能。本来我们设置了 action=read 的时候去读 guest.txt,但是发现:

      (注意:值得注意)尽管在 Netscape 中已经通过了,可是在 IE 中我们却遇到了挫折,原本不应该受 Cache 左右的 asp 程序竟然不听使唤。每次用户发了新留言以后,死活也不给刷新了。没有办法,我们只得改变战术,在 Flash 中给了 action 一个随机的参数,才解决了这个问题。

      因此,您现在看到的程序是只要有不是“add”的参数就会去执行读的操作。

    if (action <> "add") then
      set fin = Server.CreateObject("Scripting.FileSystemObject")
      filepath = Server.MapPath("guest.txt")
      set f = fin.OpenTextFile(filepath)
      (把文本文件 guest.txt 中所有数据读入 buf)
      buf = f.readAll
      (将所得结果全部返回给 Flash) 
      response.write(buf)
    

      f.close end if
      
      看见了,读取其实很容易,那么下面看写入的:

    if (action = "add") then
      (先读取文件)
      set fin = Server.CreateObject("Scripting.FileSystemObject")
      filepath = Server.MapPath("guest.txt")
      set f = fin.OpenTextFile(filepath)
    
      (先读入第一行,因为第一行有总的个数)
      line = f.readline
      (将 &total=n 中的 n 提取出来,并转成整型)
      total = int(mid(line,8))
    
      (其余内容读入缓冲区)
      buf = f.readAll
    
      f.close
    
      set fout = Server.CreateObject("Scripting.FileSystemObject")
    
      (写文件之前先锁定)
      Application.lock
    
      filepath = Server.MapPath("guest.txt")
      set f = fout.CreateTextFile(filepath,TRUE)
    
      (总数添加一个)
      total = total + 1
      (将新数据写入文件)
      f.writeline "&total="&total
      f.writeline "&sub"&total&"="&subject
      f.writeline "&name"&total&"="&name
      f.writeline "&text"&total&"="&text
    

      (将缓冲区的老数据写回)    f.write buf    f.close    (解开锁定)    Application.unlock    (返回成功写入的标志)    response.write("&added=1") end if

      相信有基础的闪客一定会很快就弄明白的。这里做一点说明:

      (1)buf 在这里很关键,它保存着目前留言板上的所有信息。我们要做的其实是:把老信息保留,然后添加入新的信息,再把老信息加在后面。就这样,不断的添加,生成大的留言板数据文件。这是程序的主要功能。

      (2)Application.Lock 和 Application.Unlock 是保护文件的方法,因为有可能出现大家一起读写一个文件的情况,会使数据丢失。使用它们就可以避免这种现象。

      (3)total = int(mid(line,8)) 是简单的 VB 语句,因为 line 读近来以后应该是“&total=12”或者“&total=71”什么的,我们需要的是 12 和 71,但是 Flash 需要“&total=xxx”,所以必须要这样做,使用 mid() 函数可以帮助我们得到“=”号后面的数据。int() 则把得到的字符型数据转换成整型,使之可以进行运算。

      好了,待续。下一部分将是 Flash 里面的手脚。哈哈!
    三、Flash 里面的手脚

      完成了ASP部分,我们可以比较蹋实的来做FLASH里面的内容了。

      ASP部分完成了数据的读取和写入,而这些资料进入FLASH以后,则需要进行一定的排列和整理。这些工作在ASP里面做反而有些烦琐,而在FLASH里面来完成,则容易得多了……

      下面,看看我们的 timeline 吧:

      上面是我们的头一部分,也就是读取和写入的关键部分。我们可以通过阅读程序来了解整个过程。

      在 reading 段,程序是这样的:

    (先初始化数据)
    Set Variable: "eof" = "false"
    Set Variable: "total" = 0
    Set Variable: "added" = 0
    Set Variable: "sub" = ""
    Set Variable: "name" = ""
    Set Variable: "text" = ""
    Set Variable: "backmethod" = 0
        

    (产生随机数) Set Variable: "r" = Random (65500) (通过随机参数调用程序,理由见上一部分 Load Variables ("http://www.yourhost.com/guest.asp?action="& r, "") Set Variable: "temp" = "正在读取信息中……"

      要说明的是:temp 是文本框变量名,temp 等于什么,屏幕上就显示什么。

      大家看:紧接着程序向下走,经过 read(只是一个标记),继续向下到达了一个 action keyframe。

    If (eof ne "true")
    Go to and Play ("read")
    End If

      这就是我们前面讲过的,直到读完文件,不然总是返回 read 去显示“正在读取信息中……”。如果读取完成,也就是“eof eq "true"”了的话,执行下面一个关键语句。

    Set Variable: "total" = Substring ( total, 0, Length ( total ) - 2 ) 

      如果您懂得程序,就不难发现:我们通过这个语句把取得的 total 值截去了两个字节——如果不这样做的话,您会发现返回的 total 竟然有两行,我们这样做是为了取得正确的数值。尽管 Flash 的数据类型不甚讲究,但是这种错误还是会出现的。

      好了,下面到了我们的 main 了,显示数据总数:

    Set Variable: "temp" = "信息读取完成,共有信息条目数:"& total 
    Stop 

      总数显示的页面下面会有两个按钮,一个是“查看”,另一个是“添加”,我们先来看简单的那个:“添加”。

      insert 只是停留在一个添加 frame 上,而当用户输入了信息以后,真正的提交工作是在 do_insert 完成:

    If ((sub eq "") or (name eq "") or (text eq ""))
     Go to and Play ("error")
    Else
     Set Variable: "temp" = "正在向服务器添加数据……"
     (action=add)
     Load Variables ("http://www.yourhost.com/cgi-bin/guest.asp?action=add", "", vars=POST)
    
     Go to and Play ("wait2")
    End If

      很简单的一个提交,把信息传送到ASP程序去,然后转到 wait2 去等待结果。至于 error,不过是一个出错 frame 罢了,不用关心。

      wait2 等待成功,后面的 action 继续循环,直到知道写入成功为止。到此,添加的工作就完成了。画面上会显示“数据成功写入!”,并且有按钮带用户回到 reading 去。

    If (added <> 1)
    Go to and Play ("wait2")
    End If
        

    Set Variable: "temp" = "数据成功写入!" Stop

      下一个部分,该是“显示”功能了。

      在做这部分的时候,我有点来了脾气,想弄得更好一些,所以,做了一些“多余”的工作。在我写这篇文章的时候,站点上测试的留言已经有几百条了,而且永远不会减少。但是,我当时还是根据自己的想法,把显示功能做了强化:少于6条留言的时候有一种处理,多于6条的还有一种处理。嘿嘿,只有发头几条留言的人才会发现:原来是有一些区别的……哦。其实这个功能真的很多余,完全可以通过程序在后面来解决,现在还给大家增添了读程序的负担,实在对不起各位闪客了。

      所以,view 的程序是这样开始的:

    Set Variable: "cur" = total
    
    If (total <= 6)
    Go to and Stop ("view6")
    Else
    Go to and Play ("view6p")
    End If

       我们先通过少于等于6条留言的处理,来展示是如何实现显示留言功能的:

    Set Variable: "i" = 6
    Set Variable: "current" = cur
    
    Loop While (current > 0)
     Set Variable: "t"&i = eval("sub"& current)
     Set Variable: "current" = current - 1
     Set Variable: "i" = i - 1
    End Loop
    
    Stop

      我通过简单的方法来显示这小于等于6条留言,而且不用显示有翻页功能的按钮。要说明的是:t6 t5 t4 t3 t2 t1 是按从上到下排列的6个文本框,我们可以轻易的为他们赋值。而在这6个家伙的下面,则有6个长条的按钮——就是我们要按下去看详细内容的那些按钮,它们被点击以后,会带着 b=6 5 4 3 2 1 这6个不同的数值转向 viewdetail。

      viewdetail 其实也只是一个中间环节,它主要是来判断用户按下的按钮是否是无效的,如果有效,那么就转向真正的显示环节——viewdetail_now:

    If (cur <= 6)
     If (b <= (6 - cur))
      Go to and Play ("nosuchitem")
     Else
      Set Variable: "load" = b - 6 + cur
      Go to and Stop ("viewdetail_now")
    End If
    Else
     Set Variable: "load" = b - 6 + cur
     Go to and Stop ("viewdetail_now")
    End If

      关键的地方到了,看看 viewdetail_now 是怎样显示的吧:

    Set Variable: "new_sub" = eval("sub"&load)
    Set Variable: "new_name" = eval("name"&load)
    Set Variable: "new_text" = eval("text"&load)
    Set Variable: "new_sub" = Substring ( new_sub, 0, Length ( new_sub ) - 2 )
    Set Variable: "new_name" = Substring ( new_name, 0, Length ( new_name ) - 2 )
    Set Variable: "new_text" = Substring ( new_text, 0, Length ( new_text ) - 2 )
    Set Variable: "the_sub" = new_sub
    Set Variable: "the_name" = new_name
    Set Variable: "the_text" = new_text
    Stop

      我们先把每个数据做了类似 total 的处理,然后将他们赋给相应的文本框,显示就完成了。

      那么,多于6条留言是什么样的呢?我们给它加上了两个按钮,可以用来上下翻页的。他们的 action 其实很简单:

    (上按钮)
    On (Release)
     If (cur <> total)
      Set Variable: "cur" = cur + 6
      Go to and Play ("view6p")
     End If
    End On
    
    (下按钮)
    On (Release)
     If (cur > 6)
      Set Variable: "cur" = cur - 6
      Go to and Play ("view6p")
     End If
    End On

      在多于6条留言的处理上,我们还加上了一些内容:

    Set Variable: "i" = 6
    Set Variable: "backmethod" = 1
    Set Variable: "current" = cur
    Loop While (i > 0)
     Set Variable: "t"&i = eval("sub"& current)
     Set Variable: "current" = current - 1
     Set Variable: "i" = i - 1End Loop

      backmethod 是专门为了返回而设置的。当信息很多的时候,用户看完一条,返回的时候却又返回到最前面,那可真的是大煞风景了!所以,我们增加了这个 backmethod,来告诉程序,到时候要返回到用户来的那个页面。(其实,如果把少于等于6条和多于6条的程序合并的话,就不需要这个了。)

      我想,大概的意思我已经都讲到了,具体程序和按钮以及 MovieClip 之间的关系,必须要看原始的 TimeLine 才能完全领会。其实,这篇小文章,还只是一个介绍性的东西吧!

      好了,祝您早日写出自己的论坛!(说了半天很麻烦,其实真正写程序的时候很快啊。)

      有不明白可以去论坛提问,也可以写信给我

      完成了ASP部分,我们可以比较蹋实的来做FLASH里面的内容了。

      ASP部分完成了数据的读取和写入,而这些资料进入FLASH以后,则需要进行一定的排列和整理。这些工作在ASP里面做反而有些烦琐,而在FLASH里面来完成,则容易得多了……

      下面,看看我们的 timeline 吧:

      上面是我们的头一部分,也就是读取和写入的关键部分。我们可以通过阅读程序来了解整个过程。

      在 reading 段,程序是这样的:

    (先初始化数据)
    Set Variable: "eof" = "false"
    Set Variable: "total" = 0
    Set Variable: "added" = 0
    Set Variable: "sub" = ""
    Set Variable: "name" = ""
    Set Variable: "text" = ""
    Set Variable: "backmethod" = 0
    

    (产生随机数) Set Variable: "r" = Random (65500) (通过随机参数调用程序,理由见上一部分 Load Variables ("http://www.yourhost.com/guest.asp?action="& r, "") Set Variable: "temp" = "正在读取信息中……"

      要说明的是:temp 是文本框变量名,temp 等于什么,屏幕上就显示什么。

      大家看:紧接着程序向下走,经过 read(只是一个标记),继续向下到达了一个 action keyframe。

    If (eof ne "true")
    Go to and Play ("read")
    End If

      这就是我们前面讲过的,直到读完文件,不然总是返回 read 去显示“正在读取信息中……”。如果读取完成,也就是“eof eq "true"”了的话,执行下面一个关键语句。

    Set Variable: "total" = Substring ( total, 0, Length ( total ) - 2 ) 

      如果您懂得程序,就不难发现:我们通过这个语句把取得的 total 值截去了两个字节——如果不这样做的话,您会发现返回的 total 竟然有两行,我们这样做是为了取得正确的数值。尽管 Flash 的数据类型不甚讲究,但是这种错误还是会出现的。

      好了,下面到了我们的 main 了,显示数据总数:

    Set Variable: "temp" = "信息读取完成,共有信息条目数:"& total 
    Stop 

      总数显示的页面下面会有两个按钮,一个是“查看”,另一个是“添加”,我们先来看简单的那个:“添加”。

      insert 只是停留在一个添加 frame 上,而当用户输入了信息以后,真正的提交工作是在 do_insert 完成:

    If ((sub eq "") or (name eq "") or (text eq ""))
     Go to and Play ("error")
    Else
     Set Variable: "temp" = "正在向服务器添加数据……"
     (action=add)
     Load Variables ("http://www.yourhost.com/cgi-bin/guest.asp?action=add", "", vars=POST)
    
     Go to and Play ("wait2")
    End If

      很简单的一个提交,把信息传送到ASP程序去,然后转到 wait2 去等待结果。至于 error,不过是一个出错 frame 罢了,不用关心。

      wait2 等待成功,后面的 action 继续循环,直到知道写入成功为止。到此,添加的工作就完成了。画面上会显示“数据成功写入!”,并且有按钮带用户回到 reading 去。

    If (added <> 1)
    Go to and Play ("wait2")
    End If
    

    Set Variable: "temp" = "数据成功写入!" Stop

      下一个部分,该是“显示”功能了。

      在做这部分的时候,我有点来了脾气,想弄得更好一些,所以,做了一些“多余”的工作。在我写这篇文章的时候,站点上测试的留言已经有几百条了,而且永远不会减少。但是,我当时还是根据自己的想法,把显示功能做了强化:少于6条留言的时候有一种处理,多于6条的还有一种处理。嘿嘿,只有发头几条留言的人才会发现:原来是有一些区别的……哦。其实这个功能真的很多余,完全可以通过程序在后面来解决,现在还给大家增添了读程序的负担,实在对不起各位闪客了。

      所以,view 的程序是这样开始的:

    Set Variable: "cur" = total
    
    If (total <= 6)
    Go to and Stop ("view6")
    Else
    Go to and Play ("view6p")
    End If

       我们先通过少于等于6条留言的处理,来展示是如何实现显示留言功能的:

    Set Variable: "i" = 6
    Set Variable: "current" = cur
    
    Loop While (current > 0)
     Set Variable: "t"&i = eval("sub"& current)
     Set Variable: "current" = current - 1
     Set Variable: "i" = i - 1
    End Loop
    
    Stop

      我通过简单的方法来显示这小于等于6条留言,而且不用显示有翻页功能的按钮。要说明的是:t6 t5 t4 t3 t2 t1 是按从上到下排列的6个文本框,我们可以轻易的为他们赋值。而在这6个家伙的下面,则有6个长条的按钮——就是我们要按下去看详细内容的那些按钮,它们被点击以后,会带着 b=6 5 4 3 2 1 这6个不同的数值转向 viewdetail。

      viewdetail 其实也只是一个中间环节,它主要是来判断用户按下的按钮是否是无效的,如果有效,那么就转向真正的显示环节——viewdetail_now:

    If (cur <= 6)
     If (b <= (6 - cur))
      Go to and Play ("nosuchitem")
     Else
      Set Variable: "load" = b - 6 + cur
      Go to and Stop ("viewdetail_now")
    End If
    Else
     Set Variable: "load" = b - 6 + cur
     Go to and Stop ("viewdetail_now")
    End If

      关键的地方到了,看看 viewdetail_now 是怎样显示的吧:

    Set Variable: "new_sub" = eval("sub"&load)
    Set Variable: "new_name" = eval("name"&load)
    Set Variable: "new_text" = eval("text"&load)
    Set Variable: "new_sub" = Substring ( new_sub, 0, Length ( new_sub ) - 2 )
    Set Variable: "new_name" = Substring ( new_name, 0, Length ( new_name ) - 2 )
    Set Variable: "new_text" = Substring ( new_text, 0, Length ( new_text ) - 2 )
    Set Variable: "the_sub" = new_sub
    Set Variable: "the_name" = new_name
    Set Variable: "the_text" = new_text
    Stop

      我们先把每个数据做了类似 total 的处理,然后将他们赋给相应的文本框,显示就完成了。

      那么,多于6条留言是什么样的呢?我们给它加上了两个按钮,可以用来上下翻页的。他们的 action 其实很简单:

    (上按钮)
    On (Release)
     If (cur <> total)
      Set Variable: "cur" = cur + 6
      Go to and Play ("view6p")
     End If
    End On
    
    (下按钮)
    On (Release)
     If (cur > 6)
      Set Variable: "cur" = cur - 6
      Go to and Play ("view6p")
     End If
    End On

      在多于6条留言的处理上,我们还加上了一些内容:

    Set Variable: "i" = 6
    Set Variable: "backmethod" = 1
    Set Variable: "current" = cur
    Loop While (i > 0)
     Set Variable: "t"&i = eval("sub"& current)
     Set Variable: "current" = current - 1
     Set Variable: "i" = i - 1End Loop

      backmethod 是专门为了返回而设置的。当信息很多的时候,用户看完一条,返回的时候却又返回到最前面,那可真的是大煞风景了!所以,我们增加了这个 backmethod,来告诉程序,到时候要返回到用户来的那个页面。(其实,如果把少于等于6条和多于6条的程序合并的话,就不需要这个了。)

      我想,大概的意思我已经都讲到了,具体程序和按钮以及 MovieClip 之间的关系,必须要看原始的 TimeLine 才能完全领会。其实,这篇小文章,还只是一个介绍性的东西吧!

      好了,祝您早日写出自己的论坛!(说了半天很麻烦,其实真正写程序的时候很快啊。)

      有不明白可以去论坛提问,也可以写信给我

  • 相关阅读:
    【WPF】绘制柱状图、折线图、扇形图
    【WPF】获取容器宽高
    【SQL】SQL Server、MySQL、SQLite获取自增ID、自增ID清零
    【SQL Server操作】SQL Server重命名数据库及解决数据库无法分离的问题
    【数据迁移】MySQL数据库迁移到SQL Server
    【MySQL操作】MySQL导入导出数据库
    【MySQL操作】MySQL Workbench远程连接的一些操作
    【c#】遍历获得一个类的所有属性名
    vue 跨域 springCloud @CrossOrigin注解
    解决IDEA右侧maven不显示方法
  • 原文地址:https://www.cnblogs.com/QDuck/p/72056.html
Copyright © 2011-2022 走看看