日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

信不信 VB6 還是可以這么利索

 只怕想不到 2021-11-06

VB6 的開發(fā)環(huán)境在現(xiàn)代操作系統(tǒng)上難以直接安裝運行,網(wǎng)上有一些解決方案可以嘗試一下,如果不行可以下載那種精簡版本 VB6 —— 這個至少能跑起基本功能,或者可以安裝一個 XP的虛擬機(jī)來運行 VB6。

但 VB6 編寫的程序兼容性還是能接受的,VB6 運行時至今仍然是各版本 Windows 系統(tǒng)自帶的系統(tǒng)組件,所以 VB6  可以生成體積極小的執(zhí)行文件。而且 VB6 可能是寫 ActiveX 控件操作最簡單的開發(fā)工具。

今天我們一起來玩一下 VB6,先用 VB6 寫一個控件,步驟如下:
1、打開VB6,選擇新建 ActiveX 控件。

2、在工具條里拖一個 Image 控件到默認(rèn)的用戶控件 UserControl1 上面。
3、雙擊 UserControl1 切換到代碼,添加代碼如下:

'聲明一個普通變量Dim TestPropertyValue As Integer
'聲明一個事件,在 aardio 中可以響應(yīng)這個事件,'注意參數(shù)加了ByRef表示傳址,在 aardio 中就可以修改這這個參數(shù)的值Public Event OnImageClick(ByRef TestPropertyValue As Integer)
'這是VB6里點了Image圖像控件觸發(fā)的事件Private Sub Image1_Click()    '觸發(fā) COM 控件的事件( 換句話說就是調(diào)用 aardio 中的函數(shù) ) RaiseEvent OnImageClick(TestPropertyValue)End Sub
'窗口調(diào)整大小觸發(fā)這個函數(shù),注意 aardio 控件都是非適應(yīng)縮放的Private Sub UserControl_Resize() Image1.Width = UserControl.Width Image1.Height = UserControl.HeightEnd Sub
'定義讀屬性 TestProperty 的函數(shù),這是帶參數(shù)的屬性Public Property Get TestProperty(Param As Integer) As Integer TestProperty = TestPropertyValue + ParamEnd Property
'定義寫屬性 TestProperty 的函數(shù),帶參數(shù)屬性(參數(shù)要跟上面一致)Public Property Let TestProperty(Param As Integer, ByVal v As Integer) TestPropertyValue = v - ParamEnd Property
'定義寫屬性 Picture 的函數(shù),參數(shù)是一個 IDispatch 接口的 COM 對象Public Property Let Picture(ByVal pic As Variant) Image1.Picture = picEnd Property
'定義一個名為  Picture 的函數(shù)Public Function Add(ByVal a As Integer, ByVal b As Integer) Add = a + bEnd Function

然后在 VB 里點擊 IDE 主菜單“文件->生成 *.ocx ” 就可以了。
整體看起來還是非常簡單對吧。不過我在 aardio 自帶的這個范例里沒寫注釋,因為 VB 使用 ANSI 編碼(杠VB正宗Unicode解決不了問題),而現(xiàn)在 ANSI 編碼的文件里用中文的話,很多編輯器打開都是亂碼,所以我把注釋刪掉了。

VB的亂碼問題是一個大坑,例如把 ocx 放在簡體中文目錄下,或者ocx 本身包含簡體中文名,然后在繁體中文系統(tǒng)下打開直接就會崩潰。如果包含任何其他 Unicode 字符結(jié)果是一樣,這也是為什么 ANSI 基本已被這個世界淘汰的主要原因。

不過沒有關(guān)系,在 aardio 里我們可以輕松解決這個問題。在 aardio 里加下面的代碼加載 VB 控件:

var dll = com.lite.appData('aardio\vb6\Vb6Control.ocx',$'\.vb6\Vb6Control.ocx')

請注意第@2個參數(shù)的路徑前有一個$字符,這會將 ocx 的二進(jìn)制數(shù)據(jù)編譯到代碼里,發(fā)布后就不需要再帶一個 ocx 了,VB的 ocx 并不支持內(nèi)存加載,所以我們用 com.lite.appData() 函數(shù)將其自動復(fù)制到  %CommonAppData% 目錄下,這個路徑是全英文的,自動就解決了 VB6 控件遇到 Unicode 路徑崩潰的大難題。

