從VB6進階到PowerBASIC的快速指引

  勇芳 2016-10-15 10598

前言

Visual Basic 6 (下文簡寫VB6)易用,簡便,是編程入門首選,雖然是上個世紀的產物,被微軟拋棄,近20年來從未更新過,依然被大家所喜愛。

雖然有好多人以VB6為跳板,轉用其它編程,但對VB6依舊念念不忘,也有好多人一直在使用著VB6。

但是VB6屬于高度封裝型語言,當你很熟悉VB編程后,就會感覺被VB6深深的束縛中,無法施展和自由發揮你應有的編程才華。

如何才能用我們熟悉的VB語言編寫,又能毫無約束的暢快淋漓的進行Windows編程呢,那就是 PowerBASIC(下文簡寫PB) 。

PowerBASIC簡介

QQ截圖20161016192357.png

美國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。

必要的可視化編程環境

QQ截圖20161016192707.png

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 建立了函數庫,

QQ截圖20161016193016.png

常用的都在其中,我們調用函數來修改屬性,其實還有更多的,這就要查微軟的MSDN查了,自己發消息。

VB6用控件名來指定操作什么控件,PB用窗口句柄來區別操作什么控件,就是VB6中的 Me.hWnd ,這就是窗口句柄。

FireFly中有個【句柄和ID】,所有窗口和控件的句柄都在里面,可以直接雙擊,變量名會到代碼處。

QQ截圖20161016193148.png

函數庫里的函數,可以直接在代碼中調用,生成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語言。圖像庫還可以加入非圖像文件,可以讀取二進制自己任意處理。

Image 1.png

例題:

位圖句柄=LoadImage(app.hInstance,"資源里的名稱", %IMAGE_BITMAP, w, h, %LR_DEFAULTCOLOR)

DrawState hDC,0,0,位圖句柄,0,x,y,w,h,%DST_BITMAP

還有重要一點,PB雖然提供了繪圖函數,但其內部機制不太好,大家都棄用,所以我們直接用API來繪圖,不管任何語言,API是通用的。

事件:

Image 2.png

事件都以消息的形式,常用的都在下拉控件中列出,更多的在自定義中,所有非自定義的事件也會出現在自定義里,就是說,所有事件消息都出現在自定義中。

Image 3.png

還有特殊函數,控制著軟件全局,一般用不著,但是必要時,特別有用,這樣我們寫軟件的人就能掌控著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

軟件中包含更多幫助

Image 4.png


看到此,你就可以用本來VB的知識來寫出軟件來了,但想要進步,使用更多好東西,得到更多新技術,這就要看軟件中提供的大量幫助。

當然,只看了這么點,你只了解冰山一角,還只是停留在VB階段,通過不停的學習,慢慢的你會知道VB提供的東西真的太少太少。

更多軟件使用技巧,代碼例題,可以進QQ群( Basic編程愛好者 78458582 ) 交流。 

暫時能想到的就這些,以后想到什么再補充,更多東西請關注本論壇。

因國家互聯網安全管理要求,關閉回帖功能。大家需要留言,請使用【勇芳軟件客服】即時聯系勇芳點此打開->>勇芳軟件客服
返回
聯系勇芳
一个人看的www视频播放中文_2012中文字幕电影_亚洲国产成人高清在线观看_中文字幕天堂最新版在线网