aardio + VB 快速开发桌面软件(vb开发桌面程序)

这里说的是 VB6,如果是调用 .NET 建议改用 C# ,aardio 与 C# 混合开发更方便。

VB6 的开发环境在现代操作系统上安装困难,网上有安装教程可以尝试一下(不一定行)。如果不想麻烦,可以下载一个精简版本 VB6 —— 这个至少能跑起一些基本的简单功能,或者可以安装一个 XP的虚拟机来运行 VB6 完整版。

VB6 运行库至今仍然是各版本 Windows 系统自带的系统组件,所以 VB6 可以生成体积极小的执行文件( VC6 也有这个优势 )。

今天我们一起来玩一下 VB6,先用 VB6 写一个控件,步骤如下:

1、打开VB6,选择新建 ActiveX 控件。

2、在工具条里拖一个 Image 控件到默认的用户控件 UserControl1 上面。
3、双击 UserControl1 切换到代码,添加代码如下:

'声明一个普通变量Dim TestPropertyValue As Integer'声明一个事件,在 aardio 中可以响应这个事件,'注意参数加了ByRef表示传址,在 aardio 中就可以修改这这个参数的值Public Event OnImageClick(ByRef TestPropertyValue As Integer)'这是VB6里点了Image图像控件触发的事件Private Sub Image1_Click() '触发 COM 控件的事件( 换句话说就是调用 aardio 中的函数 ) RaiseEvent OnImageClick(TestPropertyValue)End Sub'窗口调整大小触发这个函数,注意 aardio 控件都是非适应缩放的Private Sub UserControl_Resize() Image1.Width = UserControl.Width Image1.Height = UserControl.HeightEnd Sub'定义读属性 TestProperty 的函数,这是带参数的属性Public Property Get TestProperty(Param As Integer) As Integer TestProperty = TestPropertyValue ParamEnd Property'定义写属性 TestProperty 的函数,带参数属性(参数要跟上面一致)Public Property Let TestProperty(Param As Integer, ByVal v As Integer) TestPropertyValue = v - ParamEnd Property'定义写属性 Picture 的函数,参数是一个 IDispatch 接口的 COM 对象Public Property Let Picture(ByVal pic As Variant) Image1.Picture = picEnd Property'定义一个名为 Picture 的函数Public Function Add(ByVal a As Integer, ByVal b As Integer) Add = a bEnd Function

然后在 VB 里点击 IDE 主菜单“文件->生成 *.ocx ” 就可以了。

整体看起来还是非常简单对吧。不过我在 aardio 自带的这个范例里没写注释,因为 VB 使用 ANSI 编码(内部 Unicode 这种文字游戏解决不了实际问题),而现在 ANSI 编码的文件里用中文的话,很多编辑器打开都是乱码,所以我把注释删掉了。

VB 的乱码问题是一个大坑,例如把 ocx 放在简体中文目录下,或者 ocx 本身包含简体中文名,然后在繁体中文系统下打开就会崩溃。

不过没有关系,在 aardio 里我们可以轻松解决这个问题。在 aardio 里加下面的代码加载 VB 控件:

var dll = com.lite.appData("aardiovb6Vb6Control.ocx",$".vb6Vb6Control.ocx")

请注意第@2个参数的路径前有一个$字符,这会将 ocx 的二进制数据编译到代码里,发布后就不需要再带一个 ocx 了,VB的 ocx 并不支持内存加载,所以我们用 com.lite.appData() 函数将其自动复制到 %CommonAppData% 目录下,这个路径是全英文的,自动就解决了 VB6 控件遇到 Unicode 路径崩溃的大难题。

另外,其他需要访问文件路径的地方我们用 aardio 来实现,不用 VB6 干这事,这样就可以避免 VB6 踩到这个坑。

我们再看看我们在 aardio 中怎么创建这个控件:

import com.lite; var dll = com.lite.appData("aardiovb6Vb6Control.ocx",$".vb6Vb6Control.ocx")var vbUserControl = dll.createEmbedEx(winform.static);

非常简单,VB里怎么使用这个控件,在 aardio 里我们就怎么使用。其实我们可以在 dll.createEmbedEx() 的第@2个参数里指定 COM控件的 CLSID,但 VB 这个 CLSID 不好找,很多人是先注册控件再去注册表里查,问题是 VB6现在注册控件会报错失败 —— 不过好在 aardio 可以免注册调用 VB 控件,并且在 aardio 中可以省略 CLSID,aardio 会自己帮你找到正确的 CLSID 。这么贴心 —— 有没有被感动呢?!