另外,其他需要訪問文件路徑的地方我們用 aardio 來實現(xiàn),不用 VB6 干這事,這樣就可以避免 VB6 踩到這個坑。

我們再看看我們在 aardio 中怎么創(chuàng)建這個控件:

import com.lite; var dll = com.lite.appData('aardio\vb6\Vb6Control.ocx',$'\.vb6\Vb6Control.ocx')var vbUserControl = dll.createEmbedEx(winform.static);

非常簡單,VB里怎么使用這個控件,在 aardio 里我們就怎么使用。其實我們可以在 dll.createEmbedEx() 的第@2個參數(shù)里指定 COM控件的 CLSID,但 VB 這個 CLSID 不好找,很多人是先注冊控件再去注冊表里查,問題是 VB6現(xiàn)在注冊控件會報錯失敗 —— 不過好在 aardio 可以免注冊調(diào)用 VB 控件,并且在 aardio 中可以省略 CLSID,aardio 會自己幫你找到正確的 CLSID 。這么貼心 —— 有沒有被感動呢?!

上面參數(shù)指定的 winform.static 是COM控件宿主窗口(也是COM控件的父窗口),vbUserControl 并不是COM對象,而是 COM對象的容器,vbUserControl._object 才是 COM 對象。

調(diào)用 COM 對象的時候需要寫 vbUserControl._object.xxxx () 是不是很吃力呢?!其實我們在 aardio 中通常不會這么寫,vbUserControl 通常會添加大量的封裝函數(shù),通過這些函數(shù)再去訪問 vbUserControl._object ,這樣 vbUserControl 就成為了一個代理對象,這種好處是非常多的,一個最典型的例子就是標(biāo)準(zhǔn)庫的 web.form 或者 com.flash。

但如果我們不想去過多的封裝,只想直接使用 COM 對象呢?!一個非常簡單的方法是這樣寫:

var comObject = vbUserControl._object

然后使用這個 comObject 就行了,不過能不能不寫這句代碼呢?!其實也是可以的,這就是我使用 dll.createEmbedEx() 而非 dll.createEmbed() 的原因了,這兩個函數(shù)作用相同,但帶 Ex 后綴的 dll.createEmbedEx() 多了一個功能,他返回的控件容器對象已經(jīng)自動實現(xiàn)了一個簡單的 COM 控件代理 —— 例如上面訪問 vbUserControl 對象的成員就會自動轉(zhuǎn)為調(diào)用 vbUserControl._object 的成員,等于將COM控件容器與 COM對象合二為一了。

控件容器對象還有一個作用是作為默認(rèn)的事件監(jiān)聽器,記得我們前面的VB代碼中用 RaiseEvent OnImageClick(TestPropertyValue) 觸發(fā)事件嗎?在 aardio 代碼中我們可以如下響應(yīng)這個事件:

//控件容器也是默認(rèn)的 COM 事件監(jiān)聽器,如下直接指定響應(yīng) COM 事件的函數(shù)vbUserControl.OnImageClick = function(value){ winform.edit.print('VB控件里點擊了圖像,事件參數(shù):'+value) //VB里這個事件的參數(shù)聲明為 ByRef,所以添加返回值可以修改參數(shù) return 100}

是否還記得 VB6 里這個事件的參數(shù)指定為 ByRef 傳址,也就是說參數(shù) value 是一個引用參數(shù),在 aardio 中可以修改他的值,aardio 基于純函數(shù)原則不會直接修改外部參數(shù)的值,而是通過增加返回值修改引用參數(shù)的值。這個事件函數(shù)沒有返回值,也只有一個需要輸出值的引用參數(shù),所以增加一個返回值就可以了。

這個示例是用 VB 顯示圖像,我們就不要用 VB 來加載圖像了,如果圖像路徑有中文或 Unicode 字符又不太好,但 aardio 是 UTF8 內(nèi)核,沒有這些問題,所以我們用 com.picture.loadObject( '~\codes\范例程序\D) 圖形圖像\.gdip.jpg' ) 加載圖像再傳給 VB, com.pictrue 的函數(shù)創(chuàng)建的都是 IPicture 對象,這是與 VB 兼容的,但我們通過 COM 接口不能傳原生的 IPicture 過去,我們要用 com.picture.loadObject() 函數(shù),右鍵點這個函數(shù)跳轉(zhuǎn)到定義,看一下源代碼你就明白了:

