用VB将命令行软件Windows化 刘强 |
有很多深受欢迎的软件,如ARJ,UNDISK等都是在DOS环境下以命令行的形式出现的。其特点就是依靠大量的参数和开关变量来实现其丰富的功能。利用Visual Basic可以简单地把此类软件改写成WINDOWS版本,其中大量的开关参数可用菜单、列表框、组合框和复选框等一一映射成图形界面。而命令的调用。可以用VB提供的SHELL函数,其语法为:
shell(命令字符串[,窗口风格])
如以下VB小程序:
Sub Command3D1_Click ()
Dim x
x = Shell("c:\tools\arj.exe a a:\demo c:\demo\*.*")
End Sub
但使用SHELL函数 会出现WINDOWS界面和DOS黑色界面的突然切换,显得不美观。如何解决这个问题呢?使用WINDOWS的API函数WinExec,可以在隐含的窗体中启动应用程序,使命令行程序完全在后台执行。下面给出一例,将ARJ完全WINDOWS化,其效果完全可以乱真。
Sub Command1_Click ( )
Dim cmd As String
Dim hWnd As Integer
cmd = "c:\dos\ARJ.pif " & list1.Text & " -" & LIST2.Text & " " & text2.Text & " " & text1.Text ’list1、list2输入参数,text1,text2输入文件路径
hWnd = WinExec(cmdline, 0) ’参数为0则隐藏窗体
If HWND < 32 Then ’hWin<32则启动应用程序失败
MsgBox "error!"
Exit Sub
End If
While GetModuleUsage(HWND%)
mousepointer = 11 ‘鼠标呈沙漏状
WAIT% = DoEvents()
Wend
mousepointer = 1 ’鼠标复原为箭头
End Sub
在此例中,笔者使用了WINDOWS的PIF编辑器将ARJ.EXE编辑成ARJ.PIF,是因为类似ARJ这样的软件是以全屏方式执行的,而WINEXEC函数只能隐藏以窗体方式运行的程序。在编辑PIF文件时显示方式选择“窗口”,执行方式选择“后台”,这样就解决了上面提到的界面突换的问题。而调用API函数GetModuleUsage以获得应用程序结束的标志,若运行完毕则返回TRUE,若未运行完毕则让出CPU控制权,为运行ARJ提供时机。
这样的小程序完全可以实现命令行软件的WINDOWS化,而且运行起来真假难辨,有兴趣的读者不妨试一试。
|
怎样在VB中控制WORD 李冬梅 马重阳 |
使用VB编程时,有时需要调用Microsoft Word对文字进行编辑、排版及输出。为实现这种调用,可以使用Shell函数、OLE自动化、在包容器中嵌入Word对象等方法。经过试用和比较,总结出了这几种方法的各自特点。
1 使用Shell函数直接调用
语法:Shell (pathname[,windowstyle]).Pathname是指要执行的程序的名字和任何必须的参数或命令行开关,可以包括目录和驱动器名;Windowstyle是执行程序的窗口风格的数字。
使用Shell调用Word比较简单,编程量小,但必须明确指定Word所在路径,这不利于移植,而且,不能对Word进行控制,不利于程序和Word之间的数据交换。
2 使用OLE自动化控制Microsoft Word
2.1 使用方法
(1)Word为OLE自动化提供一种称为“Basic”的对象,要在VB中控制Word ,首先要定义一个引用Word中“Basic”对象的对象变量:Dim Wordobj as Object
(2)将Word 中的“Basic”对象赋给该对象:Set Wordobj=CreateObject("Word.Basic")
(3)可以使用大多数WordBasic语句和函数控制Word或Word文档,使用方法和在Word宏中使用WordBasic指令的方法基本相同。
(4)关闭Word:Set Wordobj =Nothing。
注意:“Basic”对象不支持关闭它自己的一个方法。即若在OLE自动化中关闭了Word,则对象被置为Nothing,便不能再对对象进行操作,程序出错。
2.2 VB指令与WordBasic指令的差异
(1)有一些语句和函数不能使用,包括:控制结构,如While…Wend和If…Then…Else;声明语句,如Dim;定制对话框相关的语句:FileExit语句;要求数组变量作为参数的语句或函数。
(2)也有一些指令使用方法不同。①返回字符串以一个美元符($)结束的WordBasic函数的关键字必须括在方括号中。例如,在WordBasic宏中的GetBookmark$()语句:mark$=GetBookmark$("Address"),若用VB调用,必须这样写mark$=Wordobj.[Ge-tBookmark$]("Address")。②选择一个命令按钮用“True”,不选择用“False”
2.3 对OLE自动化的说明
Word可以为OLE自动化给另一个应用提供对象,但是它不能使用OLE自动化访问其它应用中的对象。例如:VB和Excel可以使用OLE自动化访问Word,但是Word不能使用OLE自动化访问它们。
3 在包容器中嵌入Word对象
在VB中,要访问在包容器中嵌入的Word对象,首先要在项目中插入对象。做法如下:在窗体中插入OLE控件,对象类型选择“MicrosoftWord图片”或“Microsoft Word文档”,再按“确定”。
然后用Object属性访问文档或图片,并使用WordBasic语句和函数作用于它。嵌入的对象必须在可被访问之前被激活,可以使用Action属性激活OLE控件。例如,使用下面指令访问一个嵌入在称为OLE1的OLE控件中的文档:
Dim Wordobj as Object
OLE1.Action =7
Set Wordobj =OLE1.Object.Application. WordBasic
其他方面,使用方法同OLE自动化。使用在包容器中嵌入的Word对象,Word显示的窗口大小、位置与OLE控件定义的大小、位置相同,而且工具栏显示位置与Word脱离。这一点与OLE自动化相比,是个不足。
总之,要想在Microsoft Visual Basic中控制Microsoft Word,最好使用OLE自动化,通过使用WordBasic指令对Word进行全面控制,而且,用户使用起来与使用Microsoft Word一样,非常方便。
|
用VB制作Windows风格安装盘 张嵘 |
使用VB中的“安装大师”(Setup Wizard)可以制作出高水平,标准的“Windows式”安装盘。VB制作安装盘步骤如下:
1、在制作安装盘前必须关闭并退出VB环境,然后执行Setup Wizard。
2、安装开始,要求用户选择项目文件。屏幕中的Project file文本框可键入所要制作安装的应用项目,后缀名为MAK文件,也可按Select MAK file按钮来选择项目文件。
3、选中Next按钮,屏幕显示选择需要在安装盘中包含对应功能的附加文件。
4、按Next按钮,弹出对话框,供用户选择软盘类型及驱动器设置。
5、按Next按钮,屏幕提供选择加入或删除的文件。
6、按Next按钮,Setup Wizard首先检查硬盘中是否有足够的空间存放临时文件,然后进入DOS环境,压缩所需文件,重新调用VB建立Setup.exe文件。
7、屏幕提示将压缩好的程序及文件装入格式化好的空软盘中。
至此,你的安装盘便大功告成,在安装盘中包含了Setup.exe文件和压缩后的项目文件与附加文件以及VBRUN300.DLL文件等。在制作安装盘过程中应注意以下几个问题:
1、VB所提供的Setup Wizard只能制作用VB编写的程序,并且在制作前,应检查项目文件是否包含所有需要用的附加功能,否则制作出的安装盘缺某一个文件,就无法运行程序,还要返工重新制作。
2、所选项目文件中的所有表单文件、程序代码文件都应该存成ASCII文本格式。
3、在步骤2之中,可选择屏幕上的Rebuiled the Project's EXE file检查框,便可自动将MAK文件生成EXE文件。
4、用活Save Template和Open Template按钮。这两个按钮分别用来储存及打开.VBZ文件,由于制造安装盘有许多步骤,.VBZ文件就是用来记录这些步骤的,如果能够读入以前储存的.VBZ文件就可以连续跳到某一步骤去修改,不必每次都从头一步步地设置,可以大大提高效率。
当要用安装盘安装应用程序时,可以在Windows环境下运行Setup.exe文件将软件解压安装在硬盘上。当然,如果你想使你的安装盘具备安装应用程序特定部分的功能,这时,就需要使用VB提供的“安装工具”(Setup Toolkit),它在VB的\Setupkit子目录之中。
|
VB安装程序的汉化 伍涛 |
在用Visual Basic编写好自己的应用软件后,通常需要一个安装程序来安装它。VB本身提供了几种方法,一是使用“应用程序安装向导”(Application Setup Wizard),二是修改VB提供的安装示范程序Setup.EXE(该程序的工程文件及源代码在VB\SETUPKIT\Setup1)子目录下)。
第一种方法生成全是英文提示的安装程序。而如果采用第二种方法,软件开发人员不但可以将全部的安装信息汉化,而且还可以根据自己的需要对此程序进行修改达到特定的目的,例如加密、检查产品序列号等等,因此更为灵活。
在VB3.0中,修改英文提示信息只需要在窗体代码中找到各个字符串,然后将其改为中文就可以了,但是在VB4.0中,源代码中并没有直接使用英文字符串,而是用VB4.0中新提供的字符串资源加载函数LoadRESString将定义在Setup1*.RES(16位版本为Setup116.RES,32位版本为Setup132.RES)中的字符串资源加载到程序中。这样做的最大好处就是当需要对字符串的内容进行改变时,只修改资源文件即可,无需修改程序源代码。因此我们只需要将该资源文件的全部英文字符串修改为中文就能够达到汉化的目的了。
问题在于VB4.0中并没有提代可修改字符串资源文件(*.RES)的程序,为了编辑该文件,我们必须找一个资源编辑器,例如Visual C++中提供的AppStudio或者Borland C++中的RESourcesWorkShop。用资源编辑器将Setup1*.RES文件打开后,用中文替换掉所有的英文信息,然后保存就可以了。在替换中需要注意的是,凡是含有“{Title}”的部分不要改变,因为这一部分用来显示安装标题,它相当于一个变量,对于安装不同的应用程序有不同的内容。
经过对字符串资源文件这样的修改,在运行Setup程序时你就能看到漂亮的中文安装界面了。而你甚至不需要对源代码做任何修改,重新生成EXE文件后,整个汉化过程就全部完成了。
&?编译VB程序时不要自动使用快速代码优化
如果你第一次使用 VB 的本地代码优化选项,你可能会立即尝试选择“优化代码选项”。可是,你知道吗?这样做并不一定保证使你的程序得到最佳性能。
除非你拥有大量内存,不然程序的性能优化一般不会运行很快。因为这将导致程序装载速度缓慢,在内存不足的机器上特别明显,这样“优化代码选项”就可能让你的用户觉得好象比“优化大小选项”还慢。
基于以上原因,你可以考虑用 P 代码编译你的程序,特别是大型的、UI 和数据库加强的程序。本地“优化代码选项”所获得的性能并不一定可以弥补程序增长大小后带来的问题。
要决定你到底适合那种编译方式,请使用 VB 企业版上的 Application Performance Explorer (APE) 。
|
避免装载多份应用程序 |
你的程序可能只支持单一用户,那么怎么来避免多用户同时使用它吗?
你可以利用 App 对象的 PrevInstance 属性来轻易达到你的目的。
我们可以在程序打开时加入以下代码来验证:
If App.PrevInstance Then
MsgBox ("程序已经运行,不能再次装载。"), vbExclamation
Unload Me
End If
|
让VB程序启动快一点 |
是否觉得你的应用程序启动得太慢了?你可以用下面小技巧让你的程序启动起来感觉快一点。
在你的启动窗口的 Form_Load 事件的第一行加入下面一行代码:
Me.Show
VB 在窗口显示前一般先执行 Form_Load 事件中的程序,如果你在 Form_Load 中加入大量代码,就可以导致 VB 执行代码很久而不显示窗口,我们在 Form_Load 事件的第一行强制加入 Me.Show 让窗口先显现出来。这样给人感觉程序运行好象就快了点。
|
显示程序的版本 |
如果你想在程序的“关于……”中显示程序的版本(以标准方式显示:即 x.xx.xxxx),你可以使用以下子程序:
Public Function GetMyVersion() As String
Static strMyVer As String
If strMyVer = "" Then
strMyVer = Trim$(Str$(App.Major)) & "." & Format$(App.Minor, "##00") & "." Format$(App.Revision, "000")
End If
GetMyVersion = strMyVer
End Function
|
在Visual Basic中显示动态运行进度 |
在安装WINDOWS应用程序时,常有状态条来动态显示安装的进度。这种动态显示程序运行进度的方法在WINDOWS许多应用程序中都有应用。这项技术在WINDOWS应用程序开发中有其重要地位。它表示一种过程的指示。WINDOWS规定:当一个操作需2~3秒时,而用户在此操作完成前无法继续操作时,应在不可访问窗口上显示沙漏光标,示意用户等待。若这一操作持续更长的时间,则应使用动态显示的时间指示器。并有完成的进度百分比,暂停、恢复和取消等按钮以及其他提示信息。用Visual Basic实现这一功能是极其简单的,其方法有二。列举如下:
1. 使用图片框Picture Box。
用一简单的循环语句控制图片框的宽度增长,即可显示动态增长过程。可再加一个文本框以显示提示信息。一个简单的示例如下:
Form1: Caption:进度显示器
Picture1: backcolor: RGB(255,0,0)
Width: 1
borderstyle: 0
text1: borderstyle: 0
Sub Form_Load ( )
Picture1.Width = 1
End Sub
Sub Form_Click ( )
For i = 1 To 1000
Text1.Text = Int(i / 10) & " " & "%"
Picture1.Width = i
Next i
End Sub
这样就可获得用百分比表示的进度指示器。
2.使用专业版VB中的三维面板3D Panel Control
首先要用VB菜单中的File—Add File…的命令将Threed.vbx文件从WINDOWS的SYSTEM目录中加到当前工具箱中来,这样你会发现工具箱中出现了一系列的三维工具。其中三维面板3D Panel Control具有动态显示进度的功能。有关此功能的属性有:
FloodColor 设置面板的颜色以区别与背景色;
FloodType 表示动态显示的方式。各参数的意义如下:
0 没有状态条进行显示;
1 面板中将用FloodColor颜色从左到右递增显示变化状态;
2 面板中将用FloodColor颜色从右到左递增显示变化状态;
3 面板中将用FloodColor颜色从上到下显示变化状态;
4 面板中将用FloodColor颜色从下到上显示变化状态;
5 面板中将用FloodColor颜色以圆形从中心向外扩展显示变化状态;
FloodShowPct 设定在状态显示中是否显示百分比的变化。设为TRUE则表示显示百分比。
FloodPercent 设置或返回百分比的数值显示,仅在程序中设置,设计中无效。
下面给出一个简单的例子,当单击按钮时,面板就动态显示百分比变化:
Form1: caption: 进度显示
Command1: caption: 安装
panel3d1: BevelInner = 1
BevelOuter = 2
BevelWidth = 2
ShadowColor = 1
FloodType = 1
FloodShowPct = True
FloodColor = RGB(0, 0, 255)
Sub Form_Load ( )
panel3d1.BevelInner = 1
panel3d1.BevelOuter = 2
panel3d1.BevelWidth = 2
panel3d1.ShadowColor = 1
End Sub
Sub Command1_Click ()
For i = 0 To 100
panel3d1.FloodType = 1
panel3d1.FloodShowPct = True
panel3d1.FloodColor = RGB(0, 0, 255)
panel3d1.FloodPercent = i
Next i
End Sub
这样就生成了一个以百分比显示进度的指示器,其三维界面标准而美观,通过用程序控制三维面板的FloodPercent属性,可以设计出更加符合WINDOWS标准的安装界面,将它应用到自己开发的WINDOWS应用程序中,一定会为自己的应用程序增色不少。
|