上面参数指定的 winform.static 是COM控件宿主窗口(也是COM控件的父窗口),vbUserControl 并不是COM对象,而是 COM对象的容器,vbUserControl._object 才是 COM 对象。

调用 COM 对象的时候需要写 vbUserControl._object.xxxx () 是不是很吃力呢?!其实我们在 aardio 中通常不会这么写,vbUserControl 通常会添加大量的封装函数,通过这些函数再去访问 vbUserControl._object ,这样 vbUserControl 就成为了一个代理对象,这种好处是非常多的,一个最典型的例子就是标准库的 web.form 或者 com.flash。

但如果我们不想去过多的封装,只想直接使用 COM 对象呢?!一个非常简单的方法是这样写:

var comObject = vbUserControl._object

然后使用这个 comObject 就行了,不过能不能不写这句代码呢?!其实也是可以的,这就是我使用 dll.createEmbedEx() 而非 dll.createEmbed() 的原因了,这两个函数作用相同,但带 Ex 后缀的 dll.createEmbedEx() 多了一个功能,他返回的控件容器对象已经自动实现了一个简单的 COM 控件代理 —— 例如上面访问 vbUserControl 对象的成员就会自动转为调用 vbUserControl._object 的成员,等于将COM控件容器与 COM对象合二为一了。

控件容器对象还可以作为默认的事件监听器,记得我们前面 VB 代码中用 RaiseEvent OnImageClick(TestPropertyValue) 触发事件吗?在 aardio 代码中我们可以如下响应这个事件:

//控件容器也是默认的 COM 事件监听器,如下直接指定响应 COM 事件的函数vbUserControl.OnImageClick = function(value){ winform.edit.print("VB控件里点击了图像,事件参数:" value) //VB里这个事件的参数声明为 ByRef,所以添加返回值可以修改参数 return 100}

VB6 里这个事件的参数指定为 ByRef 传址,也就是说参数 value 是一个引用参数,在 aardio 中可以修改他的值,aardio 基于纯函数原则不会直接修改外部参数的值,而是通过增加返回值修改引用参数的值。这个事件函数没有返回值,也只有一个需要输出值的引用参数,所以增加一个返回值就可以了。

这个示例是用 VB 显示图像,我们就不要用 VB 来加载图像了,如果图像路径有中文或 Unicode 字符又不太好,但 aardio 是 UTF8 内核,没有这些问题,所以我们用 com.picture.loadObject( "~codes范例程序D) 图形图像.gdip.jpg" ) 加载图像再传给 VB, com.pictrue 的函数创建的都是 IPicture 对象,这是与 VB 兼容的,但我们通过 COM 接口不能传原生的 IPicture 过去,我们要用 com.picture.loadObject() 函数,右键点这个函数跳转到定义,看一下源代码你就明白了:

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

其实就是调用 com.pictrue.load() 加载图像,再用 com.QueryObject() 转换为 COM 对象( IDispatch 接口 ) ,然后就可以传给 VB了:

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

反正我在繁体系统下测试 VB控件直接加载上面的图像会出问题,但用上面的方法 —— 用 aardio 加载图像再传给 VB6 就完美解决。

至于调用 VB 函数这个很简单:

//调用 VB 函数var c = vbUserControl.Add(2,3);


VB有一个比较有特色的参数化属性,例如看到这种写法是不是蒙了:

vbUserControl.TestProperty(2) = 123

千万别以为是给函数的返回值赋值,我们把上面的参数化属性赋值转换为 等价的 aardio 代码如下:

//修改VB控件的参数化属性,加上 set 前缀以函数形式调用vbUserControl.setTestProperty(2,123)

在 aardio 里给属性加上 set 前缀就可以变成一个写属性的函数,当然也就支持多个参数了。同理,加上 get 前缀可以变成一个读属性函数,如下:

/*带多个参数的属性加上get前缀并以函数形式调用,例如:*/var testProperty = vbUserControl.getTestProperty(2);

好吧下面我们看这个范例的完整 aardio 源码,直接复制就可以运行,直接复制就是一个独立的、完整的程序:

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("aardiovb6Vb6Control.ocx" ,$"~codes范例程序2) 调用其他语言F) VB.vb6Vb6Control.ocx"); var vbUserControl = dll.createEmbedEx(winform.static); //控件容器也是默认的 COM 事件监听器vbUserControl.OnImageClick = function(value){ winform.edit.print("VB控件里点击了图像,事件参数:" value); return 100;}//修改VB控件的属性vbUserControl.Picture = com.picture.loadObject( "~codes范例程序D) 图形图像.gdip.jpg" )//修改VB控件的参数化属性,加上 set 前缀以函数形式调用vbUserControl.setTestProperty(2,123)//带多个参数的属性加上get前缀并以函数形式调用,例如:var testProperty = vbUserControl.getTestProperty(2);winform.edit.print("VB 控件 TestProperty(2) 属性:",testProperty);//调用 VB 函数var c = vbUserControl.Add(2,3);winform.edit.print("调用 VB 控件函数返回值:",c);winform.edit.print("请点击图像试试");winform.show();win.loopMessage();

