The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          #

          FireFox 是遵守W3C, 沒有event
           

          所以可能會出現" event is not defined "

          而IE event給于window.event,

           

           

          解決方法:

              funname( event,....)  {

           

             var evt = event ? event : (window.event ? window.event : null);

          ..........

             

             }

           

          調用時要加上event參數 onmouseover="javascript: funname(event, ....); "

           

          3.注意:

           

          IE 的 event.srcElement <==>  Firefox 中的 event.target

          IE 的 a.innerText  <==>  Firefox 中的 a.textContent

          IE 的 document.all[obj].style <==>  Firefox 中的 document.getElementById(obj).style
          posted @ 2010-06-04 14:56 Eric_jiang 閱讀(2394) | 評論 (0)編輯 收藏

          一個很簡單的問題,但是研究半天,給出標準答案,XP或2003下
          如FSO,在NTFS格式下
          Regsvr32 %systemroot%\system32\scrrun.dll
          如果注冊成功,但ASP中依然無法使用
          先看scrrun.dll在NTFS格式下的權限,看是否加入user組中,如沒有請用下命令
          cacls %systemroot%\system32\scrrun.dll /d guests
          而在FAT32格式下面,因為沒有文件權限,無需要上面的步驟
          而注冊表中依然有用戶權限
          請查看HKEY_CLASSES_ROOT\Scripting.FileSystemObject的權限,請加上User組可讀可運行權限
          同理,別的DLL組件能注冊成功但無法使用也大多是這種問題

          簡單的回答一下,因為IIS的登錄用戶不是DLL注冊時候的用戶。解決方法 把IIS用戶改為你這個DLL注冊的用戶,或者 有沒有辦法把這個DLL注冊給所有用戶!不知道你懂沒,反正就這么點回答了!administrator 設置密碼,而且IIS用戶那里自己輸入administrator 和密碼 別去查找!
          posted @ 2010-06-04 08:31 Eric_jiang 閱讀(1550) | 評論 (0)編輯 收藏

          只要將下面的批處理命令復制到 => 任意文件名.bat中運行相應的批處理文件就好了。

          注銷或重啟后生效。

          設置窗口背景顏色為淡綠保護你的眼睛,色調85,飽和度 90,亮度205(即:紅204,綠232,藍207):

          @echo off
          reg add "HKCU\Control Panel\Colors" /v "Window" /t REG_SZ /d "204 232 207" /f

          還原窗口背景為白色:
          @echo off
          reg add "HKCU\Control Panel\Colors" /v "Window" /t REG_SZ /d "255 255 255" /f

          posted @ 2010-06-03 17:05 Eric_jiang 閱讀(732) | 評論 (0)編輯 收藏

          1.ASP部分
          a.建立語言包
          1.在各個子系統建立"語言包"目錄 ,
          如BBS--> language -->Simplified
          --->Traditional
          --->English
          2 為每個ASP,js,HTC 建立語言文件,如ACMBBStopic.asp.lang ,treeview.htc.lang ,
          用來存放語言全局變量。
          如目錄Language\English\ ACMBBSShow.asp.lang
          Public Const LangRollway="reverse roll"
          Public Const LangInvaildUser="invaild user"
          Public Const LangMailbox="mail box"
          Public Const LangSysSetup="system setup"
          Public Const LangACMBBS="Acer BBS"
          Public Const LangBulltn="Acer bulltin"
          Public Const LangPersnSetup="personal setting"
          Public Const LangPublicTools="Public Tools"
          如目錄Language\ Simplified \ ACMBBSShow.asp.lang
          Public Const LangRollway="反向滾動"
          Public Const LangInvaildUser="非法用戶"
          Public Const LangMailbox="郵件資料夾"
          Public Const LangSysSetup="系統設置"
          Public Const LangACMBBS="明碁網咖"
          Public Const LangBulltn="公告欄"
          Public Const LangPersnSetup="個人設定"
          Public Const LangPublicTools="群組工具"
          語言全局變量命名規則;
          必須是VBscript 變量定義方式 Public Const
          變量名為 : "Lang" + Message Descption

          b. 設定Global.asa
          SUB Session_OnStart
          Session.CODEPAGE="1252" '1252En '950繁體 '936簡體
          Session.Contents("Language")="EngLish" 'EngLish 'Traditional 'Simplified
          Session.Contents("StrCharset")="big5" 'iso-8859-1 'big5 'gb2312
          End Sub
          c. 引用語言包
          1.建立 BBS--> language -->script 目錄, IncludeLang.vbs
          2.在各個asp,js,HTC頭部


          3.使用思想
          o 將 *.lang 等語言包用Function GetFileContents 讀到變量中,
          o 使用vbscript中EXECUTE方法在Server執行
          IncludeLang.vbs 內容如下

          '//'*********************************************************
          '// ' Purpose: open include 文件
          '// ' Inputs: strIncludeFile 路徑
          '// ' Returns: All Text
          '//'*********************************************************

          Function GetFileContents(strIncludeFile)
          On Error Resume Next
          Dim objFSO
          Dim objText
          Dim strPage
          Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
          Set objText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile))
          GetFileContents= objText.ReadAll
          objText.Close
          Set objText = Nothing
          Set objFSO = Nothing
          IF Err Then
          Response.Write "Error open this language package file<<" & strIncludeFile & ">>!"
          Response.End
          END IF
          End Function

          '//'*********************************************************
          '// ' Purpose: 動態 include 文件
          '// ' Inputs: strIncludeFile 路徑,語言種類
          '// ' Returns: 執行變量到全局變量
          '//'*********************************************************
          Function IncludeLangFile(StrFileName,Language)
          On Error Resume Next
          dim StrLangPackagePath
          dim StrLanguagePath
          StrLanguagePath=Language
          StrLangPackagePath="./Language/" & StrLanguagePath & "/" & StrFileName
          Execute(GetFileContents(StrLangPackagePath))
          IF Err Then
          Response.Write "Error Include this language package file<<" & strIncludeFile & ">>! check the file's syntax"
          Response.End
          END IF
          End Function
          2.圖片部分
          為帶有漢字圖片建立 BBS--> language -->simplified-->Image
          --->traditional-->Image
          --->English -->Image
          動態Include



          3.COM部分
          使用resource file 控制語言版本,由系統自動判斷語言版本

          注意: resource file 簡體字碼必須在簡體機器輸入,繁體字碼必須在繁體機器輸入


          4.其他

          多語言版本參考規則﹕
          1.英文翻譯長度盡量與漢語長度相當。
          2.要符合各個版本的語言習慣。
          3.英文版中Title ,text標簽文本﹐按鈕文本﹐select option 中英文單詞 首字母大寫,但
          介詞﹐連詞 ,冠詞 使用小寫。
          4. 英文版中縮寫全部使用大寫。
          5. 英文版中check ,radio ,英文首字母大寫.
          6. 英文版中狀態信息使用小寫。

          posted @ 2010-06-03 15:36 Eric_jiang 閱讀(262) | 評論 (0)編輯 收藏

           這篇文章主要是為想將自己的ASP水平提高的人寫的!把ASP代碼變成組件,開發者不僅是加快了ASP的速度,而且也能保護自己的代碼.這篇文章寫出來,也是為了給想開發組件網友上一堂入門課! 下面,我們會來編寫一個非常簡單的組件,重點是知道怎樣開發DLL組件,而不是其復雜的代碼!這些都要靠你們自己以后的努力了.

            服務器端組件

            首先,服務器端的組件要有別于客戶端的組件.客戶端的組件是通過網絡傳輸,依靠HTML來起作用.而且只能在IE上有用.但是服務器端的組件是運行在服務器端,它在服務器上執行各種操作.因此,所有的瀏覽器都能享用,它依靠的是服務器而不是瀏覽器.

            當IIS被請求執行一個ASP程序,它首先會在ASP文件中找到〈% %>標簽之間的代碼,并且執行它(也可以是〈script runat=server>〈/script>之間的代碼).如果這個ASP程序在先前被調用過,那么它就會用內存中的編譯過的程序來向用戶返回HTML代碼,如果沒有,那么它就重新編譯.這里ASP就比CGI多一點速度優勢,因為CGI是每一個請求都使用一個線程.這樣就大大消耗了服務器的資源.

            想不想你寫的程序自己就能在IIS運行!?!現在你就行了!使用VB5(當然現在是VB6了),你就能建立Dynamic Linked Libraries (DLL文件),它能在IIS上直接運行(如果有asp文件來請求的話).

            系統和軟件的要求

            你需要一個32位的操作系統來運行ASP.當然你也得安裝IIS或PWS.我們下面的程序是在windows95+PWS+VB5的環境下開發的.

            我們開始吧

            啟動你的VB,選擇ActiveX圖標.這個圖標可以在新建工程找到!VB會提供一個默認的工程名(project1)和類名(class1).我們會將這兩個名字都改掉.在改名之前,請首先確認我們擁有Microsoft Active Server Pages Object Library,它在我們的程序非常有用.從菜單中選擇"工程",然后在其中選擇"引用",就會出現"引用"窗口從中選擇Microsoft Active Server Pages Object Library.

            給工程和類命名

            現在我們來根據自己的愛好來為project1和class1來命名吧!給它們命名也是很重要的,我們以后會用這個工程名和類名來創建這個組件的實例!后面詳細介紹.

            如何改名,我就不想多說了!我們的工程名改為Exmaple,類名為Helloword

            怎樣使用工程和類

            現在我們有了我們自己的工程(Example1)和類名(HelloWorld).以后我們就會在ASP代碼中使用它們的名字來引用這個組件.在ASP中我們就這樣引用,如下:

            Set ObjReference = Server.CreateObject("ProjectName.ClassName")

            對于我們工程的引用就是:Set ObjReference = Server.CreateObject("Example1.HelloWorld")

            現在我們就能用ObjReference來調用我們在組件中所創建的函數,子程序.下面我們會來寫一個SayHello的子程序,我們執行它的代碼如下:

          〈%
          Set ObjReference = Server.CreateObject("Example1.HelloWorld")
          ObjReference.SayHello
          %>

            為了在Helloword類中使用ASP的方法,你必須在此類中寫一個OnStartPage子函數.如下:

          Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
          Set MyScriptingContext = PassedScriptingContext
          End Sub

            

            現在,無論什么時候用戶訪問一個帶有本組件的ASP文件,IIS就會把ScriptingContext傳送給我們的對象請我們使用.這個ScriptingContext包括了全部的ASP方法和屬性.實現上,這使得我們有能力訪問所有ASP的對象.看下面的代碼:

          Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
          Set MyScriptingContext = PassedScriptingContext
          Set MyApplication = MyScriptingContext.Application
          Set MyRequest = MyScriptingContext.Request
          Set MyResponse = MyScriptingContext.Response
          Set MyServer = MyScriptingContext.Server
          Set MySession = MyScriptingContext.Session
          End Sub


            以后我們就能用在VB中用MyApplication來代替ASP中的Application,同理可以代替Request,Server.....,不過我們來是要在OnStartPage之前來申明這些變量:

          Private MyScriptingContext As ScriptingContext
          Private MyApplication As Application
          Private MyRequest As Request
          Private MyResponse As Response
          Private MyServer As Server
          Private MySession As Session

            

            使用ASP的對象我們的變量現在就能像標準的ASP對象來使用了!比如,我們經常在ASP中用Request.form()來收集提交表單的數據.現在我們在我們的VB中實現這個功能,代碼如下:

            用ASP中實現:
          〈%
          MyTempVariable = Request.Form("userName")
          Response.Write ("you entered "& MyTempVariable & "as your user name")
          %>

            在VB中實現:

          MyTempVariable = MyRequest.Form("userName")
          MyResponse.Write ("you entered "& MyTempVariable & "as your user name")


            通過使用MyResponse來代替Response,我們能夠使用所有Response的方法,當然,MyResponse這個名字可以隨便來取,你甚至可以就取Response.另一件我們得注意的是,我們得在我們的建立的類中,寫上OnEndPage子函數,這個OnStartPage是相反的!OnStartPage是創建對象,OnEndPage是消毀對象.

            

          Public Sub OnEndPage()
          Set MyScriptingContext = Nothing
          Set MyApplication = Nothing
          Set MyRequest = Nothing
          Set MyResponse = Nothing
          Set MyServer = Nothing
          Set MySession = Nothing
          End Sub

            

            SayHello方法我們來建立一個子函數,用于顯示"Holle World".這個SayHello方法只是HelloWorld這個類中一個子函數,我們以后會在ASP中用以下的顯示這個方法

          〈%
          Set ObjReference = Server.CreateObject("Example1.HelloWorld")
          ObjReference.SayHello
          %>

            SayHello的程序,很簡單的!

          Public Sub SayHello()
          MyResponse.Write ("Hello World")
          End Sub

            

            現在一個小型的組件編寫完成,剩下的工作就是編譯這個組件,在"工程"菜單中保存它,取什么名字都可以,我們用Exmaple1.vbp吧!然后就用在菜單中選擇"make exmaple1.dll",將其編譯成DLL文件.一個組件就真正完成了!

            注意,編譯了此組件那么你就得先把你的PWS關掉,然后再編譯此組件.否則VB就會告訴你些組件在使用中.

            在ASP中使用我們的自己的組件.

            當你更正了在編譯中的錯誤,成功地編譯了example1這個工程,現在你就得拿出你最喜歡的HTML編輯器來寫下下面的語句,保存為ASP文件.

            〈HTML>〈HEAD>〈TITLE>Example 1〈/TITLE>〈/HEAD>

            〈BODY>

          〈%
          Set ObjReference = Server.CreateObject("Example1.HelloWorld")
          ObjReference.SayHello
          %>

            〈/BODY>〈/HTML>

            運行后即可看到結果:

            Hello World

            注冊組件

            如果你想和你的朋友,鄰居分享你的組件,那么你就得在你的系統上注冊你的組件.我們一般使用Regsvr32.exe來注冊組件.注冊后你的組件會出現在Win95/Win98的windows/system目錄中.下面是一個注冊的例子:

            Regsvr32.exe C:/wwwroot/Example1/Example1.dll

            在你的系統中,VB會自動給你注冊,所以你很少用到Regsvr32.exe

            我們這里只是寫了一個非常小的組件,你們可以寫好自己的更大的組件,而且還可以用VB中的很多控件.

            讓我們用組件來擴展我們的程序的功能吧!也希望多多的看到我們中國人的組件.

          posted @ 2010-06-01 20:34 Eric_jiang 閱讀(2224) | 評論 (0)編輯 收藏

          封裝為dll會帶來很多的好處,主要包括只是產權的保護,以及效率和安全性能的提升。這個例子中被封裝的dll文件可以隱藏access數據庫的實際路徑。

          VB生成的DLL封裝ASP代碼來連接數據庫(Access)。

          本文用一個最簡單的連接access數據庫的例子來說明如何將asp代碼封裝為dll文件。

          我們用vb,最常見的方式來封裝asp代碼。

          我們需要封裝的對象如下:

          'Proconn.asp
          dim ProConn
          set ProConn=Server.CreateObject("ADODB.CONNECTION")
          ProConn.Open "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" & Server.MapPath("DB.asp")

          我們將下面的部分封裝
          "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" & Server.MapPath("DB.asp")

          分析一下這段要封裝的內容,
          它的前半部分就是一個字符串:
          "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="
          用&連接上后半部分的另一個字符串。
          后半部分的另一個字符串是Server.MapPath對象函數的返回值。

          下面開始這個封裝的操作過程。
          首先
          新建一個VB下的ActiveX DLL工程,工程的名稱Project1更改成ConDBDLL
          方法class1的名稱更改成cs
          工程名和方法名會在調用這個DLL的時候使用到,大家可以按照自己命名規則定義,但請注意好好使用。
          這個DLL的代碼部分書寫如下:

          Dim rp As Response
          Dim rq As Request
          Dim ap As Application
          Dim sr As Server
          Dim sn As Session

          Public Sub OnStartPage(MyScriptingContext As ScriptingContext)
          Set rp = MyScriptingContext.Response
          Set rq = MyScriptingContext.Request
          Set sr = MyScriptingContext.Server
          Set ap = MyScriptingContext.Application
          Set sn = MyScriptingContext.Session
          End Sub

          Public Sub OnEndPage()
          Set rp = Nothing
          Set rq = Nothing
          Set sr = Nothing
          Set ap = Nothing
          Set sn = Nothing
          End Sub
          '以上語句是必須的,將原本的對象作了簡化處理,并在兩個基本函數中作了處理

          Public Function ConnectDB() As Variant
          ConnectDB = "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="
          End Function
          '上面這個函數是處理前半部分字符串的,直接返回這個字符串的內容

          '另外定義下面這個函數來處理后半部分內容
          Public Function DBPath() As Variant
          DBPath = sr.MapPath("DB.asp")
          End Function
          '注意上面使用的是sr,不要使用成Server了

          到了關鍵的一步,給這個工程添加"Microsoft Active Server Pages ObjectContext Object Library" 的 Reference
          添加方法,選擇菜單中的"Project"->"Reference",在打開的對話框里選擇。
          對了,還要選擇上"microsoft activeX data objects 2.6 library"

          進行完以上操作,我們就可以編譯生成DLL了,(別忘了前面的改工程名和方法名)

          準備好數據庫文件DB.asp (由DB.mdb更改后綴而成,密碼123)

          下面就是調用封裝的連接數據庫的asp文件代碼:

          由于是自己創建的DLL,把它拷貝到相應的目錄后,必須注冊才能使用。
          注冊的方法,在“運行”中執行:
          Regsvr32.exe dllname.dll

          取消這個DLL的注冊的方法是:Regsvr32.exe /u dllname.dll

          注冊完畢,我們的工作基本上就做完了,現在我們可以使用這樣的封裝方法連接具有針對性的數據庫了。

          不過有一點需要特別注意的是:
          由于
          Dim ConDB
          set ConDB=Server.CreateObject("ConDBDLL.Conn")
          'ConDB就是創建的DLL對象
          這是在ASP中創建的對象,包括ProConn,那么我們在任何使用到(引用)ProConn.asp的其他ASP文件中記得釋放這兩個對象!
          ProConn.close
          set ProConn=nothing
          set ConDB=Nothing
          否則系統會由于對象沒有釋放,而變得越來越不堪重負。

          關于這個封裝ASP代碼連接Access數據庫的方法,我想完全適用其他數據庫的連接方法。


          再例如,下面的封裝的例子:

          首先要申明變量:

          Private WenScriptingContext As ScriptingContext
          Private WenApplication As Application
          Private WenRequest As Request
          Private WenResponse As Response
          Private WenServer As Server
          Private WenSession As Session

          為了在WenConnection類中使用ASP的內建對象,必須在此類中寫一個OnStartPage子函數。那是因為無論什么時候用戶訪問一個帶有本組件的ASP文件,IIS就會把ScriptingContext傳送給我們的對象請我們使用。這個ScriptingContext包括了全部的ASP方法和屬性,這使得我們有能力訪問所有ASP的對象。

          Public Sub OnStartPage (PassedScriptingContext As ScriptingContext)
          Set WenScriptingContext = PassedScriptingContext
          Set WenApplication = WenScriptingContext.Application
          Set WenRequest = WenScriptingContext.Request
          Set WenResponse = WenScriptingContext.Response
          Set WenServer = WenScriptingContext.Server
          Set WenSession = WenScriptingContext.Session
          End Sub

          我們既然用OnStartPage函數來創建對象,那么我們這里就用OnEndPage子函數來釋放對象:

          Public Sub OnEndPage()
          Set WenScriptingContext = Nothing
          Set WenApplication = Nothing
          Set WenRequest = Nothing
          Set WenResponse = Nothing
          Set WenServer = Nothing
          Set WenSession = Nothing
          End Sub

          接下來定義兩個函數RsResult()和DataSource():

          Public Function Rs(strsql As String) As Recordset
          Dim oConn As Connection
          Dim oRs As Recordset
          Dim strconnstring As String
          strconnstring = "driver={sql server};server=ServerName;uid=sa;pwd=;" & _
          "database=DataBaseName"
          oConn.Open strconnstring
          oRs.ActiveConnection = oConn
          strsql="Select * From tableName"
          oRs.Open strsql, oConn, 1, 3
          Set Rs = oRs
          End Function

          Public Function DataSourceConnection() As Variant
          DataSourceConnection = "driver={sql server};server=ServerName;uid=sa;pwd=;database=DataBaseName"
          End Function

          三、 存工程名為WenADODB.vbp和保存類名為WenConnection.cls,然后點擊“文件”—>“生成WenADODB.DLL”編譯成動態連接庫文件。VB在編譯好動態連接庫文件的同時也將該組件注冊到注冊表里了,要是想在另外一臺機器上注冊該組件的話,請用以下指令注冊或反注冊:

          Regsvr32 x:\路徑\WenADODB.dll x:\路徑\為WenADODB.dll文件存放的盤符和路徑

          Regsvr32 /u x:\路徑\WenADODB.dll 參數U為反注冊

          四、 在ASP文件中調用WenADODB.dll組件的例子。

          <%

          Set Conn=Server.CreateObject("WenADODB.WenConnection") ‘調用組件創建對象實例
          objConn=Conn.DataSourceConnection()
          application("strconn")=objConn

          set Rs=Server.CreateObject("ADODB.Recordset")
          sql="select * from TableName order by ID DESC"
          Rs.open sql,application("strconn"),1,3
          %>
          <Table align="center" border="1">
          <%
          if Rs.Bof and Rs.Eof then
          Response.Write "暫時還沒有任何數據。"
          else
          Do while not Rs.Eof
          %>
          <tr width=100%>
          <td width=50%><%=Rs("Field1")%></td><td width=50%><%=Rs("Field2")%></td>
          </tr>
          <%
          Rs.MoveNext
          Loop
          end if
          Rs.Close;Set Rs=Nothing
          %>
          </Table>

          五、 小結

          我們這里只是編寫了一個連接數據庫的簡單的動態連接庫文件,利用VB的強大組件編寫功能還可以寫出功能更加強大跟齊全的組件,來完成更加實用的任務

          關鍵字 如何把ASP編寫成DLL

          這篇文章主要是把ASP代碼變成組件,開發者不僅是加快了ASP的速度,而且也能保護自己的代碼.
          下面,我們會來編寫一個非常簡單的組件,重點是知道怎樣開發DLL組件,而不是其復雜的代碼!這些都要靠你們自己以后的努力了.

          服務器端組件

          首先,服務器端的組件要有別于客戶端的組件.客戶端的組件是通過網絡傳輸,依靠HTML來起作用.而且只能在IE上有用.但是服務器端的組件是運行在服務器端,它在服務器上執行各種操作.因此,所有的瀏覽器都能享用,它依靠的是服務器而不是瀏覽器.

          當IIS被請求執行一個ASP程序,它首先會在ASP文件中找到〈%%>標簽之間的代碼,并且執行它(也可以是〈scriptrunat=server>〈/script>之間的代碼).如果這個ASP程序在先前被調用過,那么它就會用內存中的編譯過的程序來向用戶返回HTML代碼,如果沒有,那么它就重新編譯.這里ASP就比CGI多一點速度優勢,因為CGI是每一個請求都使用一個線程.這樣就大大消耗了服務器的資源.

          想不想你寫的程序自己就能在IIS運行!?!現在你就行了!使用VB5(當然現在是VB6了),你就能建立DynamicLinkedLibraries(DLL文件),它能在IIS上直接運行(如果有asp文件來請求的話).

          系統和軟件的要求

          你需要一個32位的操作系統來運行ASP.當然你也得安裝IIS或PWS.我們下面的程序是在windows95+PWS+VB5的環境下開發的.

          我們開始吧

          啟動你的VB,選擇ActiveX圖標.這個圖標可以在新建工程找到!VB會提供一個默認的工程名(project1)和類名(class1).我們會將這兩個名字都改掉.在改名之前,請首先確認我們擁有MicrosoftActiveServerPagesObjectLibrary,它在我們的程序非常有用.從菜單中選擇"工程",然后在其中選擇"引用",就會出現"引用"窗口
          從中選擇MicrosoftActiveServerPagesObjectLibrary.

          給工程和類命名

          現在我們來根據自己的愛好來為project1和class1來命名吧!給它們命名也是很重要的,我們以后會用這個工程名和類名來創建這個組件的實例!后面詳細介紹.

          如何改名,我就不想多說了!
          我們的工程名改為Exmaple,類名為Helloword

          怎樣使用工程和類

          現在我們有了我們自己的工程(Example1)和類名(HelloWorld).以后我們就會在ASP代碼中使用它們的名字來引用這個組件.在ASP中我們就這樣引用,如下:

          SetObjReference=Server.CreateObject("ProjectName.ClassName")

          對于我們工程的引用就是:
          SetObjReference=Server.CreateObject("Example1.HelloWorld")
          現在我們就能用ObjReference來調用我們在組件中所創建的函數,子程序.下面我們會來寫一個SayHello的子程序,我們執行它的代碼如下:


          〈%
          SetObjReference=Server.CreateObject("Example1.HelloWorld")
          ObjReference.SayHello
          %>


          為了在Helloword類中使用ASP的方法,你必須在此類中寫一個OnStartPage
          子函數.如下:


          PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)
          SetMyScriptingContext=PassedScriptingContext
          EndSub



          現在,無論什么時候用戶訪問一個帶有本組件的ASP文件,IIS就會把ScriptingContext傳送給我們的對象請我們使用.這個ScriptingContext包括了全部的ASP方法和屬性.實現上,這使得我們有能力訪問所有ASP的對象.看下面的代碼:


          PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)
          SetMyScriptingContext=PassedScriptingContext
          SetMyApplication=MyScriptingContext.Application
          SetMyRequest=MyScriptingContext.Request
          SetMyResponse=MyScriptingContext.Response
          SetMyServer=MyScriptingContext.Server
          SetMySession=MyScriptingContext.Session
          EndSub


          以后我們就能用在VB中用MyApplication來代替ASP中的Application,同理可以代替Request,Server.....,不過我們來是要在OnStartPage之前來申明這些變量:


          PrivateMyScriptingContextAsScriptingContext
          PrivateMyApplicationAsApplication
          PrivateMyRequestAsRequest
          PrivateMyResponseAsResponse
          PrivateMyServerAsServer
          PrivateMySessionAsSession



          使用ASP的對象

          我們的變量現在就能像標準的ASP對象來使用了!比如,我們經常在ASP中用Request.form()來收集提交表單的數據.現在我們在我們的VB中實現這個功能,代碼如下:

          用ASP中實現:
          〈%
          MyTempVariable=Request.Form("userName")
          Response.Write("youentered"&MyTempVariable&"asyourusername")
          %>


          在VB中實現:


          MyTempVariable=MyRequest.Form("userName")
          MyResponse.Write("youentered"&MyTempVariable&"asyourusername")



          通過使用MyResponse來代替Response,我們能夠使用所有Response的方法,當然,MyResponse這個名字可以隨便來取,你甚至可以就取Response.
          另一件我們得注意的是,我們得在我們的建立的類中,寫上OnEndPage子函數,這個OnStartPage是相反的!OnStartPage是創建對象,OnEndPage是消毀對象.



          PublicSubOnEndPage()
          SetMyScriptingContext=Nothing
          SetMyApplication=Nothing
          SetMyRequest=Nothing
          SetMyResponse=Nothing
          SetMyServer=Nothing
          SetMySession=Nothing
          EndSub



          SayHello方法

          我們來建立一個子函數,用于顯示"HolleWorld".這個SayHello方法只是HelloWorld這個類中一個子函數,我們以后會在ASP中用以下的顯示這個方法


          〈%
          SetObjReference=Server.CreateObject("Example1.HelloWorld")
          ObjReference.SayHello
          %>



          SayHello的程序,很簡單的!

          PublicSubSayHello()
          MyResponse.Write("HelloWorld")
          EndSub



          現在一個小型的組件編寫完成,剩下的工作就是編譯這個組件,在"工程"菜單中保存它,取什么名字都可以,我們用Exmaple1.vbp吧!然后就用在菜單中選擇"makeexmaple1.dll",將其編譯成DLL文件.一個組件就真正完成了!


          注意,編譯了此組件那么你就得先把你的PWS關掉,然后再編譯此組件.否則VB就會告訴你些組件在使用中.

          在ASP中使用我們的自己的組件.

          當你更正了在編譯中的錯誤,成功地編譯了example1這個工程,現在你就得拿出你最喜歡的HTML編輯器來寫下下面的語句,保存為ASP文件.


          〈HTML>
          〈HEAD>
          〈TITLE>Example1〈/TITLE>
          〈/HEAD>

          〈BODY>

          〈%
          SetObjReference=Server.CreateObject("Example1.HelloWorld")
          ObjReference.SayHello
          %>

          〈/BODY>
          〈/HTML>

          運行后即可看到結果:

          HelloWorld

          注冊組件

          如果你想和你的朋友,鄰居分享你的組件,那么你就得在你的系統上注冊你的組件.我們一般使用Regsvr32.exe來注冊組件.注冊后你的組件會出現在Win95/Win98的windows/system目錄中.下面是一個注冊的例子:

          Regsvr32.exeC:/wwwroot/Example1/Example1.dll


          在你的系統中,VB會自動給你注冊,所以你很少用到Regsvr32.exe

          這里只是寫了一個非常小的組件,你可以寫好自己的更大的組件,而且還可以用VB中的很多控件.


          附錄:建立注冊DLL和反注冊DLL文件的快捷方式
          有的程序員經常要注冊或者反注冊自己寫的dll文件,加一個快捷方式會減少自己的工作量:

          Windows Registry Editor Version 5.00


          [HKEY_CLASSES_ROOT\dllfile\shell]


          [HKEY_CLASSES_ROOT\dllfile\shell\register]


          [HKEY_CLASSES_ROOT\dllfile\shell\register\command]

          @="regsvr32 %1"


          [HKEY_CLASSES_ROOT\dllfile\shell\Unregister]

          "Command"="regsvr32 %1 /u"


          [HKEY_CLASSES_ROOT\dllfile\shell\Unregister\command]

          @="regsvr32 %1 /u"

          當我們需要注冊或者反注冊dll時,只要在該dll文件上按下鼠標右鍵即可!



          附錄注冊和注銷dll文件的方法:
          一個快速注冊 DLL 及 OCX 的方法
          有時候我們在 VB 中要引用某一個 DLL 或 OCX 時,會出現文件未注冊的訊息,這時,我們可以使用人工注冊的方法,也就是直接在命令列中使用 regsvr32.exe 來做,做法如下:

          文件注冊:C:\Windows\System\Regsvr32.exe C:\Windows\System\Test.ocx
          取消注冊:C:\Windows\System\Regsvr32.exe /u C:\Windows\System\Test.ocx

          這些動作我們也可以直接寫到程序中,使用 Shell 來執行,但是我現在要說的,都不是上面提到的方法!



          1、在資源管理器中找到 C:\Windows\System\Regsvr32.exe 并【復制】 ( 按鼠標右鍵選復制 )
          2、將目錄移到 C:\Windows\SendTo 后,執行【貼上快捷方式】 ( 按鼠標右鍵選貼上快捷方式 )
          3、將快捷方式名稱改成【REGISTER】
          4、OK

          現在,如果您想替某一個文件做注冊動作,例如:C:\Windows\System\Test.ocx,您只要打開資源管理器,找到 C:\Windows\System\Test.ocx,按鼠標右鍵選【傳送到】【REGISTER】即可完成注冊動作了!

          注:有一個地方要注意的是,Regsvr32.exe 只能注冊 32 位的文件!如果要用它來注冊 16 位的文件,會有錯誤訊息產生。


          附錄 某些dll文件的功能:
          一、輕松修復IE瀏覽器

            很多經常上網的朋友都有過 這樣的遭遇:IE不能打開新的窗口,用鼠標點擊超鏈接也沒有任何反應。這時重裝IE一般能解決問題。其實不必這么麻煩,使用Regsvr32命令就可以輕松搞定。

            在“開始→運行”中鍵入“regsvr32 actxprxy.dll”命令,點擊“確定”按鈕,這時會彈出一個信息對話框“DllRegisterServer in actxprxy.dll succeeded”,點擊“確定”;然后再在“開始→運行”中鍵入“regsvr32 shdocvw.dll”命令,單擊“確定”即可。重新啟動后IE已經被輕松修復了。

          二、解決Windows無法在線升級的問題

            Windows的漏洞很多,每隔一段時間就需要使用“Windows Update”升級程序進行在線升級,不過“Windows Update”經常出現無法使用的情況,這時,我們可以使用Regsvr32來解決這個問題。

            在“開始→運行”中鍵入“regsvr32 wupdinfo.dll”,點擊“確定”按鈕,這樣在系統中就重新注冊了“Windows Update”組件,重新啟動后問題已經解決。

          三、防范網絡腳本病毒有新招

            網絡腳本病毒嵌在網頁中,上網時在不知不覺中機器就會感染上這種病毒。筆者認為單純使用殺毒軟件并不能有效地防范這些腳本病毒,必須從病毒傳播的機理入手。網絡腳本病毒的復制、傳播都離不開FSO對象(File System Object,文件系統對象),因此禁用FSO對象就能有效地控制腳本病毒的傳播。操作方法很簡單:

            在“開始→運行”中鍵入“regsvr32 /u scrrun.dll”就可以禁用FSO對象;如果需要使用FSO對象,鍵入“regsvr32 scrrun.dll”命令即可。

          四、卸載Win XP自帶的“雞肋”功能

            Win XP以功能強大而著稱,但有些功能卻常常令人有“雞肋”之感,比如Win XP自帶的ZIP功能和圖片預覽功能,不僅占用了系統資源,功能也遠不如第三方軟件強大。其實用Regsvr32命令可以很容易地卸載這些功能。

            在“開始→運行”中鍵入“regsvr32 /u zipfldr.dll”,單擊“確定”按鈕,彈出卸載成功信息框后就完成了ZIP功能的卸載;要恢復ZIP功能,鍵入“regsvr32 zipfldr.dll”即可。同樣,卸載圖片預覽功能也很簡單,在“開始→運行”中鍵入“regsvr32 /u thumbvw.dll”即可;如果要恢復該功能,只須鍵入“regsvr32 thumbvw.dll”。

          五、讓WMP播放器支持RM格式

            很多朋友喜歡用Windows Media Player(以下簡稱WMP)播放器,但是它不支持RM格式,難道非得安裝其它播放軟件嗎?筆者有辦法。

            以Win XP為例,首先下載一個RM格式插件,解壓縮后得到兩個文件夾: Release(用于Windows 9x)和Release Unicode (用于Windows 2000/XP);將Release Unicode文件夾下的RealMediaSplitter.ax文件拷貝到“系統盤符\WINDOWS\System32\”目錄下;在“開始→運行”中鍵入“regsvr32 RealMediaSplitter.ax”,點擊“確定”即可。接著下載解碼器,如Real Alternative,安裝后就能用WMP播放RM格式的影音文件了。

          附錄:注冊和反注冊dll文件的批處理



          dll.bat
          ------------------------------
          @Regsvr32.exe AdminDLL.dll


          un.bat
          -------------------------------------
          @Regsvr32.exe /u AdminDLL.dll
          posted @ 2010-06-01 12:47 Eric_jiang 閱讀(471) | 評論 (0)編輯 收藏

          譯者序
          原書序
          致謝
          第1章 由隨意編程轉變為遵循軟件工程原則
          1.1 規則1-1:最大限度地發揮VB編譯期類型檢查的潛能
          1.1.1 在每個模塊的頂端使用Option Explicit語句
          1.1.2 避免不經意地使用Variant數據類型
          1.1.3 在VB IDE中運行時,使用Start With Full Compile命令
          1.2 規則1-2:使用Debug.Assert顯式聲明假設
          1.3 規則1-3:編譯期條件不同時,考慮使用#If語句
          1.4 規則1-4:拋出錯誤以提示異常
          1.5 規則1-5:有效的錯誤處理:局部捕獲,全局處理
          1.6 規則1-6:了解類型和類的區別
          1.7 規則1-7:采用面向對象的設計方法
          1.8 規則1-8:推薦采用用戶自定義類型而不是類來定義值類型
          1.9 規則1-9:一般任務的自動化

          第2章 設計、構建和使用基于COM的組件
          2.1 規則2-1:從接口的角度進行思考
          2.2 規則2-2;使用自定義接口
          2.3 規則2-3:最好使用IDL獨立定義自定義接口
          2.4 規則2-4:使用自定義回調避免基于類的事件的局限性
          2.5 規則2-5:要謹慎保持兼容性
          2.5.1 腳本客戶端程序
          2.5.2 已編譯的客戶端程序
          2.5.3 版本兼容的接口
          2.6 規則2-6:選用正確的COM激活技術
          2.6.1 COM激活
          2.6.2 New操作符
          2.6.3 CreateObject
          2.6.4 GetObject
          2.6.5 GetObjectContext.CreateInstance和Server.CreateObject
          2.6.6 性能考慮
          2.7 規則2-7:慎重使用Class_Terminate
          2.8 規則2-8:根據會話而不是實體來建模
          2.9 規則2-9:除了簡單的小規模應用系統,避免使用ActiveX可執行程序

          第3章 MTS、COM+和VB-中間層
          3.1 規則3-1:理解MTS和COM+應用程序設計
          3.2 規則3-2:不要在MTS或COM+中使用單例
          3.3 規則3-3:了解New、CreateObject及GetObjectContext.CreateInstance的適用場合
          3.3.1 MTS和Windows NT4
          3.3.2 COM+和Windows 2000
          3.3.3 使用New遇到的更多問題
          3.4 規則3-4:理解使用SetComplete的真實目的
          3.5 規則3-5:對事務自動中止方式的思考
          3.6 規則3-6:不要重新設計DBMS
          3.7 規則3-7:不必配置所有組件
          3.8 規則3-8:避免將以后會后悔的東西編譯進DLL
          3.9 規則3-9:將代碼從MTS向COM+移植的實踐技巧
          3.9.1 在COM+中不再需要調用GetObjectContext.CreateInstance
          3.9.2 將Me作為參數傳遞時,不再需要調用SafeRef
          3.9.3 當事務中的次要對象返回錯誤時要小心;可能會獲得形如"Method~of Object Failed~"的錯誤信息,而不是所指定的在錯誤傳播之前返回的豐富錯誤信息
          3.9.4 使用ObjectConstruct字符串
          3.9.5 在COM+應用程序中進行進程內調用時執行聲明性安全校驗
          3.9.6 在COM+中刷新組件命令不再是必需的
          3.9.7 在安裝Windows 2000以前版本的計算機上,COM+導出的客戶安裝程序需要Microsoft Installer(MSI)
          3.10 規則3-10:編寫運行于MTS和COM+中的代碼的實踐技巧
          3.10.1 創建對象時堅持使用GetObjectContext.CreateInstance
          3.10.2 使用可編程控制的安全措施對訪問權限進行校驗,而不要依賴于聲明性安全措施
          3.10.3 事務性方法調用失敗時,在次要對象中最好使用DisableCommit而不是SetAbort
          3.10.4 不要無意中將DLL安裝到用戶計算機上
          3.10.5 堅持使用ObjectContext接口
          3.10.6 分發對象引用時繼續使用SafeRef

          第4章 Web和VB
          4.1 規則4-1:理解IIS體系結構
          4.1.1 IIS的內部結構
          4.1.2 提高服務器的可擴縮性
          4.2 規則4-2:管理應用程序狀態以達到最高效率
          4.2.1 使用BAS模塊數據
          4.2.2 使用SPM
          4.2.3 使用ASP Application對象
          4.2.4 權衡各種方案的利弊
          4.3 規則4-3:管理會話狀態以達到最大可擴縮性
          4.3.1 將會話限制在單機上
          4.3.2 在客戶機上存儲會話信息
          4.3.3 使用cookie
          4.3.4 QueryString變量
          4.3.5 隱藏的表單域
          4.3.6 在數據庫中存儲狀態信息
          4.4 規則4-4:理解DCOM和HTTP的區別
          4.4.1 使用RPC和DCOM進行通信
          4.4.2 使用HTTP通信
          4.4.3 在分布式應用程序中不使用ASP
          4.4.4 使用HTTP的不利方面
          4.5 規則4-5:為腳本環境(如ASP)編寫COM組件
          4.5.1 創建默認接口
          4.5.2 向可編寫腳本的對象傳遞參數
          4.5.3 關于自定義接口
          4.5.4 解決方案
          4.6 規則4-6:理解COM對象與ASP之間如何交互
          4.6.1 ASP內置對象
          4.6.2 VB COM對象和STA
          4.6.3 充分利用STA線程模型
          4.6.4 在VB中如何訪問ASP內置對象
          4.6.5 直接訪問ASP內置對象的好處
          4.6.6 使用ASP內置對象的弊端
          4.7 規則4-7:使用XML代替專有數據傳輸格式
          4.8 規則4-8:慎重考慮表示和業務邏輯的關系
          4.8.1 使用MTS組件
          4.8.2 使用WebClasses
          4.9 規則4-9:從數據到表示的XSLT實現
          4.9.1 XSLT的概念
          4.9.2 XSLT方法的好處
          4.9.3 使用過程方法轉換數據集
          4.9.4 利用XSLT的方法轉換數據集
          4.9.5 XSLT的缺點

          第5章 VB高效數據訪問
          5.1 規則5-1:高效訪問的基礎:往返開銷、SQL語句和數據提供者
          5.1.1 使往返開銷最少
          5.1.2 確定發送SQL查詢的最好方法
          5.1.3 選擇合適的提供者
          5.2 規則5-2:不要過分封裝數據訪問
          5.2.1 純粹的面向對象技術
          5.2.2 追求純粹OOD效果的不足之處
          5.2.3 解決辦法:使用存儲過程
          5.2.4 如果需要多個數據庫服務器該如何處理
          5.3 規則5-3:切莫將數據庫連接當代數據成員
          5.4 規則5-4:死鎖是常見的-防錯性程序開發
          5.4.1 鎖定
          5.4.2 串行化事務和鎖管理器
          5.4.3 死鎖
          5.4.4 在應用程序設計中盡量減小死鎖的幾率
          5.4.5 將事務運行時間降到最短
          5.4.6 將鎖定時間降至最短 
          5.5 規則5-5:盡可能使用firehose游標
          5.6 規則5-6:作出正確的數據搜索決策(避免濫用SelectSingleNode)
          5.6.1 Seek-and-Find組件
          5.6.2 了解解決具體問題需選用哪一種方法
          posted @ 2010-05-31 19:03 Eric_jiang 閱讀(474) | 評論 (0)編輯 收藏

          1.引言
           
             許多商業應用程序允許用戶在應用程序中生成基于某些數據的報表。電子表格特別適合用于生成這樣的報表。電子表格不僅可以將數據經格式化以后以結構化的形式展現給用戶,而且為用戶提供了快速且高效的數據處理功能。正如上面所說的,OpenOffice.org的API提供了大量的類和方法以方便開發者將OpenOffice.org電子表格的功能集成到他們自己的應用程序中。在應用程序中,單擊某個按鈕就可以啟動OpenOffice.org并將應用程序生成的數據以自定義電子表格的形式展現出來。

             新手可能就這個開發領域很自然地提出一個問題:“一旦開發者正確地安裝了所有需要的軟件后,一個應用程序如何啟動OpenOffice.org的新實例以及如何獲取連接呢?”。這個問題得到了需要的回答之后,開發者還可能提出:“現在用戶應用程序已經獲取了OpenOffice.org的連接,那么應用程序應該如何將這些數據嵌入到電子表格中呢?”。在這篇文章中,我們將首先著重滿足不熟悉OpenOffice.org的API的開發者的兩個基本的需求。我們將向開發者展示如何獲取到OpenOffice.org的連接,如何將應用程序的數據轉化為電子表格形式的數據。接著我們將討論一些其他的主題,這些主題包括以編程方式構建和析構電子表格、設置電子表格的單元格的背景顏色以及單元格邊框的格式化。然而,這里需要注意的是我們只關注OpenOffice.org本身的集成,為了代碼的可讀性我們忽略了諸如錯誤處理之類的問題。在這篇文章的結尾,您將對OpenOffice.org的API處理電子表格和如何在您自己的應用程序中利用它們的相關知識有所了解。

             這篇文章涉及的應用程序是基于Swing的應用程序,它通過使用OpenOfiice.org的API來訪問OpenOffice.org的各種功能。當然,您也可以使用C++或者COM/DCOM技術來連接OpenOffice.org。此類應用程序的代碼并不一定必須基于Swing來編寫。這樣的應用程序可以使用C++、Java servlet、Java Server Page、JavaScript、VBScript、Delphi以及Visual Basic來編寫。這篇文章中使用的基于Swing的應用程序將使用NetBeans IDE來構建,并且使用NetBeans Platform作為起始點。盡管任何集成開發工具都可以被用來構建如此簡單的應用程序,但是使用NetBeans進行開發具有兩項優勢。首先,在NetBeans中我們可以充分發揮GUI構建器(即Matisse)的功能來構建用戶界面,GUI構建器可以幫助我們快速建立應用程序界面的原型。其次,將我們的應用程序基于NetBeans Platform意味著我們不需要再重頭開始,而且我們可以通過其提供的模塊框架來增強應用程序的可擴展性。這個應用程序將生成如下圖所示的不需要任何后期處理的電子表格文檔:


          電子表格中的數據來自于JTable組件。在現實情況下,這些數據往往來源于數據庫中。在上面述及的應用程序中,我們將把數據硬編碼在程序代碼中,這主要是因為數據的來源問題已經超出本篇文章的范圍了。無論數據是否是來自于數據庫,當用戶已經完成了數據的處理后,應用程序將把JTable中的數據轉換生成電子表格來呈現。除了數據之外,上面的圖還展示了以下幾個元素,這些元素將在下面的章節中述及:

            表頭,電子表格有一行使用特殊顏色(深藍色)標識的表頭。
            行顏色的交錯,電子表格中的其他行的顏色是交錯的,有的背景色是桔色,而有的是白色。
            高或者低的回復,最后一列展示了某篇文章相關的回復數量,回復量比較高的行的背景顏色是綠色,而回復量比較低的行的背景顏色是紅色,另外,在主表格的下方的兩個單元格分別使用相同的顏色來標識高或者低回復文章的作者。
            回復的總數,“Reply”列的最后一行的下方的單元格顯示了總回復數,這個單元格的格式與其他的單元格不太一樣,總回復數是通過OpenOffice.org的API來使用Calc的公式計算得到的。
          電子表格名稱,在上面圖形的左下角,您可以看到“Javalobby Analysis”這樣的名稱,而您并沒有看到Calc打開時的默認的電子表(名稱為“Sheet1”、“Sheet2”、“Sheet3”),如下文所闡述的,電子表的名稱的更改和默認電子表的移除都可以使用編程方式來實現。
             這篇文章被分為三部分,這三部分按順序描述了開發的過程:

            簡化重復的編碼任務,這一節中我們將了解OpenOffice.org的API中可復用的元素,而這些元素將在后面的章節中被集成到我們的應用程序中。
          建立用戶界面原型,為了測試最后一節中的業務邏輯,我們將構建Swing應用程序的原型。
          集成輔助性方法,應用程序的核心是將輔助性方法和用戶界面集成起來,并且執行計算,生成電子表格。
          2.系統需求
             在開始之前,請先確認以下的軟件已經安裝好了:

          OpenOffice.org,盡管這篇文章中的代碼也兼容Star Office,但是因為我們使用OpenOffice.org的API相關的JAR文件,所以最好是安裝OpenOffice.org。我們將使用在OpenOffice.org的安裝目錄下的四個JAR文件,您可以在OpenOffice.org 2.0\program\classes文件夾中找到以下四個JAR文件:juh.jar、jurt.jar、ridl.jar和unoil.jar。
          NetBeans IDE,這篇文章關注的是OpenOffice.org的API,其中討論的代碼可以使用很多種編程語言描述,可以供多種語言編寫的應用程序使用。如果您想構建這篇文章中描述的基于Swing的應用程序,您就需要去下載NetBeans 5.0或者更高的版本。
             注意:這篇文章中展現的應用場景并不需要使用OpenOffice.org SDK。如果我們要使用SDK中的idlc或者javamaker等工具,那么這個時候才需要SDK。

          3.背景知識:簡化重復的編碼工作
             當我們使用OpenOffice.org的API工作時,我們可能會重復地執行某些任務。比如說,我們設置電子表格表頭的顏色,但是同時我們也需要設置其他各行的顏色。實際上,我們經常交替地設置各行的顏色,這樣可以使得電子表格中的行更容易分辨。如果某篇文章的回復數比較高,我們會將對應的行設置為不同的顏色(綠色),而回復數比較低的行也被設置為不同的顏色(紅色)。行的顏色的設置需要編寫使用OpenOffice.org的API中的很多方法的幾行代碼,而為了避免重復編寫相同的代碼,我們將這些代碼組織到一個輔助性方法當中去,在需要進行設置的時候,我們只需要將顏色作為參數傳遞就可以了。這可以使我們的代碼易讀性更好,更容易維護。下面我們將更詳細地討論這些輔助性方法。

             請記住,以下述及的輔助性方法可以用于任何應用程序,這些輔助性方法并不依賴于本篇文章里述及的應用程序。換句話說,您可以充分地利用這些輔助性方法,在需要的時候不需要對代碼進行任何修改就可以將這些代碼粘貼到應用程序的Java文件中使用。您也可以在您的代碼中引用這些代碼,就像這篇文章中做的一樣。

            3.1 使用引導程序
             OpenOffice.org的Java API有自己的方法來引導OpenOffice.org。所謂“引導”OpenOffice.org,我們的意思是加載OpenOffice.org的啟動程序。這通過尋找juh.jar文件所在的位置,然后在這個位置或者上一級目錄查找soffice(.exe)來實現。這需要將juh.jar文件置于系統變量CLASSPATH所描述的目錄中,這樣本章構建的應用程序就可以訪問到這個文件。然而,這里需要將juh.jar文件隨同應用程序一起分發,這種情況下,這種引導機制就不奏效了。

             為了解決這個問題,有兩種可能的方法。首先,可以確保Java隨時都可以查找到soffice(.exe),這可以通過將包含可執行文件的目錄加入到Windows的PATH系統變量中(在Mac、Unix和Linux中就是LD_LIBRARY_PATH系統變量)。這種方法需要用戶進行一些操作,而我們并不希望這樣做。

             因此,我們更傾向于推薦第二種方法,這種方法需要與訪問修飾符協同工作。在Sun的JDK中,ClassLoader系統類是URLClassLoader類的實例。這個類有一個私有方法addURL,這個方法在Java系統開始的時候將被調用,從而將JAR文件以及其他相關資源添加到系統環境中。通過反射機制,我們獲取一個URLClassLoader的實例,爾后使得addURL方法達到可訪問狀態,然后再將包含可執行文件的目錄添加到URLClassLoader的URL棧中。這雖然顯得很晦澀,但是這種方法很奏效。

             但是,它真的那么奏效嗎?與系統類的訪問修飾周旋總是一件冒險的事情。addURL方法被聲明為protected型的,自然有其理由。另外,誰能保證使用的一定是Sun的JDK呢?或者Sun可能在隨后的版本中忽略這個方法?然而,Java規范對上述這些事情并沒有作出明確的聲明,因此別的JDK在默認情況下并不是將ClassLoader類的類型配置為URLClassLoader。正是這個原因,我們使用“loader instanceof URLClassLoader”這樣的檢查代碼來確保事情是如預期那樣的。這也是我們在用戶沒有使用Sun的JDK的情況下確保應用程序沒有任何異常情況而需付出的代價。

             關于過程中構建對象的更詳細的信息請參考OpenOffice.org的開發指南《第6章  Office開發》。

          public Object simpleBootstrap(String pathToExecutable) throws Exception
          {
              //Get the executable from the incoming String:
              String ooBaseDirectory = pathToExecutable.replaceAll("soffice(.exe){0,1}$","");
              System.out.println("Your ooBaseDir is: " + ooBaseDirectory);
              ClassLoader loader = ClassLoader.getSystemClassLoader();
              if (loader instanceof URLClassLoader){
                  URLClassLoader cl = (URLClassLoader)loader;
                  Class sysclass = URLClassLoader.class;
                  try {
                      Method method = sysclass.getDeclaredMethod
                          ("addURL", new Class[]{URL.class});
                      method.setAccessible(true);
                      method.invoke(cl, new Object[]{new File(ooBaseDirectory).toURL()});
                  } catch (Throwable t) {
                      t.printStackTrace();
                      throw new IOException("Error, could not add URL to system classloader");
                  }
              } else {
                  System.out.println("Error occured, URLClassLoader expected but " +
                  loader.getClass() + " received. Could not continue.");
              }
              //Get the office component context:
              XComponentContext xContext = Bootstrap.bootstrap();
              //Get the office service manager:
              XMultiComponentFactory xServiceManager = xContext.getServiceManager();
              //Create the desktop, which is the root frame of the
              //hierarchy of frames that contain viewable components:
              Object desktop = xServiceManager.createInstanceWithContext
                  ("com.sun.star.frame.Desktop", xContext );
              return desktop;
          }


             另一中方法就是使用遠程連接。在遠程連接中,服務器名稱和端口號作為參數傳遞給遠程連接方法,然后這個方法啟動OpenOffice.org并返回Desktop對象,這個對象是利用OpenOffice.org工作的起點。而且在遠程連接的情況下,您可以讓用戶選擇服務器和端口,或者您可以在代碼中使用系統設置來提供服務器和端口,這都看您的選擇。


          --------------------------------------------------------------------------------

          3.2  電子表格文檔的建立和加載
             上一節描述的方法幫助我們從服務管理器中獲取了com.sun.star.frame.Desktop服務。Desktop可以根據給定的URL來加載新的或者已經存在的組件。為了提供這樣的服務,Desktop實現了com.sun.star.frame.XcomponentLoader接口,這個接口只有一個方法根據給定的URL加載和實例化對應的組件。要構建一個新的電子表格文檔組件,可以使用“private:factory/scalc”這樣的URL。關于更詳細的信息請參考OpenOffice.org開發指南《第8章  電子表格》中的8.2.1 “電子表格文檔的建立和加載”。

          public XComponent getSpreadsheetComponent(Object desktop, String templateURL)
              throws Exception
          {
              XComponentLoader xComponentLoader =
                  (XComponentLoader)UnoRuntime.queryInterface(XComponentLoader.class, desktop);
              PropertyValue[] pPropValues;
              pPropValues = new PropertyValue[0];
              return xComponentLoader.loadComponentFromURL(templateURL, "_blank",0, pPropValues);
          }

           

             下面這個方法將由用戶界面所調用,在調用之前用戶需要將必要的參數傳遞給上面代碼中描述的方法:

          XComponent xSpreadsheetComponent =
              oooHelper.getSpreadsheetComponent(desktop, "private:factory/scalc");

           

             接著,我們需要獲取電子表格文檔對象:

          public XSpreadsheetDocument getXSpreadsheetDocument(XComponent xSpreadsheetComponent)
              throws Exception
          {
              return(XSpreadsheetDocument)UnoRuntime.queryInterface
                  (XSpreadsheetDocument.class, xSpreadsheetComponent);
          }

           

             下一個定義的方法,getXSpreadsheet( ),定義如下,這個方法幫助我們精確定位要與哪個電子表格文檔進行交互。默認情況下,Calc應用程序在啟動的時候就已經建立好了三個電子表。這三個電子表的名稱分別是“Sheet1”、“Sheet2”、“Sheet3”,這三個電子表會隨著您啟動Calc應用程序而打開。如果您將字符串“Sheet1”傳遞給getXSpreadsheet( )方法,那么接下來您所做的改動都將在“Sheet1”電子表中進行。然而,您或許想要給自定義的電子表起一個不同于默認命名方式的名字。比如說,您將電子表命名為“Javalobby Article Analyzer”。如果您將這個名字作為參數傳遞給getXSpreadsheet( )方法,一個以此字符串命名的電子表將被構建。

             然而,默認情況下,叫“Sheet1”的電子表仍然是當前電子表,所謂當前電子表就是在應用程序啟動時呈現在用戶面前的那個電子表。無論您是否新建電子表,默認的三個電子表始終都是存在的。假如您想將您自己定義的電子表設為當前狀態,您可以有兩種選擇。一種是使用在getXSpreadsheet( )方法之后定義的getXActiveSpreadsheet( )方法,另外您可以直接將默認的三個電子表刪除掉,就如下面的getXSpreadsheet( )方法中的一樣,而一旦這三個電子表被刪除之后也就只剩下您自定義的那個電子表了,所剩的最后一個電子表也就理所當然地成為當前電子表了。

          public XSpreadsheet getXSpreadsheet(XSpreadsheetDocument xSpreadsheetDocument, String name)
              throws Exception
          {
              XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
              //See section 2.5.2 of the OpenOffice.org API:
              xSpreadsheets.insertNewByName(name, (short)0);
              Object sheet = xSpreadsheets.getByName(name);
              xSpreadsheets.removeByName("Sheet1");
              xSpreadsheets.removeByName("Sheet2");
              xSpreadsheets.removeByName("Sheet3");
              return (XSpreadsheet)UnoRuntime.queryInterface(XSpreadsheet.class, sheet);
          }

           

             接下來的方法是如何將電子表設為當前電子表:

          public XSpreadsheet getXActiveSpreadsheet(XComponent xSpreadsheetComponent,
              XSpreadsheet xSpreadsheet) throws Exception
          {
              XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(XModel.class,
                  xSpreadsheetComponent);
              XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
              XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)UnoRuntime.
                  queryInterface(XSpreadsheetView.class, xSpreadsheetController);
              xSpreadsheetView.setActiveSheet(xSpreadsheet);
              return xSpreadsheet;
          }


          --------------------------------------------------------------------------------
          3.3  數據的設置
             我們需要使用的有三種類型的數據。在開始之前,我們需要有個方法來獲得對單元格的訪問。這一節的其他輔助性方法也將使用此方法,定義如下:

          public XCell getXCellByPosition(XSpreadsheet xSpreadsheet, int x, int y)
              throws Exception
          {
              return xSpreadsheet.getCellByPosition(x, y);
          }


             首先,我們將要接觸到文本類型的數據,比如說Javalobby文章的標題。對于這種數據,輔助性方法需要電子表對象、列位置、行位置以及數據本身作為參數。

          public void setTextValueOfXCellAtPosition(XSpreadsheet
              xSpreadsheet, int x, int y, String value) throws Exception
          {
              //We first identify the cell we need to work with,
              //using the incoming x and y values:
              XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
              //Next, since we're working with text, we define
              //a text object and a cursor object and insert the received content into the cell:
              XText xText = (com.sun.star.text.XText)UnoRuntime.queryInterface(com.sun.
                  star.text.XText.class, xCell);
              XTextCursor xTextCursor = xText.createTextCursor();
              xText.insertString(xTextCursor, value, false);
          }

           

             其次,對于數字類型的數據,比如說“Reply”列的數據,輔助性方法要求傳遞double類型的參數:

          public void setNumValueOfXCellAtPosition(XSpreadsheet
              xSpreadsheet, int x, int y, double value) throws Exception
          {
              //First we get the cell identified by the received x and y values:
              XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
              //Then we add the received value to the identified cell:
              xCell.setValue(value);
          }


             最后,盡管Calc的公式是普通的字符串,我們可以使用OpenOffice.org的API所包含的單元格樣式屬性來為單元格設置預定義的“Result”樣式,這主要是針對我們匯總回復總數的計算公式來進行設置:

          public void setFormulaOfXCellAtPosition(XSpreadsheet
              xSpreadsheet, int x, int y, String formula) throws Exception
          {
              //We get the cell defined by the incoming x and y values"
              XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
              //We add a Calc formula to the cell, as received by the helper method:
              xCell.setFormula(formula);
              //We attach a property set to our cell, so that we can define a property:
              XPropertySet xCellProps = (XPropertySet)UnoRuntime.
                  queryInterface(XPropertySet.class, xCell);
              //We set the style of the cell, using a predefined "Result" style,
              //which comes out of the box with the OpenOffic.org API:
              xCellProps.setPropertyValue("CellStyle", "Result");
          }


            3.4  顏色的使用
             下面的代碼將在隨后被使用:

          if (position%2 == 0)
          {
              oooHelper.setColorRow(xSpreadsheet, position, 0xFF9933);
          }


             在ARGB顏色空間中,0xFF9933代表橙色。如果行數是偶數,那么電子表、行數以及橙色會被作為參數傳遞給方法:

          public void setColorRow(XSpreadsheet
              xSpreadsheet, int row, int color) throws Exception
          {
              //First we get the range of cells we want to deal with,
              //which is the whole spreadsheet:
              XCellRange xCellRange = (XCellRange)UnoRuntime.queryInterface
                  ( XCellRange.class, xSpreadsheet );
              //Next, we narrow down our selection further,
              //going from column 0/current row to column 3/current row,
              //which is a whole row from left to right:
              XCellRange xSelectedCells = xCellRange.getCellRangeByPosition(0, row, 3, row);
              //Next, we create a property set and assign it to our selected range:
              XPropertySet xCellProps =
                  (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xSelectedCells);
              //This line sets the color to white, which basically
              //refreshes the row color before we add our new row color:
              xCellProps.setPropertyValue("CellBackColor", new Integer(16777215));
              //This line sets the color to whatever is received,
              //in this case orange:
              xCellProps.setPropertyValue("CellBackColor", new Integer(color));
          }


             如果用戶需要看到“Most Replies”或者“Least Replies”,我們將使用以下代碼進行設置:

          ooHelper.setColorCell(xSpreadsheet, 2, jTable1.getRowCount()+5, 0x008000);


             以下的方法需要電子表、列數、行數以及顏色值作為參數:

          public void setColorCell(XSpreadsheet xSpreadsheet, int column, int row, int color)
              throws Exception
          {
              //First, we select the entire received spreadsheet:
              XCellRange xCellRange = (XCellRange)UnoRuntime.queryInterface( XCellRange.class,
                  xSpreadsheet );
              //From the received spreadsheet, we select a single cell,
              //defined by the row and column received:
              XCellRange xSelectedCells = xCellRange.getCellRangeByPosition(column,
                  row, column, row);
              //We define a property set, an object to contain the cell's properties:
              XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface
                  (XPropertySet.class, xSelectedCells);
              //This line sets the color to white, to refresh the cell:
              xCellProps.setPropertyValue("CellBackColor", new Integer(16777215));
              //This line sets the background color of the cell to whatever is received:
              xCellProps.setPropertyValue("CellBackColor", new Integer(color));
          }

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/mrdangdong/archive/2009/01/08/3733421.aspx

          posted @ 2010-05-31 08:40 Eric_jiang 閱讀(1516) | 評論 (0)編輯 收藏

          當我們在JavaScript中,要執行一 個函數往往都是這樣寫

          function aa(){

              alert("first function");

          };

          aa();

          有人會問能否再簡化呢?答案是肯定的!只要你愿意我們還可以通過括號直 接調用函數

          (function aa(){

              alert("(function)();");

          })();

          當然,也又別的方法,試試在函數前寫上+或 者-吧!

          +function aa(){

              alert("+function();");

          }();

          這是,我們瀏覽器中的代碼應該是這樣的:

          <html>

              <head>

                  <title>JavaScript 高級編程 之 同名函數的執行順序</title>

                  <script language="javascript" type="text/javascript">

                      function aa(){

                          alert("first function");

                      };

                      aa();

                      (function aa(){

                          alert("(function)();");

                      })();

                      +function aa(){

                          alert("+function();");

                      }();

                  </script>

              </head>

              <body>

              </body>

          </html>

          現在讓我們來想一想瀏覽器會出現怎樣的結果?

          坐在后排的那哥們兒舉手了。聽聽他怎么說,他說:

          瀏覽器會按照1.first function 2.(function)(); 3.+function(); 方式執行

          我肯定一定會有很多人這樣回答。好的,你可以坐下了。還是讓我們去看看 執行的結果吧!

          瀏覽器結果: 1.+function(); 2.(function)(); 3.+function(); 真是不可思議,為什么呢?

          難道瀏覽器會認為在函數前面寫+或者-會 讓函數的執行級別更高?事實并非如此!下面我們再寫一個函數,便可以證明這個結論是錯誤的。

          function aa(){

              alert("last function");

          };

          或許,我們還會有帶參的函數需要執行。

          function aa(msg){

              alert(msg);

          }

          aa("hello topcss!");

          好了,我們再去看看瀏覽器是否執行最后一個函數,也就是帶參的函數呢。

          的確,事實正是如此,她執行了最后一個函數。太棒了。

          現在,我們得出了一個結論:

          當我們在一個JavaScript程 序中,同時出現多個同名函數時,瀏覽器會去執行最后一個函數。

          posted @ 2010-05-29 10:44 Eric_jiang 閱讀(770) | 評論 (0)編輯 收藏

          這幾天頻繁的遠程登陸服務器,由于沒有及時注銷或者其他情況,早上再次登陸時系統提示:“終端服務器超出了最大允許連接數”。 

          解決這個現像的辦法很多,如果馬上需要登陸服務器,最easy的方法是: 

          開始-運行-mstsc /console /v: 服務器名或IP或域名:遠程端口: 

          如: mstsc /console /v:222.222.215.222:3389 

          原因:用遠程桌面鏈接登錄到終端服務器時經常會遇到“終端服務器超出最大允許鏈接數”諸如此類錯誤導致無法正常登錄終端服務器,引起該問題的原因在于終端服務的缺省鏈接數為2個鏈接,并且當登錄遠程桌面后如果不是采用注銷方式退出,而是直接關閉遠程桌面窗口,那么實際上會話并沒有釋放掉,而是繼續保留在服務器端,這樣就會占用總的鏈接數,當這個數量達到最大允許值時就會出現上面的提示。 

          五步避免登陸報錯 

          一、用注銷來退出遠程桌面而不是直接關閉窗口 

          打開“控制面板”,雙擊“添加刪除程序”,單擊“添加刪除Windows組件”,“組件”,在Windows組件向導對話框中選中“終端服務” , “下一步”,“應用服務器”,“下一步”,然后按照提示即可改變終端服務的模式。 

          Windows 2000終端服務有2種運行模式: 遠程管理模式和應用程序服務器模式。遠程管理模式允許系統管理員遠程管理服務器,而且只允許2個終端會話同時登錄終端服務器。應用程序服務器模式允許用戶運行一個以上應用程序,允許多個用戶從終端登錄訪問服務器。但是,應用終端服務的用戶必須有終端服務授權,即必須在90天之內在這個域或工作組中設置終端服務授權服務器,否則用戶需刪除應用程序,然后再重新安裝。 

          二、限制已斷開鏈接的會話存在時間 

          1、從終端服務配置中修改 

          運行-Tscc.msc(終端服務配置)-連接-雙擊RDP-Tcp或右擊-屬性-會話-選中第一個的替代用戶設置(O)-結束已斷開的會話[將默認值“從不”改為一個適當的時間,比如30分鐘] 

          2、從組策略修改 

          開始-運行-gpedit.msc-計算機配置-管理模板-windows組件-終端服務-會話 

          右邊窗口選擇 為斷開的會話設置時間限制 -選擇已啟用,選擇一個時間
          三、增加最多鏈接數 

          1、從終端服務配置中修改:運行-Tscc.msc(終端服務配置)-連接-雙擊RDP-Tcp或右擊-屬性,選擇“網卡”選項卡-修改“最大連接數”改成你所需的值,當然這個值不也能太大,否則會占用較多的系統資源。不過這里修改的值好像不起作用,設置成無限制時照樣還是會出現本文所說的情況。 

          2、組策略級別要高于終端服務配置,當啟用組策略后終端服務配置中的相應選項會變成灰色不可修改 

          運行-gpedit.msc-計算機配置-管理模板-Windows組件-終端服務 

          雙擊右邊的“限制連接數量”-選擇“已啟用”-填入允許的最大連接數 

          四、改變遠程終端模式 

          推薦使用: 

          開始-管理工具-終端服務配置-服務器配置-限制每個用戶使用一個會話 

          五、修改本地安全策略 

          控制面板》管理工具》本地安全策略》本地策略》安全選項》 

          1、先找到》Microsoft網絡服務器:在掛起會話之前所需的空閑時間 

          默認為:15分鐘,改為自己所需要的時間(就是登陸后無動作空閑超過多少時間后自動斷開)

          2、然后找到》網絡安全:在超過登錄時間后強制注銷。默認為:已禁用,一定要改為:已啟用
          下面介紹一些mstsc的參數: 

          Mstsc (Microsoft terminal services client) 

          mstsc 與遠程客戶端之間是用Microsoft的遠程桌面協議(Remote Desktop Protocol,簡稱RDP) 連接的,而windows xp的rdp有1個并發數的連接限制。對于每個用戶來說,。rdp 文件在“我的文檔”中是作為隱藏文件存儲的。 

          創建與終端服務器或其他遠程計算機的連接,編輯現有“遠程桌面連接 (。rdp)”配置文件,并將 Windows XP 連接(使用“客戶端連接管理器”創建的連接)遷移到新的 .rdp 文件中。

          mstsc語法 

          mstsc.exe {ConnectionFile /v:server} [/console] [/f] [/w:width /h:height] 

          mstsc.exe /edit“ConnectionFile” 

          mstsc.exe /migrate 

          mstsc參數 

          ConnectionFile 指定用于連接的。rdp 文件的名稱 

          /v:server[;port] 指定要連接的遠程計算機 

          /admin 將連接到會話以管理服務器 

          /f 在全屏幕模式下啟動“遠程桌面”連接 

          /w:width 指定遠程桌面窗口的寬度 

          /h:height 指定遠程桌面窗口的高度 

          /public 在公用模式下運行遠程桌面 

          /span 是遠程計算機的高度和寬度與本地虛擬桌面相匹配,如有必要擴展到多個顯示器。若要擴展到多個顯示器,所有顯示必須具有相同的高度并垂直排列 

          /console 連接到指定 Windows 2000 Server 的控制臺會話 

          /edit 打開指定的 .rdp 文件進行編輯 

          /migrate 將使用“客戶端連接管理器”創建的舊版連接文件遷移到新的 .rdp 連接文件中
          posted @ 2010-05-28 13:43 Eric_jiang 閱讀(280) | 評論 (0)編輯 收藏

          僅列出標題
          共57頁: First 上一頁 49 50 51 52 53 54 55 56 57 下一頁 
          主站蜘蛛池模板: 乐安县| 商丘市| 临湘市| 衡山县| 兴业县| 滨州市| 平塘县| 鹰潭市| 习水县| 乌兰浩特市| 山丹县| 刚察县| 贵溪市| 昂仁县| 拜泉县| 贡嘎县| 达拉特旗| 平顶山市| 岳阳县| 济南市| 洱源县| 合川市| 德江县| 邵东县| 普兰店市| 汽车| 玉田县| 普宁市| 合江县| 调兵山市| 兰坪| 筠连县| 沧州市| 鹤山市| 高清| 永春县| 班戈县| 朝阳区| 日照市| 科尔| 敖汉旗|