作为一名垃圾级的access菜鸟,如果我们把access当成一个富客户端,也许我们的心态会更坦然一些。因为服务端可以用任意语言写后台程序,如果你愿意的话,你可用fasctCGI+nignx+vb6写一个性能同样很高的后台程序(注:这样的程序同样可以运行在linux上,没有任何障碍)。
接下来的问题是 在access窗体中显示网络图片。
1、一般我们在access窗体中使用webbrowser用来显示网络图片,webbrowser可以显示任意常见的网络图片,这没有任何问题。
当然用webbrowser,你要注意一些细节。但因为webbrowser权重很大,为了显示图片,调用webbrowser是不是有点小题大作了,所以才会萌生寻找一些更轻量的办法。
2、下面就是在寻找更轻量级的办法中遇到的几个注意点,特此记录一下:
(1)
application.loadpicture 方法,并不支持加载网络图片。 (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),网络图片、图片文件都行
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格式的网络图片没问题
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格式的网络图片没问题
测试例子:
(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)既然涉及到显示网络图片,如果要显示的网络图片很多,自然要考虑异步的多线程