最后不得不佩服一下,这个 VB 控件的体积是:24KB,对比一下现在用 Electron 什么的没写几个功能就几百MB是什么概念,这几百MB里有多少是你真正需要的东西?!不是说这些东西没有用,就像豪华大房车一定是有用的,但你明明骑个自行车能解决的问题,非要每次都开豪华大房车吗?!想想这个道理,就会明白 VB6 的好处在哪里。

图还是要补上的:

aardio + VB 快速开发桌面软件(vb开发桌面程序)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年4月28日 上午10:48
下一篇 2023年4月28日 上午10:58

相关推荐

  • 棋牌软件制作开发多少钱

    棋牌软件制作开发多少钱是一个常见的问题,许多人都对此感兴趣。在当前数字化时代,棋牌游戏已经成为人们休闲娱乐的重要方式之一。因此,越来越多的人开始考虑开发自己的棋牌软件。那么,棋牌软…

    科研百科 2023年7月22日
    113
  • 中旅九龙湖项目拖欠工资

    中旅九龙湖项目拖欠工资 最近,中旅九龙湖项目引起了许多人的关注。这个项目位于中国湖北省武汉市洪山区,是一个大型旅游度假村。然而,许多人发现,该项目的工资拖欠问题非常严重。 据一些员…

    科研百科 2024年11月8日
    1
  • 图书管理系统项目体会

    图书管理系统项目体会 在图书管理领域,图书管理系统是一种非常重要的工具,可以帮助图书馆更好地管理图书,提高图书管理的效率和准确性。作为一个参与过图书管理系统项目的人,我深刻地体会到…

    科研百科 6天前
    1
  • 科研项目的预期收益

    科研项目的预期收益 科研项目是推动科学技术发展的重要力量,其预期收益不仅可以提高社会生产力,还可以促进人类文明的进步。在科研项目中,预期收益是项目参与者共同的目标和动力。 科研项目…

    科研百科 2025年4月16日
    0
  • 医院管理系统项目干系人

    医院管理系统项目干系人的重要性 医院管理系统是一种用于管理医院内部业务流程的软件系统。对于医院来说,一个好的医院管理系统可以提高医院的工作效率,减少人工操作的错误,提高医疗服务的质…

    科研百科 2025年1月10日
    0
  • 关于加强财政内部控制工作的若干意见(关于加强财政内部控制工作的若干意见的通知)

    财监[2015]86号 各省、自治区、直辖市、计划单列市财政厅(局、委员会),新疆生产建设兵团财务局: 为深入贯彻落实党的十八大、十八届三中、四中、五中全会精神和财政部党组关于在财…

    科研百科 2024年1月18日
    151
  • 新年信息系统项目管理

    新年信息系统项目管理 随着新年的钟声敲响,我们迎来了新的一年。作为信息技术领域的从业者,我们的任务更加繁重和紧迫。在这个新的一年里,我们需要做好信息系统项目管理,确保项目的顺利进行…

    科研百科 5天前
    1
  • 国内导师科研项目

    国内的导师科研项目 在国内,导师科研项目是许多研究生和企业研究人员的主要研究平台。这些项目通常由导师组织和指导,旨在解决现实世界的问题和挑战。在国内,导师科研项目的机会很多,因为许…

    科研百科 2025年2月10日
    1
  • 6款良心办公软件,功能强大到离谱,居然还免费(6款良心办公软件,功能强大到离谱,居然还免费使用)

    上次软件推荐文章,评论区好多朋友一起交流使用心得和推荐。 善用工具是个人能力中很重要的一点。 日积月累,你会发现改变的不只是工具,还有思维。 日常工作中的数据分析、项目协作、电脑远…

    科研百科 2023年5月6日
    362
  • 系统集成项目管理并发

    系统集成项目管理并发:挑战与机遇 随着信息技术的不断发展,系统集成项目管理已成为现代项目管理中的一个重要分支。系统集成项目管理是指通过规划和执行系统集成项目,确保项目的成功交付,并…

    科研百科 2025年1月11日
    0