前言
Visual Basic 6 (下文簡寫VB6)易用,簡便,是編程入門首選,雖然是上個世紀的產物,被微軟拋棄,近20年來從未更新過,依然被大家所喜愛。
雖然有好多人以VB6為跳板,轉用其它編程,但對VB6依舊念念不忘,也有好多人一直在使用著VB6。
但是VB6屬于高度封裝型語言,當你很熟悉VB編程后,就會感覺被VB6深深的束縛中,無法施展和自由發揮你應有的編程才華。
如何才能用我們熟悉的VB語言編寫,又能毫無約束的暢快淋漓的進行Windows編程呢,那就是 PowerBASIC(下文簡寫PB) 。
PowerBASIC簡介
美國PowerBASIC公司從1996年來歷經10個版本發展,生成EXE文件小巧精湛,執行效率及高,代碼運行速度超快,完美本地代碼,不依賴運行庫,標準DLL生成,與VB6完美對接......
為什么選擇PowerBASIC?
假如VB6是小學中學,那么大學我們用什么?在眾多的編程工具中,繼承VB語法最好的就是PB了。
1,學習成本很低,與VB6語法相似度達95%以上,可以快速上手,讀完本文你就可以用PB寫軟件了。
2,所寫的DLL與VB6兼容性最好,可以寫DLL擴展VB6寫的軟件,成為VB6副手也是非常有價值的。
3,小巧精湛、綠色環保,性能、速度可以匹敵 C、C++ 等語言,開發效率高等。
必須樹立Windows編程的概念,扭轉VB6帶來的思維模式。
VB6是以控件為中心的概念,其實是VB6的高度封裝,最后都會轉變成Windows編程原始模式,PB直接使用Windows編程原始模式(當然,很多高階編程都是這樣,如 C 語言),所以對處理窗口和控件上與vb6截然不同,想要更深層次了解,請購買Windows編程書籍,雖然書里都是用C介紹,但PB同樣可用。
簡單的說,Windows編程原始模式,就是直接使用API,自己處理消息流程,雖然麻煩,但是全面而又精確控制,使我們做的軟件能達到新的高度。所有的API都可以直接使用,如同自己的函數一樣,API可以查詢微軟的MSDN。
必要的可視化編程環境
vb6是集可視化編程環境和語言為一體的編程工具,而PB只是純語言,只有代碼,當然,高手們喜歡純潔,可以只用PB,而我們則需要一個類似vb6的可視化編程環境,那就是 FireFly 軟件,具體軟件和相關幫助和工具,已經被我打包好,可以進群( Basic編程愛好者 78458582 ) 中下載,后面所有提到的內容都是基于 FireFly 中寫的PB,FireFly 也是一家美國公司開發,給我們快速使用PB帶來了極大的便利,如果沒有它,想從vb6過度到PB,沒個把月的時間學習,休想用PB寫出一個應用來,也可能因原始Win編程太復雜而放棄PB,而有了它,過程只需看我寫的本指引。
對窗口和控件的操作
控件其實也是窗口,我們可以按同一類型考慮,窗口操作,這恐怕是VB6與PB的最大不同,VB6只需要控件名加個點,就可以對窗口屬性修改,獲取窗口的值,VB6在背后要將轉換成WIN消息來處理,而PB是直接使用消息處理,窗口及控件各自有自己的消息,這在微軟的MSDN上可以查到。FireFly 為我們建立了常規控件屬性可視化設置,類似VB6操作,如果用代碼修改,FireFly 建立了函數庫,
常用的都在其中,我們調用函數來修改屬性,其實還有更多的,這就要查微軟的MSDN查了,自己發消息。
VB6用控件名來指定操作什么控件,PB用窗口句柄來區別操作什么控件,就是VB6中的 Me.hWnd ,這就是窗口句柄。
FireFly中有個【句柄和ID】,所有窗口和控件的句柄都在里面,可以直接雙擊,變量名會到代碼處。
函數庫里的函數,可以直接在代碼中調用,生成EXE文件時,只有被使用到的函數才會被編譯到EXE文件,所以我們自己寫的通用函數都加到這里,以后寫軟件就方便多了,又不會增加EXE體積。
例題:VB6> Me.Caption = "我的名稱" PB> FF_Control_SetText( HWND_FORM1, "我的名稱")
VB6> aa=Me.Caption PB>aa=FF_Control_GetText( HWND_FORM1)
顯示窗體 VB6> hwnd=Form1.Show(父窗口對象) PB> hwnd=Form1_Show(父窗口hwnd)
模態顯示 VB6> hwnd=Form1.Show(1,父窗口對象) PB> hwnd=Form1_Show(父窗口hwnd,%TRUE)
關閉窗口 VB6> Unload Form1 PB> FF_CloseForm HWND_FORM1, %FALSE
VB6與PB的代碼語法區別
兩者差別很少,大多數從VB中復制到PB里就可以使用,小部分要稍微調整。PB比VB多了好多函數,數據類型,新增部分查PB幫助,這里只說不同的情況。PB 不能用漢字當變量名和函數名。
函數與過程:
所有的函數和過程,在PB中是全局共享的,VB中是分私有和公有,所以在 Function 和 Sub 前要加東西,PB則不需要。
在VB中,有類模塊、模塊、窗口模塊,因為VB是用“類”來各自包裝它們,而PB沒有任何包裝,大家可以理解為,PB只有一個模塊,所有代碼都處在一個模塊中,不管你新建了多少窗口,多少模塊,都處在同一個中,可以任意調用其中的函數使用。
字符類型:
VB只有 Unicode(每個字符的兩個字節)如 Dim A As String
PB有2種,ANSI(每個字符的一個字節,中文占2字)和Unicode 格式的字符串,如 Dim A As String ,B As wString
平常使用沒區別,但用上 Left(字符)、Instr()、Mid 等 函數時就出問題了,所以VB中的 As String 等同PB中的 As wString
PB中還有與C語言兼容的 DIM C As Asciiz *100 等等,驚喜多多,可以查看PB幫助。
變量聲明:
全局變量,在過程、函數之外用 Global A as Long ,類似VB中的 Public 用法
數組需要 Global A() as Long 然后過程中 ReDim a(10) ,不可以直接 a(10)
可以用 Local a as Long 來替代VB中的 DIM a as long ,因為 Local a,b,c as Long 連續聲明變量類型,但數組只能用 Dim a(10)
Type 中不可以有動態數組,和變長字符串,
常量:
PB中,數字常量用 %aaa=1234 字符常量用 $aaa="ddd" : $$="寬字符"
字符串處理函數:
在PB中,所有返回是字符串的函數,其后必須有個 $ ,如:MID$() Left$ ,而VB是可有可無的。
連接字符串時,VB可以是數字,因為后臺會調用轉換成字符,而PB必須你自己先轉換成字符,如 $a=str$(1234) & "aa"
VB中的 Replace(替換字符)函數,變成PB中更加高效率的語句: Replace "查找字符" With "替換成" In 字符串變量
PB 沒有 Split 函數,需要自己寫一個
Function StrSplit( SourceStr As String, StrArray() As String,delimeter As String) As Long Local nCount As Long If SourceStr = "" Then Function=-1 Exit Function End If ReDim StrArray( ParseCount(SourceStr, delimeter)-1 ) As String Parse SourceStr, StrArray(), delimeter nCount =UBound(StrArray())+1 Function = nCount End Function
日期處理函數:
PB沒有VB中方便的 DateAdd DateDiff FormatDate 的函數,只有一個日期類 Local d1 As IPowerTime ,需要自寫函數,本人以寫好,包含在函數庫中,大家可以查看,里面的實用函數。
類:
VB用“類”包裝了,模塊、類模塊、窗口模塊,還有控件,身為高階編程的PB,當然也有“類”。VB中的類模塊,PB中的類,用法上是一樣的,但PB函數是全局的,所以為了不同于普通函數和過程,及變量聲明,所以用“類”里用到的函數和過程用了其它關鍵詞,更多可查看PB幫助文檔。
Function aaa(a As Dword ,b As Dword ) As Dword Dim Stuff As MyInterface '調用類用方法 Let Stuff = Class "MyClass" Function= Stuff.BumpIt(77) '使用類 End Function Class MyClass Instance Counter As Long '類的全局變量定義 Class Method Create() ' 類被創建時 End Method Class Method Destroy() ' 類被銷毀時 End Method Interface MyInterface Inherit IUnknown ' 繼承的基類 Method BumpIt(Inc As Long) As Long '類的函數 Dim a As Long '函數內的代碼,寫法和普通的一樣 Temp& = Counter + Inc Incr Counter Method = Temp& End Method End Interface End Class
圖標與圖像
先在圖像庫中,加入圖像、圖標,然后各個控件中就可以設置圖標或者圖像了,如果代碼要使用圖像,就用API加載資源,然后畫畫,
這方法是所有WIN編程通用的,可以網上參考C語言。圖像庫還可以加入非圖像文件,可以讀取二進制自己任意處理。
例題:
位圖句柄=LoadImage(app.hInstance,"資源里的名稱", %IMAGE_BITMAP, w, h, %LR_DEFAULTCOLOR)
DrawState hDC,0,0,位圖句柄,0,x,y,w,h,%DST_BITMAP
還有重要一點,PB雖然提供了繪圖函數,但其內部機制不太好,大家都棄用,所以我們直接用API來繪圖,不管任何語言,API是通用的。
事件:
事件都以消息的形式,常用的都在下拉控件中列出,更多的在自定義中,所有非自定義的事件也會出現在自定義里,就是說,所有事件消息都出現在自定義中。
還有特殊函數,控制著軟件全局,一般用不著,但是必要時,特別有用,這樣我們寫軟件的人就能掌控著100%的軟件控制權,任我們自由發輝。
定時器:
VB可以停止定時器控件,PB用API來銷毀 KillTimer( hWndForm,wTimerID ) 重新使用,用新建 SetTimer(m_hWnd,wTimerID,時間,%NULL)
掌握高階編程必要的新東西
指針:
指針這名詞,讓人云里霧里,正規書上所解釋的,讓新手們更加看不懂,我理解為指針就是指向變量在內存中的地址那個針,在VB中,指針就一個作用,獲取變量在內存中位置(內存地址),而PBx中有2個作用。
一:獲取內存地址 VB和PB都有的函數:StrPtr(字符串變量) VarPtr(任意變量) PB中多了一個: CodePtr(函數或過程名稱)
二:盜用別的變量 這是最有意思的事,也是高階編程中必修課,會用后,會產生意想不到的效果。
例題:
dim a as long '被盜用的變量,可以是任意過程,線程,只要是同處一個進程中的變量都可以盜取 dim b as long ptr '要盜用什么變量類型,這里用 long 舉例,也可以是自定義變量 b=VarPtr(a) '盜用 a 變量,當然也可以指定內存中任意地址 '如果直接用 b 變量,不管盜用什么類型,它只是個 長整數 類型,盜用的使用方法為: c=@b '變量前面要加個“@”,使用上和 “a”變量無區別,@b 就是 a 還可以用數組,就是 c=@b[0] ,此時不管“a”是否是數組,如果不是 @b[1] 將是 “a”變量后面內存的內容,使用上要小心, 當然,如果 “a”變量是數組,那是沒問題了。
多線程:
在PB中,使用多線程非常方便,同常編程理念是,將耗時間的代碼處理,交給多線程來處理,避免卡界面,影響用戶體驗。
Function Myaaa() As Long '我的函數 Local hThread,lResult As Dword '線程用的變量 Thread Create MyThread(0) To hThread '創建線程,此時就立即運行線程里的代碼了。 Do '等待線程完成,如果不需要等待完成,可以刪除 DO Thread Status hThread To lResult If lResult&<>&H103 Then Exit Do ' "線程被終止" '線程正常運行時,返回&H103 FF_DoEvents Loop Thread Close hThread To lResult '立即清除線程ID,如果不需要監控線程就立即清除,只是清ID,不會終止線程 End Function '-------------------------------------------------------------------------- Thread Function MyThread (ByVal Taram As Long) As Long '線程 '只能用一個參數,這里,你只能修改線程名和參數名,其它不可以改 線程里的代碼,線程里還可以創建氣他線程,從父線程里,只能傳一個變量,當想要傳更多內容咋辦,那就要用到上面所說的“指針”來盜用變量的方法,被盜者變量千萬不可用過程變量,因為過程結束后,會自動銷毀了變量,此時你使用盜它,軟件就崩潰了, 可以用全局或者自己申請變量空間,用完后,在線程中再銷毀。 End Function
軟件中包含更多幫助
看到此,你就可以用本來VB的知識來寫出軟件來了,但想要進步,使用更多好東西,得到更多新技術,這就要看軟件中提供的大量幫助。
當然,只看了這么點,你只了解冰山一角,還只是停留在VB階段,通過不停的學習,慢慢的你會知道VB提供的東西真的太少太少。
更多軟件使用技巧,代碼例題,可以進QQ群( Basic編程愛好者 78458582 ) 交流。
暫時能想到的就這些,以后想到什么再補充,更多東西請關注本論壇。
主題數 1166 |
帖子數 282 |
精華數 0 |
積分 108974 |
- 聯系勇芳QQ:
1號(370037607)
- 聯系勇芳QQ:
2號(1102028601)
- 聯系勇芳QQ:
3號(1005353918)
- 聯系勇芳QQ:
4號(1091863991)
- 聯系勇芳QQ:
5號(1120916998)
-
勇芳軟件粉絲QQ群
為預防有人惡意破壞,只允許符合特定條件的真粉絲進群