關于FLASH留言板的詳細教程_Flash教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:AS3中的PNG編碼—用FLASH生成PNG
      注:耗子英語水平一般,可能有寫地方翻譯(或許稱不上翻譯)的驢唇不對馬嘴,但是希望大家能從這篇文章中學到一點東西:)呵呵。有紕漏的地方希望大家指正。關

      基于網頁的留言板,我們已經見得很多,一個完整的留言板包括三個部分:
      1. 顯示留言的頁面(顯示朋友們給我的留言)
      2. 填寫留言的頁面 (向后臺提交信息)
      3. 數據庫(用于保存后臺信息)
      關于如何制作基于網頁的留言板,不去多作解釋,可以參考相關資料。
      就目前而言,FLASH是不可以直接操作象ACCESS, SQL, Mysql 等數據庫的,他只能依靠ASP ,PHP ,JSP等其他的語言來實現數據的提交和查詢。同時,FLASH還可以和XML對接,實現一些數據的操作。

      FLASH和ASP的交互
      無論是ASP,PHP還是JSP等其他語言,原理大都一樣,本人對ASP熟悉一點,所以以下只講解FLASH與ASP的對聯;
      查看FLASH的幫助文件,可以找到好幾種的交互方法,
      本人使用最多的還是:
      loadVariablesNum(url:String, level:Number, [method:String]) : Void
      loadVariablesNum(參數1,參數2,參數3),參數1為變量所處位置的絕對或相對 URL,參數2為一個整數,指定 Flash Player 中接收這些變量的級別
      參數3為發送變量的 HTTP 方法,常用的有"get"和"POST",推薦使用"POST"方法。
      例1:新建一個flash文件,拖一個可輸入的文本框組件,取實例名為name_txt,再拖入一個按鈕組件到場景中,取實例名為send_btn,在第一幀上寫

      _root.send_btn.onRelease=function()
      {
      if(_root.name_txt.text!="")
      {
      myname=_root.name_txt.text;
      loadVariablesNum("write.asp",0,"POST");
      }
      }

      那么,測試影片后,在文本框中,輸入一個不為空的字符后,點擊發送按鈕后,輸入的內容,將被提交到同一個文件夾中的名為"write.asp"中去!
      write.asp通過Request.Form("myname")的方法,就可以得到提交過來的數據,這里就簡單的實現了 FLASH向ASP提交數據。
      接下來看看FLASH如何從ASP讀數據:
      例2:新建一個flash文件,拖一個動態文本框組件到場景中,取實例名為read_txt,在第一幀上寫

      loadVariablesNum("read.asp",0,"POST");
      _root.read_txt.text=myname;

      理論上測試后,read_txt文本框會顯示read.asp提交過來的myname中的值,但是有時候不能夠保持實時性,經常得不到數據,相信也有許多朋友
      會碰到同樣的問題,這里講兩個小技巧。

      技巧一:
      首先可以在FLASH初一個變量為 active_old=0; 在ASP中Response.Write("active_new=1")
      那么FLASH里可以寫上:

      active_old=0;
      _root.onEnterFrame=function()
      {
      loadVariablesNum("read.asp",0,"POST");
      _root.active_old=active_new;
      _root.read_txt.text=myname;
      if(_root.active_old==1)
      {
      delete _root["onEnterFrame"];
      }

      }

      此段代碼表示,開始FLASH會不斷地訪問read.asp,read.asp會把變量active_new傳遞給FLASH中的_root.active_old,當_root.active_old改變后,
      將停止事件。

      技巧二:
      使用loadVariablesNum("read.asp?temp=" random(10000),0,"POST");的方式,在每次訪問時會得到最新的數據,不會再使用緩存中的信息。

      關于ASP中的代碼如何書寫,不再多作解釋,重點講解FLASH如何準確和及時得到數據庫里的數據,達到我們期望的功能。

      [備注]
      我們常會碰到,中文提交到數據庫后,數據顯示出來為亂碼,主要是由于編碼的原因,只要在ASP中寫上 codePage=”936”%>

      FLASH和XML的交互

      應該來說,用XML和FLASH來交換數據,還是不錯的選擇,首先,XML可以根據我們的需要,很清楚地定義其結構,FLASH也可以很輕易去解釋信息。

      例3:

      myxml=new XML(); //創建一個XML新對象
      myxml.ignoreWhite=true; //空白忽略
      myxml.load(“music.xml”); //加載同目錄下的music.xml文件
      myxml.onLoad=function(success)
      {
      if(success)
      {
      ReadXML();
      trace(“加載成功”);
      }else
      {
      trace(“加載失敗”);
      }
      }

      以上的代碼就能夠檢測xml是不是加載到FLASH中去了。
      以下是個簡單的XML文件

      name=”song1” url=”mp3/01.mp3” />
      name=”song2” url=”mp3/02.mp3” />
      name=”song3” url=”mp3/03.mp3” />

      XML加載進來后,我們需要做的是去解析和提取數據,為我們所用。
      以上ReadXML()函數就用來讀數據。

      Function ReadXML()
      {
      myArray=myxml.firstChild.childNodes; //把myxml的第一個子結點所有的數據以數組的方式給myArray
      totalNumber= myArray.length; //
      for( i=0; i< totalNumber ; i )
      {
      arr_1= myArray[i].attributes.name;
      arr_2=myArray[i].attributes.url;
      }
      }

      現在,我們可以得到的結果是,在數組arr_1中保存了所有歌曲的名字,在數組arr_2中保存了所有歌曲的路徑,我們就可以使用loadSound()等方法制作一個自己的播放器了!


      XML與ASP

      Xml和ASP各有各的優勢,xml數據結構很清楚,但是沒有ASP靈活,而且還可以查詢和修改數據庫,所以想一想,假如用ASP來動態生成xml,那么我們就可以兩全其美了!
      這里需要一點ASP知識!
      以下一段實現ASP生成指定的XML。

      response.ContentType="text/xml"
      if request.QueryString("Page")<>"" then
      Page=Cint(request.QueryString("Page"))
      else
      Page=1
      end if
      pgsz=5
      %>
      DataBaseName="Manage/Message/Message.mdb"

      Set Conn = Server.CreateObject("ADODB.Connection")
      Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath(DataBaseName)
      set rs=server.CreateObject("Adodb.recordset")
      rs.open "Select * from Message order by addtime desc",conn,1,1
      if not rs.eof then
      rs.pagesize=pgsz
      Rs.Absolutepage=Page
      %>
      " Pagecount="" PageSize="" Recordcount="">

      i=0
      do while not rs.eof and i
      %>
      " Sex="" Email="" Time="--" Homepage="" Title="" Content="" Reply=""/>

      i=i 1
      rs.movenext
      loop
      %>

      end if
      rs.close
      set rs=nothing
      Conn.Close
      set Conn=Nothing
      %>


      [備注]
      我們常會碰到,XML中假如有中文,將會成亂碼,所以只要在flash中寫上
      System.useCodePage=true,就OK了!

      以上只是些基礎知識,下面具體講解留言板的制作和要害:

      效果地址:http://www.u-lee.com/bbs.htm
      是我的第一個版本的留言板
      留言板主要包括以下功能:游戲,留言(提交留言),播放音樂(mp3),治理功能(刪除留言)
      使用到的技術:AS,ASP,XML, database
      需要解決的技術問題:
      1.留言內容的分頁顯示,
      2,使用List組件顯示歌曲列表,列表使用XML動態更新,
      3,使用ScrollPan組件存放留言內容,當有新的留言內容產生時,自動調整位置,最新留言置頂,
      4,加載聲音文件,如何實現播放完一首歌曲后,自動換到下一首,
      5,刪除留言自動調整頁面。

      原理是把所有的數據用ASP提取出來,然后由FLASH來判定,使用split方法,把數據存到數組里去,需要時,再去取,這樣有一個弱點,就是使用起來,分頁時,會把不需要的數據也調用了進來,不是很科學!
      接下來講的是改進后的版本。原理是用ASP動態生成XML,當分頁時,點下一頁時,繼續訪問ASP,從新生成第二頁的XML,都由FLASH訪問XML,來加載數據,由ASP訪問數據庫,讀和寫數據。
      V2.0 版本中FLASH原文件共有3個,leave.swf 只是個容器,把write.swf和leave.swf 加載到里面去。
      write.swf為提交數據,read.swf 為讀數據.
      leave.swf :
      兩個按鈕 , 一個 查看留言 btn1 一個我要留言.btn2

      btn1: _parent.mess.loadMovie("read.swf");
      btn2: _parent.mess.loadMovie("write.swf");

      其中還有, 上一頁 和下一頁 以及一個下拉條
      主要代碼:

      xiala.onEnterFrame = function() { //下拉的位置,控制著留言內容mess的位置
      if (ggg == 1) {
      mess._y = 28;
      } else {
      y = xiala.btn._y;
      yy = y/dist1;
      mess._y = b_2*yy 30;
      }
      };
      write.swf

      (圖片見word文檔)

      主要代碼:

      System.useCodepage = true; //支持中文編碼
      this_mc._visible = false; // this_mc 為一個填寫錯誤提示的影片剪輯
      this_sex = "先生"; //默認sex為先生
      function clean() { // 點取消按鈕時,清空所有數據
      this_name.text = "";
      this_homepage.text = "";
      this_email.text = "";
      this_title.text = "";
      this_content.text = "";
      }
      function emailcheck(str) { //檢測email填寫是否正確,判定是否有@ 和 點
      at = false;
      dot = false;
      for (i=0; i
      if (str.charAt(i) == ’@’) {
      at = true;
      }
      if (str.charAt(i) == ’.’) {
      dot = true;
      }
      }
      return (at && dot);
      }
      clean_btn.onRelease = function() {
      clean();
      };
      send_btn.onRelease = function() { //提交按狃代碼
      if (this_name.text == "") {
      this_mc._visible = true;
      this_mc.tishi.text = "姓名不能為空!";
      } else if (emailcheck(this_email.text) == false) {
      this_mc._visible = true;
      this_mc.tishi.text = "請正確填寫郵件!";
      } else if (this_title.text == "") {
      this_mc._visible = true;
      this_mc.tishi.text = "主題不能為空!";
      } else if (this_content.text == "") {
      this_mc._visible = true;
      this_mc.tishi.text = "內容不能為空!";
      } else {
      myName = this_name.text;
      myHomepage = this_homepage.text;
      if (myHomepage == "") {
      myHomepage = "http://www.u-lee.com";
      }
      myEmail = this_email.text;
      myTitle = this_title.text;
      myContent = this_content.text;
      mySex = this_sex;
      trace(myName);
      trace(myHomepage);
      trace(myEmail);
      trace(myTitle);
      trace(myContent);
      trace(mySex);
      loadVariablesNum("write.asp", 0, "POST"); // 假如填寫的數據全部合格,將提交數據到write.asp
      _parent.page_num = 1;
      _parent.prev_btn._visible = false;
      _parent.txt._visible = true;
      _parent.xiala._visible = true;
      _parent.next_btn._visible = true;
      _parent.btn2.gotoAndStop(1);
      _parent.btn1.gotoAndStop(2);
      _parent.ggg = 0;
      _parent.mess.unloadMovie();
      _parent.mess.loadMovie("read.swf"); //提交后,自動轉入顯示留言的頁面
      }
      };
      listenerObject_1 = new Object(); // 偵聽事件,假如選擇了"先生"則this_sex = "先生";
      listenerObject_1.click = function(eventObject) {
      this_sex = "先生";
      };
      listenerObject_2 = new Object();
      listenerObject_2.click = function(eventObject) { // 偵聽事件,假如選擇了"先生"則this_sex = "女士";
      this_sex = "女士";
      };
      sex_1.addEventListener("click", listenerObject_1);
      sex_2.addEventListener("click", listenerObject_2);
      stop();
      read.swf

      以上是一個空影片剪接,用于放置留言信息, 想想假如我想每頁顯示5個,那么 我需要復制5個這樣的影片,放到場景中, 再把從xml中的提取出來的數據注入到每個影片中的 1-5個 動態文本框中去.
      如何讀數據,上面已經講過了, 現在 只要把數據賦給動態文本框中就可以了. 需要注重的是,我們選用的是自定義的文本框,首先確保他是多行的并且是自動換行的,所以我們考慮的是,文本框的高度必須根據內容的多少來顯示。以下代碼就可以實現:

      scroll_1 = this.message_load_mc["message_mc" i].content_txt.maxscroll; //取得內容的最大滾動量
      this.message_load_mc["message_mc" i].content_txt._height = scroll_1*18;
      //一行文本,假如是12號字大約是18px,那么*18后,就可以得到content_txt._height 了
      回復同樣也是這樣另外,低色的高度也要根據上面內容來確定。
      this.message_load_mc["message_mc" i].back_2._y= this.message_load_mc["message_mc" i].back_1._y this.message_load_mc["message_mc" i].back_1._height 2
      //得到back_2._y 坐標。

      完整的代碼:

      stop();
      System.useCodepage = true;
      //現在是第幾頁,由_root里的this_nowpage來傳給它,在場景中定義
      this_nowpage = _parent.page_num;
      temp = 0;
      read_xml = new XML();
      read_xml.ignoreWhite = true;
      read_xml.load("DataSource.asp?Page=" this_nowpage "&" Math.random(10000));
      // 刷新DataSource.asp,保證不使用緩存里的數據
      read_xml.onLoad = function(success) {
      if (success) {
      trace("OK");
      parseXML();
      } else {
      trace("加載失敗");
      }
      };
      function parseXML() {
      name_arr = new Array();
      sex_arr = new Array();
      email_arr = new Array();
      time_arr = new Array();
      homepage_arr = new Array();
      title_arr = new Array();
      content_arr = new Array();
      reply_arr = new Array();
      total_arr = new Array();
      total_arr = read_xml.firstChild.firstChild.childNodes;
      //---------總記錄數-------
      totalRecord = read_xml.firstChild.firstChild.attributes.Recordcount;
      //---------總頁數---------
      totalPage = read_xml.firstChild.firstChild.attributes.Pagecount;
      _parent.total_1 = totalPage;
      //---------當前頁數--------
      now_Page = read_xml.firstChild.firstChild.attributes.CurPage;
      //---------每頁顯示記錄數-------
      page_size = read_xml.firstChild.firstChild.attributes.PageSize;
      trace(totalRecord);
      trace(totalPage);
      trace(now_Page);
      for (i=0; i
      name_arr[i] = total_arr[i].attributes.Name;
      sex_arr[i] = total_arr[i].attributes.Sex;
      email_arr[i] = total_arr[i].attributes.Email;
      time_arr[i] = total_arr[i].attributes.Time;
      homepage_arr[i] = total_arr[i].attributes.Homepage;
      title_arr[i] = total_arr[i].attributes.Title;
      content_arr[i] = total_arr[i].attributes.Content;
      reply_arr[i] = total_arr[i].attributes.Reply;
      }
      showmessage();
      }
      function showmessage() {
      _parent.txt._visible = true;
      _parent.txt.total_txt.text = "一共有" totalRecord "記錄";
      _parent.txt.nowpage_txt.text = this_nowpage "/" totalPage;
      for (i=0; i
      this.message_load_mc.attachMovie("message_mc", "message_mc" i, i);
      this.message_load_mc["message_mc" i].name_txt.text = name_arr[i] "(" sex_arr[i] ")";
      this.message_load_mc["message_mc" i].title_txt.text = title_arr[i];
      this.message_load_mc["message_mc" i].content_txt.text = content_arr[i];
      this.message_load_mc["message_mc" i].reply_txt.text = reply_arr[i];
      trace(this.message_load_mc["message_mc" i].reply_txt.text);
      this.message_load_mc["message_mc" i].time_txt.text = time_arr[0];
      this.message_load_mc["message_mc" i].back_2._y = this.message_load_mc["message_mc" i].back_1._y this.message_load_mc["message_mc" i].back_1._height 2;
      scroll_1 = this.message_load_mc["message_mc" i].content_txt.maxscroll;
      this.message_load_mc["message_mc" i].content_txt._height = scroll_1*18;
      this.message_load_mc["message_mc" i].back_2._height = this.message_load_mc["message_mc" i].content_txt._height 15;
      scroll_2 = this.message_load_mc["message_mc" i].reply_txt.maxscroll;
      this.message_load_mc["message_mc" i].reply_txt._height = scroll_2*18;
      if (this.message_load_mc["message_mc" i].reply_txt.text == "") {
      this.message_load_mc["message_mc" i].back_3._height = 30;
      } else {
      this.message_load_mc["message_mc" i].back_3._height= this.message_load_mc["message_mc" i].reply_txt._height 10;
      }
      this.message_load_mc["message_mc" i].back_3._y= this.message_load_mc["message_mc" i].back_2._y this.message_load_mc["message_mc" i].back_2._height 2;
      this.message_load_mc["message_mc" i].txt_1._y= this.message_load_mc["message_mc" i].back_3._y 5;
      this.message_load_mc["message_mc" i].reply_txt._y= this.message_load_mc["message_mc" i].txt_1._y;
      this.message_load_mc["message_mc" i]._x = 0;
      this.message_load_mc["message_mc" i]._y = temp;
      temp = temp this.message_load_mc["message_mc" i]._height 15;
      this.message_load_mc["message_mc" i].btn1.onRelease = function() {
      homepage_num = Number(this._parent._name.slice(10));
      str_1 = homepage_arr[homepage_num];
      getURL(str_1, "_blank");
      };
      this.message_load_mc["message_mc" i].btn2.onRelease = function() {
      email_num = Number(this._parent._name.slice(10));
      str_2 = email_arr[email_num];
      getURL("mailto:" str_2);
      trace(str_2);
      };
      }
      trace(" " this._height);
      _parent.b_2 = -1*this._height 250;
      }

      以上的所有的操作,測試時需要在ASP環境下。
      以上假如有不確當的術語,請諒解!
      感謝您閱讀我的心得!謝謝!
      可以把“FLASH留言板原文件” 中的內容全拷到ASP環境下
      如 /web/index.html 就可以了
      文件夾中提供了后臺治理系統供大家學習和測試flash.rar

      分享:Flash中MP3導入及同步歌詞的方法
      了解音樂的幾種常見格式:1、mp3(mpeg-1audiolayer3):能夠以高音質、低采樣率對數字音頻文件進行壓縮。換句話說,音頻文件(主要是大型文件,比如WAV文件

      來源:閃吧//所屬分類:Flash教程/更新時間:2008-03-05
      相關Flash教程