namespace com.picture{  loadObject = function(path){    return ..com.QueryObject( load(path) );  }     }

其實就是調(diào)用 com.pictrue.load() 加載圖像,再用 com.QueryObject() 轉(zhuǎn)換為 COM 對象( IDispatch 接口 ) ,然后就可以傳給 VB了:

//修改VB控件的屬性vbUserControl.Picture = com.picture.loadObject( '~\codes\范例程序\D) 圖形圖像\.gdip.jpg' )

反正我在繁體系統(tǒng)下測試 VB控件直接加載上面的圖像會出問題,但用上面的方法 —— 用 aardio 加載圖像再傳給 VB6 就完美解決。

至于調(diào)用 VB 函數(shù)這個很簡單:

//調(diào)用 VB 函數(shù)var c = vbUserControl.Add(2,3);


VB有一個比較有特色的參數(shù)化屬性,例如看到這種寫法是不是蒙了:

vbUserControl.TestProperty(2) = 123

千萬別以為是給函數(shù)的返回值賦值,我們把上面的參數(shù)化屬性賦值轉(zhuǎn)換為 等價的 aardio 代碼如下:

//修改VB控件的參數(shù)化屬性,加上 set 前綴以函數(shù)形式調(diào)用vbUserControl.setTestProperty(2,123)

在 aardio 里給屬性加上 set  前綴就可以變成一個寫屬性的函數(shù),當(dāng)然也就支持多個參數(shù)了。同理,加上 get 前綴可以變成一個讀屬性函數(shù),如下:

/*帶多個參數(shù)的屬性加上get前綴并以函數(shù)形式調(diào)用,例如:*/var testProperty = vbUserControl.getTestProperty(2);

好吧下面我們看這個范例的完整 aardio 源碼,直接復(fù)制就可以運行,直接復(fù)制就是一個獨立的、完整的程序:

import win.ui;/*DSG{{*/var winform = win.form(text='免注冊嵌入 VB 控件';right=706;bottom=274)winform.add(edit={cls='edit';left=356;top=20;right=665;bottom=243;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=2};static={cls='static';text='Static';left=21;top=20;right=330;bottom=243;dl=1;dt=1;transparent=1;z=1})/*}}*/
import com.lite; var dll = com.lite.appData('aardio\vb6\Vb6Control.ocx' ,$'~\codes\范例程序\2) 調(diào)用其他語言\F) VB\.vb6\Vb6Control.ocx'); var vbUserControl = dll.createEmbedEx(winform.static);
//控件容器也是默認(rèn)的 COM 事件監(jiān)聽器vbUserControl.OnImageClick = function(value){ winform.edit.print('VB控件里點擊了圖像,事件參數(shù):'+value); return 100;}
//修改VB控件的屬性vbUserControl.Picture = com.picture.loadObject( '~\codes\范例程序\D) 圖形圖像\.gdip.jpg' )
//修改VB控件的參數(shù)化屬性,加上 set 前綴以函數(shù)形式調(diào)用vbUserControl.setTestProperty(2,123)
//帶多個參數(shù)的屬性加上get前綴并以函數(shù)形式調(diào)用,例如:var testProperty = vbUserControl.getTestProperty(2);winform.edit.print('VB 控件 TestProperty(2) 屬性:',testProperty);
//調(diào)用 VB 函數(shù)var c = vbUserControl.Add(2,3);winform.edit.print('調(diào)用 VB 控件函數(shù)返回值:',c);winform.edit.print('請點擊圖像試試');
winform.show();win.loopMessage();

最后不得不佩服一下,這個 VB 控件的體積是:24KB,對比一下現(xiàn)在用 Electron 什么的沒寫幾個功能就幾百MB是什么概念,這幾百MB里有多少是你真正需要的東西?!不是說這些東西沒有用,就像豪華大房車一定是有用的,但你明明騎個自行車能解決的問題,非要每次都開豪華大房車嗎?!想想這個道理,就會明白 VB6 的好處在哪里。

圖還是要補上的:

圖片

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多