注冊(cè) 登錄
Office中國(guó)論壇/Access中國(guó)論壇 返回首頁(yè)

ganlinlao的個(gè)人空間 http://m.mzhfr.cn/?230471 [收藏] [復(fù)制] [分享] [RSS]

日志

Access邁向Web化第二步:html與winform交互

熱度 2已有 3537 次閱讀2015-12-9 10:37 |個(gè)人分類(lèi):access入門(mén)| 編程語(yǔ)言, 辦不到, 文章, 而且

這篇文章可能會(huì)寫(xiě)很久,很久。
在vba中不要試圖全面控制Webbrowser,因?yàn)槟鞘怯胿ba辦不到,即使能辦到也一定是辦不好的事情。
而且全面控制webbrowser的復(fù)雜度會(huì)大大超出你的意料。
可以說(shuō)在所有使用webbrowser的編程語(yǔ)言中,vba調(diào)用是最簡(jiǎn)便的一種。
html與winform的交互,主要是兩種類(lèi)型的交互。一種是html(js)與vba函數(shù)的互相調(diào)用,一種是html(js)與recordset的數(shù)據(jù)交互
一、html(js)如何與vba函數(shù)互相調(diào)用?
       vba通過(guò)html的dom,可以全面讀寫(xiě)html和js,這是很容易做到的。但html或js如何調(diào)用vba函數(shù)呢?
        主要有兩種方式:
        1、通過(guò)事件,來(lái)通知winform執(zhí)行vba函數(shù)。
             引用microsoft html object libray類(lèi)型庫(kù)      
              Dim WithEvents m_Doc As MSHTML.HTMLDocument
              Private Sub Form_Load()
              Me.WebBrowser1.Navigate2 "http://www.baidu.com"
              End Sub
              Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
            Set m_Doc = Me.WebBrowser1.Document
             End Sub
              Private Function m_Doc_onclick() As Boolean
              Dim elem As IHTMLElement   
             Set elem = m_Doc.parentWindow.event.srcElement
             select case elem.id      '這其實(shí)是一個(gè)事件列表
              case id1
              call  mySub1
              case id2
              call  mysub2
               ……
              end select
            End
            這里重點(diǎn)用到的是Dom的window.event對(duì)象,并且主要是用到srcElement屬性。           
            使用 window.event 對(duì)象,可以捕獲 WebBrowser 眾多的鼠標(biāo)和鍵盤(pán)事件,如鼠標(biāo)坐標(biāo)、按   下了鍵盤(pán)哪個(gè)鍵,以及鍵盤(pán) Ctrl、Alt、Shift 鍵的狀態(tài)、當(dāng)前網(wǎng)頁(yè)元素的ID、索引等等。 
            可以說(shuō)這是VBA與webbrowser交互的唯一簡(jiǎn)便途徑了。
          這種方式的缺點(diǎn):
          (1)、必須為每一個(gè)htm頁(yè)面寫(xiě)特定的事件列表,雖然這當(dāng)中最主要是onclick事件。
          它的抽象度非常差。如果你有什么更好的方式,不妨提出來(lái)討論一下。
          (2)、WebBrowse 控件的 event 對(duì)象只能捕捉主頁(yè)面的有關(guān)事件,對(duì)網(wǎng)頁(yè)包含的內(nèi)嵌網(wǎng)頁(yè)和框架無(wú)能為力。要捕捉內(nèi)嵌網(wǎng)頁(yè)和框架的有關(guān)事件,必須為每個(gè)網(wǎng)頁(yè)定義一個(gè)捕捉事件,但 VBA 的 WithEvents 語(yǔ)句并不支持定義數(shù)組事件。
        這里很容易轉(zhuǎn)換成另一個(gè)問(wèn)題:如何讓withEvents支持collection或數(shù)組?這個(gè)問(wèn)題的答案,能解決的事情范圍變得很大了,如access的mdi問(wèn)題等。

        2、通過(guò)window.external來(lái)調(diào)用vba函數(shù)
       通過(guò)window.external調(diào)用vba函數(shù),其實(shí)是比較理想的方式,所有的ie的activeX插件,幾乎都是通過(guò)這種方式。但 Webbrowser只有在實(shí)現(xiàn)IDocHostUIHandler接口后,window.external才能調(diào)用VBA函數(shù)。
       這在vb6中可以做到,但在access中辦不到,因?yàn)樗仨氁胦lelib.tlb,而access本身沒(méi)有任何編譯功能。( 寫(xiě)到這里,我忍不住想起mde,accde,這種編譯其實(shí)是徹頭徹尾的騙人小把戲)
       很可惜,這種方式只能放棄了。
        表面看起來(lái),似乎缺陷蠻多的,功能有限,但別忘了我們?cè)贏ccess中使用html,并不是想用html來(lái)全面替代winform的功能,因?yàn)檫@不科學(xué),也完全沒(méi)必要。所以還是可以承受的。不要以為用c++,c#、vb.net調(diào)用webbrowser會(huì)更容易,坦白地說(shuō),它們只會(huì)帶來(lái)更多的麻煩和痛不欲生的折磨而已。也不要以為用webkit會(huì)更容易,那是永遠(yuǎn)不可能的。

