VB问题集锦及编程技巧(面向新手,欢迎高手跟帖)
Cooly 2003-04-09 02:53:14 一、sp2、sp3、企业版有何区别
问 请问vb中的sp2、sp3、企业版这三种,各代表什么含义?
答 sp是service pack的缩写。微软每推出一个软件后,都会不定期地推出一些补丁程序,依时间先后称为sp1、sp2等等。后一个sp版本包括前一个版本的全部内容,所以如果你安装了sp3就用不着安装sp2了。sp可以从微软的站点免费下载。vb 5.0的sp下载地址:http://msdn.microsoft.com/vstudio/sp/vs97/。vb 6.0的sp下载地址:http://msdn.microsoft.com/vstudio/sp/default.asp。在service pack的readme文件中介绍了该service pack修改了哪些错误。vb有三个主要版本:学习版、专业版、企业版。企业版是功能最全的版本,当然也是最贵的版本。
------------------------------------
二、api的意义是什么
问 编程中经常碰到api。请问api的意义是什么?如何知道编程中经常用到的窗口句柄、窗口类名等?
答:api是application programming interface(应用编程接口)的缩写,也就是应用程序调用系统功能的接口。windows api主要包括由windows系统定义的函数、消息及与之相关的数据类型。我们使用各种开发工具归根结底都是和api打交道。但是api本身比较难掌握,所以visual basic提供了可视的面向对象的控件,使初学者即使不太了解api,也可以编写windows程序。但是visual basic提供的控件毕竟是有限的,不可能包括api的所有方面,所以一些复杂的功能仍然需要调用api来实现。
------------------------------------
三、api定义中的&h是什么含义
问 现在我看到一些用api函数做的例程,其中有一个语句:public const lvm_first = &h1000 ,该语句中&h1000代表的是什么含义?
答:&h是16进制的表示,比如&h10等于十进制的16。
------------------------------------
四、为何总提示“变量未定义”
问 下面是一个关闭windows的小程序:
option explicit
private declare function exitwindowsex lib “user32” (byval uflags as long, byval dwreserved as long) as long
private sub form_load()
exitwindowsex ewx_force or ewx_logoff or ewx_shutdown, 0
end sub
但编译的时候,总是提示:ewx_force 变量未定义,但ewx_force 是一个参数。这是为何?
答:ewx_force和其他几个参数都是windows api中定义的常数。你使用了option explicit(这是个好习惯,便于发现错误),所以vb发现未定义的符号都会进行提示,这有助于发现拼写错误和遗漏参数定义。你应该从vb的win32api.txt中复制这几个参数的定义。
------------------------------------
五、如何保存图片
问 我在vb的主窗体要装入一幅事先选好的图片,程序运行后我可以在图片上进行修改并保存它,以备以后调用。请问怎样办?
答 你可以把form或picturebox的autodraw属性设为true,进行修改后使用vb的savepicture语句进行存盘。如:
savepicture picture1.picture, “c:\test.bmp”
这种存盘的文件为.bmp文件,颜色数与当前屏幕的色彩数相同。如果你的存盘要求很高,希望控制存盘格式,只能借助于其他控件,比如imageman(http://www.data-tech.com下载)、lead tools(http://www.leadtools.com下载)等等。
------------------------------------
六、“实时错误9下标越界”错误
问 我在为一数组赋值时出现如下错误:“实时错误9——下标越界”。出错的代码如下:
dim inputdata() as single
inputdata(0) = text2(0).text / text2(1).text '入学率
请问为何会出现这种错误?
答 vb在使用数组前必须指定数组的大小。一种办法是在定义时确定大小,如:dim inputdata(10) as single,另一种是采用动态数组。对于你的程序,数组声明部分可以不用修改,而在出错语句前加一句:redim inputdata(10) as single。
------------------------------------
七、如何打开光盘上的数据库
问 我在编一个vb 程序,当程序刻到光盘以后,不能使用,经过检查发现是因为.mdb文件为只读,程序出错:“该数据库文件已经被另外的一个用户以独占的方式打开,您不能访问”。请问各位高手怎么办?可是我用access却可以阅读该数据库(只读)。
答 如果你用data控件使用该数据库,将data控件的readonly属性设为true,将exclusive属性设为true。如果readonly属性为false,则就出现你所见到错误信息。如果不将exclusive属性设为true,将出现can't lock file的错误信息。如果你是使用openrecordset语句打开数据库,exclusive属性对应着dbdenywrite和dbdenyread参数。
------------------------------------
八、怎样避免当前窗口被关闭
问 在按下右上角的关闭键后,怎样避免当前窗口被关闭?
答 在按下关闭键后,会发生form_unload和form_queryunload事件。这两个事件都有个cancel参数,如果在事件处理过程中将其设为true就可以避免窗口被关闭。对于你的问题,form_queryunload事件可能更好些,因为它有一个unloadmode参数可以区分关闭窗口的指令是用户做出的,还是系统做出的,或者是本程序代码产生的。
------------------------------------
九、dll的编程格式问题
问 我是第一次编写activex dll程序,在dll中,我只在类模块中写了一个函数card,编译成dll后,在另外一个程序中调用,在模块中声明:
public declare function card_config lib "c:\test\card.dll" (byval address as integer, byval intermit as integer)
在一个按钮中写如下代码:
c = card_config(12,12)
运行后出现错误:编译activex dll后,调用时出现错误:“实时错误453,找不到dll入口点”望指教。如有可能:请详细告之dll的编程格式。
答 declare语句只能用来调用标准dll,而不能用于调用activex dll,这是你程序出错的原因。vb无法生成标准dll,只能生成activex dll。要调用activex dll,一般通过createobject语句调用,或在集成环境中选择菜单“工程/引用”,在对话框中选择你要调用的activex dll。这样你就可以在程序中使用activex dll中定义的对象或函数。
------------------------------------
十、怎样启动其他应用程序
问 怎样在vb中启动其他windows应用程序,例如记事本?
答 你可以使用vb的shell函数调用其他应用程序。如:
shell“notepad.exe c:\autoexec.bat”
------------------------------------
十一、如何打印 mschart
问 如何打印 mschart 控件中的内容?
答 mschart本身没有打印功能,所以必须先用editcopy将图像放在剪贴板中,然后再打印,如:
mschart1.editcopy
printer.print ″ ″
printer.paintpicture clipboard.getdata(), 0, 0
printer.enddoc
------------------------------------
十二、“can′t find dll entry point”是指什么
问 出现以下错误信息是什么意思?“run-time error '453' can't find dll entry point openprocess in kernel 32 ”,(我有一个定义private declare function openprocess lib “kernel32" (byval dwdesireaccess as long, byval binherithandle as long, byval dwprocessid as long) as long)
答 把openprocess改为openprocess。因为在win 32下,dll中的函数名是区分大小写的。在kernel32中只有openprocess函数,没有openprocess函数。