作為一名垃圾級的access菜鳥,如果我們把access當成一個富客戶端,也許我們的心態(tài)會更坦然一些。因為服務端可以用任意語言寫后臺程序,如果你愿意的話,你可用fasctCGI+nignx+vb6寫一個性能同樣很高的后臺程序(注:這樣的程序同樣可以運行在linux上,沒有任何障礙)。
接下來的問題是 在access窗體中顯示網(wǎng)絡圖片。
1、一般我們在access窗體中使用webbrowser用來顯示網(wǎng)絡圖片,webbrowser可以顯示任意常見的網(wǎng)絡圖片,這沒有任何問題。
當然用webbrowser,你要注意一些細節(jié)。但因為webbrowser權重很大,為了顯示圖片,調(diào)用webbrowser是不是有點小題大作了,所以才會萌生尋找一些更輕量的辦法。
2、下面就是在尋找更輕量級的辦法中遇到的幾個注意點,特此記錄一下:
(1)
application.loadpicture 方法,并不支持加載網(wǎng)絡圖片。 (2)使用oleloadpicturePath加載圖片:
模塊中代碼:
Private Declare Function OleLoadPicturePath Lib "oleaut32.dll" (ByVal szURLorPath As Long, ByVal punkCaller As Long, ByVal dwReserved As Long, ByVal clrReserved As OLE_COLOR, ByRef riid As TGUID, ByRef ppvRet As IPicture) As Long
Private Type TGUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
'// 從Internet上加載圖片
'// 使用方法:Picture1.Picture = LoadPic(imgURL),網(wǎng)絡圖片、圖片文件都行
Public Function LoadPic(ByVal strFileName As String) As Picture
Dim IID As TGUID
With IID
.Data1 = &H7BF80980
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
End With
On Error GoTo LocalErr
OleLoadPicturePath StrPtr(strFileName), 0&, 0&, 0&, IID, LoadPic
Exit Function
LocalErr:
Set LoadPic = Application.LoadPicture(strFileName)
Err.Clear
End Function
問題1:
access的image控件的picture居然和stdole.picture接口不一樣 換句話說 me.image0.picture=loadpict("https://……/*.jpg")會無法顯示圖片
我們先暫時在窗體中引用excel的userform中的image控件。因為只要office安裝有vba,form2.0中的控件一定會被安裝帶上。
Me.VBAImage0.Picture = LoadPic("http://a.hiphotos.baidu.com/image/pic/item/0824ab18972bd407bd49abdc77899e510fb30900.jpg") '加載http格式的網(wǎng)絡圖片沒問題
Me.VBAimage1.Picture = LoadPic("https://timg01.bdimg.com/timg?pacompress&imgtype=1&sec=1439619614&autorotate=1&di=1399da507d1400909c73123495953696&quality=90&size=b870_10000&src=http%3A%2F%2Fpic.rmb.bdstatic.com%2F4553873ebf2984969e464de529d44671.jpeg") '加載https格式的網(wǎng)絡圖片沒問題
測試例子:

(3)使用OleloadPicturePath方式加載圖片,顯然是有比較的限制的。比如access的image控件無法顯示,png格式的圖片不支持,在IE臨時文件夾生成緩存圖……,
接下來,我們使用另一種方式。使用xmlhttp控件加載圖片。
在模塊中寫入:
Public Function loadNetpic(ByVal strFilename As String) As Variant
Dim xmlhttp As New MSXML2.ServerXMLHTTP60
With xmlhttp
.Open "get", strFilename, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send
End With
Do While xmlhttp.ReadyState <> 4
DoEvents
Loop
loadNetpic = xmlhttp.responseBody
Set xmlhttp = Nothing
End Function
在窗體中
Me.Image0.PictureData = loadNetpic("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000& sec=1519991491223&di=e1a8deaca7ffddf1ddf23edb79444c17&imgtype=0&src=http%3A%2F%2Fpic35.photophoto.cn%2F20150507%2F0021033804457704_b.png")
'不使用image.picture 直接使用picutreData
'使用png文件沒有任何問題,但不支持顯示gif。
(4)既然涉及到顯示網(wǎng)絡圖片,如果要顯示的網(wǎng)絡圖片很多,自然要考慮異步的多線程