二、數(shù)據(jù)交互:
    準(zhǔn)備好幾種工具:
   1、 json的vba版解析器
。在html5時(shí)代,不管你見(jiàn)或不見(jiàn),json就在那里,不遠(yuǎn)、不近,
你回避不了。所以了解json格式是必須的,很容易在網(wǎng)絡(luò)上搜到幾十種vb6版或asp版的json解析器。它們都很方便。挑一種符合你使用的,或有人最近兩三年還在維護(hù)的json解析器。
  

發(fā)表評(píng)論 評(píng)論 (4 個(gè)評(píng)論)

回復(fù) roych 2015-12-9 17:00
JavaScript調(diào)用VBA函數(shù)從來(lái)都是一件出力不討好的事情。一方面必須要考慮到IE內(nèi)部的安全機(jī)制,另一方面還需要考慮事件如何被識(shí)別。我現(xiàn)在已經(jīng)放棄這方面的嘗試了。
回復(fù) ganlinlao 2015-12-9 17:37
我現(xiàn)在還沒(méi)很深入進(jìn)去,但個(gè)人估計(jì)javascript調(diào)用vba函數(shù)的場(chǎng)合,應(yīng)該很少的。具體涉及到的情景:
1、點(diǎn)擊提交時(shí),winform要能夠捕獲到submit按鈕被點(diǎn)擊,從而從Html獲取數(shù)據(jù)。
     數(shù)據(jù)驗(yàn)證還是交給js去做。這個(gè)應(yīng)該可以通過(guò)事件冒泡順序來(lái)讓js驗(yàn)證先執(zhí)行。
2、winform應(yīng)該具有獲取xmlhttpRequrest事件的能力。也就是它要開(kāi)始要發(fā)送數(shù)據(jù)時(shí),能夠從dom中獲取它的數(shù)據(jù),解析json數(shù)據(jù),從數(shù)據(jù)庫(kù)查詢(xún)到recordset系列化成json格式推送給xmlhttp。(之所以這樣,是因?yàn)楹芏嗫蚣軙?huì)默認(rèn)通過(guò)xmlhttp來(lái)獲取數(shù)據(jù),這樣可以無(wú)須改動(dòng)框架)這個(gè)是重點(diǎn)要解決的問(wèn)題
3、用html作菜單時(shí),這個(gè)用到vba函數(shù)可能會(huì)多一些。
總體的原則,還是界面處理交給javascript處理,vba只負(fù)責(zé)數(shù)據(jù)接收和推送
回復(fù) admin 2015-12-22 08:29
有一定的前景,但主要是IE現(xiàn)在沒(méi)有了,可能會(huì)受到一定的影響
回復(fù) ganlinlao 2015-12-24 12:28
ie11的前景無(wú)須我們太多關(guān)心,至少在接下來(lái)的10年,它會(huì)一直存在。IE的消失對(duì)c#的沖擊是最大的。很多的c#人不停向微軟追問(wèn)webbrowser問(wèn)題,強(qiáng)烈要求微軟至少要提供Edge的接口。目前微軟的Edge沒(méi)有對(duì)c#、c++提供接口,而是對(duì)內(nèi)部的javascript提供了一個(gè)webview接口。只要edge對(duì)外提供接口,那vba肯定能用得了,畢竟edge還是c++寫(xiě)的?隙〞(huì)有人提供edge的tlb的。

facelist doodle 涂鴉板

您需要登錄后才可以評(píng)論 登錄 | 注冊(cè)

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-13 03:15 , Processed in 0.073454 second(s), 18 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部