从VB6进阶到PowerBASIC的快速指引

  勇芳 2016-10-15 6820

前言

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 变量,不管盗用什么类型,它只是个 长整数 类型,盗用的使用方法为:
[email protected]   '变量前面要加个“@”,使用上和 “a”变量无区别,@b 就是 a
还可以用数组,就是  [email protected][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 ) 交流。 

暂时能想到的就这些,以后想到什么再补充,更多东西请关注本论坛。

最新回复 (2)
    您需要登录后才可以回帖 登录 | 注册
  • 由于VB的局限,我想换这个试试,主要的原因是现在的网站将会逐步淘汰IE,VB的IE控件只能支持到版本IE6的核心,通过外壳可以链接IE11,但是微软对IE只支持到11,以后不会更新IE了,所以彻底堵死了出路,我不知道POWER BASIC或者是free BASIC哪个对谷歌或者是火狐的浏览器支持,就是能够操作网页元素。希望版主能推荐一下,给个例子什么的。

  • winkey88 2017-3-17

    好贴,下载了PB试试~ ~ ~ 

    希望可以多出一点教程~ 

返回