“我們希望你在MS Access中建立一個應用程序,但是我們不希望它看起來像Access。事實上,我們希望它看起來像一個web頁面。。。像一個浏覽器應用程序。”
這可行嗎?你自己判斷。下面是一個截屏,你可以在這裡下載這個應用程序的代碼,我稱之為Something Not Entirely Unlike Access。這個應用程序描述了下面與浏覽器類似的功能:
沒有Access菜單
混合Access 圖標和啟動屏幕
單獨的表格(頁面)界面
自動調整子表格和它們的控制
下一步和上一步按鈕,用於“頁面”導航
開始頁面按鈕,用於將用戶返回他們的“首頁”
構建於WWW web浏覽器頁面內
用於加載新表格/子表格的超鏈接
在應用程序外提供快照形式的報表顯示
如果這些主題中的任何一個吸引了你,那麼請下載這個樣例應用程序並試一試。我並沒打算把它構建為多麼完美的,所以不要給我發反饋告訴我它是多麼粗糙。只是為了這個代碼。。。在這個應用程序裡代碼很豐富。在一篇文章裡沒有辦法全部表述出來,但是我會將它分為幾個部分在將來的文章裡進行描述。但是如果你願意深入代碼的話,你在這裡可以看到所有的。
隱藏Access 內容
你想做的第一件事是刪除使得Access看起來像Access的東西。菜單是第一個要處理的,下面是刪除它的代碼。我將這個代碼放到了我的啟動表格上,我要做的第一件事就是設置這個表格的可見屬性為FALSE並關閉屏幕繪圖(DoCmd.Echo False),以便我在用戶看不到閃爍的情況下進行我的工作。我還將啟動表格最大化,但是這個應用程序的其它方面還有很多工作要做。
Me.Visible=False
DoCmd.EchoFalse
DoCmd.Maximize
DoCmd.ShowToolbar"Web",acToolbarNo
DoCmd.ShowToolbar"MenuBar",acToolbarNo
DoCmd.ShowToolbar"FormVIEw",acToolbarNo
菜單
為了關閉菜單,執行DoCmd.ShowToolbar命令,使用目標工具條或菜單的名稱以及參數acToolbarNo(acToolbarYes,你可能會想到,它是顯示菜單的)。幫助文檔說ShowToolbar 只對工具條起作用,但是我沒有做這個。你如果要自己確認一下,那麼雙擊Welcome 標簽。我添加了執行acToolbarYes選項來顯示“菜單欄”的代碼,它確實控制主菜單欄的可見與否。
圖標和標題
Access內容的下一步是刪除應用程序圖標、應用程序標題和標題欄文本。我使用這個代碼這麼長時間了,我不能確定的說誰開發出來的,但是它大概是從Access web開發者參考網站獲得的。如果不是,我對那些對這個很好且有用的代碼作出貢獻的人們致以歉意。
這個函數和VBA 代碼所做的設置啟動屬性做了相同的事情。舉例來說,如果沒有設置應用程序圖標,那這個屬性就不存在。當你第一次試圖設置它的時候會彈出一個錯誤。應用程序標題也是一樣。如果屬性不存在的話,這個函數將創建它,並設置它為某些預設的值。
它的優點就是當你給這個應用程序指定圖標時,Microsoft Access 主圖標就會消失。還有,如果你不提供應用程序標題的話,它會默認為Microsoft Access 。所以,如果你試圖隱藏所有關於Access 的東西,那麼你需要提供一個標題。
Public Function SetAppPropertIEs() As Boolean
On Error GoTo Err_Handler
Dim strFile As String
Dim strTitle As String
Dim dbs As DAO.Database
Dim prp As DAO.Property
Const cAPP_ICON = "AppIcon"
Const cAPP_TITLE = "APPTitle"
Set dbs = CurrentDb
strFile = CurrentProject.Path & "\dbj.ico"
strTitle = "My Web App"
On Error Resume Next
dbs.PropertIEs(cAPP_ICON) = strFile
If Err.Number = 3270 Then
Err.Clear
Set prp = dbs.CreateProperty(cAPP_ICON, dbText, strFile)
dbs.PropertIEs.Append prp
End If
dbs.PropertIEs(cAPP_TITLE) = strTitle
If Err.Number = 3270 Then
Err.Clear
Set prp = dbs.CreateProperty(cAPP_TITLE, dbText, strTitle)
dbs.PropertIEs.Append prp
End If
Exit_Here:
Set dbs = Nothing
Application.RefreshTitleBar
Exit Function
Err_Handler:
Select Case Err
Case 3270 'Property not found
Case Else
MsgBox Err.Description, vbCritical
End Select
Resume Exit_Here
End Function
狀態條
視覺處理的最後一塊是隱藏狀態條。。。它是在頁面底部的水平狀態信息。現在,如果你想的話,你可以將這個選項保持為打開狀態,因為即便是Internet Explorer也有一個狀態條供你選擇查看,但是我發現將它刪除有助於模糊Accessian 特性並可以使應用程序看起來不那麼像Microsoft Access 程序。你可以使用下面的代碼設置狀態條選項:
Application.SetOption "Show Status Bar", False
這個語法很便利。我用它在代碼裡設置所有的選項,特別是錯誤處理。如果你設置了一些公共常量,你可以根據是誰登錄進來而方便地進行錯誤處理。對於用戶,我設置它為Break In Class Mode或Break on Unhandled,但是當我測試的時候,我希望它是Break On All。設置它的代碼如下:
Public Const cBreakOnAll As Long = 0
Public Const cBreakInClass As Long = 1
Public Const cBreakUnhandled As Long = 2
SetOption "Error Trapping", cBreakOnAll ' cBreakUnhandled
管理“頁面”
這個功能很難在一篇文章裡描述完全,所以我將給你一個概述。為了看起來像是Web浏覽器,這個應用程序需要附加一個與頁面一起加載的主客戶端表格。這需要有一個能夠記住頁面和需要調整部分之間的導航的設備,以便它們能夠占據整個屏幕。
具有子表格的單個表格
這些對象的第一個是通過創建一個用戶曾經真正作為一個表格打開的表格來確認。我調用了我的frmMain,它是啟動表格。所有其它的表格都命名為sfrmXXX或sfrmYYY以標識它們為子表格。(除了彈出表格像frmAbout或frmHelp。)這個主表格包含了一個叫做obJSubform的單獨子表格。每次作出一個數據請求時,無論是要求產品、雇員或訂單,恰當的表格都會加載到這個子表格內,並且一個命令會發送到子表格來調整它的大小以適應可用的空間大小。
加載子表格的代碼內嵌在frmMain 上,它總是保持打開狀態。例如,點擊列表中的客戶(看上面的截屏)會執行這些代碼。首先,調用一個函數來設置CustomerID ,下一行代碼讓主表格加載帶有一個叫做“frmShowCustomer”表格的主要子表格。這個表格在加載的時候執行一個“獲取”CustomerID 的操作,有效地過濾了提供給選定客戶的結果。
SetCustomerID Nz(Me!CustomerID, "")
g_lngResult = Forms!frmMain.LoadMainSubform("frmShowCustomer", True)
導航
維護被訪問的表格列表和重新加載它們的代碼並不是瑣碎的,而是封裝在一個叫做clsNavigation的特定類裡面。這基本上是將來某個文檔中將講述的,不過簡要來說,它做以下事情:
Load 方法創建了一個內存ADO記錄集
AddNavPage方法插入了一個新的nav 記錄到記錄集中
GetNavPage返回了一個特定“頁面”
NavPrevPage和NavNextPage使你在頁面中跳轉
沒有首頁或主頁按鈕的web浏覽器是怎麼完成的呢?它會通過導航控制來處理,我選擇使用一個叫做frmStartPage的表格來管理這個功能。這個表格總是第一個加載,而且重新加載它只要將上面的調用稍稍改一下就可以了,將“frmShowCustomer”替換為“frmStartPage”。順便說一下,這個方法中的第二個選擇是使用布爾值True或False,它決定導航控制是否記錄訪問日志。
嚴格地Web特性
添加一個Web浏覽器
加強所要做的最後一個添加功能設置是使它更加web化。在Access 中有一個定制控制叫做Microsoft Web Browser 控制。加載web頁面的代碼非常非常簡單,你可能都會笑出來。點擊More Tools 圖標導航過去並點擊它,從而將它定位到工具箱,然後將控制重新命名為objWebBrowser並添加這行代碼到任何滿足你需要的事件中去:
Me!objWebBrowser.Navigate "http://www.google.com"
這就是要給你的應用程序添加web形象所要做的所有工作。
超連接
通過將控制的IsHyperlink 屬性設置為Yes從而創建超鏈接。(它是在所有范圍控制的Format標簽下面屬性列表中。)接下來,鎖定控制以用於對Click方法編輯添加代碼,從而使應用程序做某些事情,比如“跳轉”到點擊的記錄。Access 進行格式化文本使得看起來像是超鏈接,甚至給你你在web 頁面上能看到的pointing finger 圖標。非常酷,而且非常做法很簡單。
報表
如果它不是Access,那麼它不能顯示Access 報表,是吧?沒錯,所以,我們使用一個替換處理用於顯示報表。假設報表是在變量sReport中,並且它要輸出到一個叫做sFile的文件中去,下面的代碼將創建並在一個單獨的窗口中打開一個Microsoft Snapshot Report:
DoCmd.OutputTo acOutputReport, sReport, acFormatSNP, sFile, False
Application.FollowHyperlink strFile
正如它所顯示的,這是一個非常簡潔的解決方案。當然,文件是創建在磁盤上,但是現在磁盤空間這麼便宜,而且隨著時間的增長,它會從報表的存檔快照獲得更大的受益。有些東西可以從你的應用程序裡進行管理,它們提供了到先前所創建報表的鏈接。這實在是太棒了!
滿意嗎?
如果上面的描述不夠詳細,在這裡向你道歉。因為沒有時間和空間去將Something Not Entirely Unlike Access應用程序的所有功能描述得更詳細。如果這些功能中的任何一個聽起來是你想添加到你的應用程序中的東西的話,那麼將它下載下來將是一個很好的開始。還有,請繼續關注這個版塊的未來文章,我會詳細地描述更加復雜處理過程的內部工作機制。